2017-05-09 1 views
0

Vous savez comment lorsque vous copiez des cellules dans Excel d'une cellule à l'autre et la formule remplace automatiquement quelque chose comme =Sum(A1+$B1) à =Sum(C1+$B1)?Comment puis-je prédire l'emplacement de la cellule suivante? (Écriture du Grand Total)

Je me demandais comment réaliser quelque chose de similaire, sauf par programmation.

C'est ce que j'essaie d'atteindre, j'ai une table avec dis, le revenu d'une place pour les lignes et l'élément pour les colonnes, ce sont des données pré-pivotées au cas où vous vous poseriez, et je veux compléter avec un total général, qui est initialement manquant.

Place  | Beans | Buns | Breads | etc 
Bobby's | 550 | 20 |  30 | 10 
Sen's  | 550 | 20 |  30 | 10 
Solaire's | 550 | 20 |  30 | 10 

Maintenant, je vais d'écrire une ligne supplémentaire ci-dessous le dernier, et une colonne supplémentaire à côté du dernier, intitulé [Grand total]. Donc, je suppose que je vais avoir besoin d'une boucle for pour traverser cette dernière rangée que je vais générer. Quelque chose comme ceci:

For (int i = 2; i < numberofColumns; i++) { 
    string query = "=Sum(? : ?)" 
    xlsWorksheet.Cells[ numberofRows + 1 , i].Formula = query; 
} 

Comme vous pouvez le voir, je ne sais pas comment gérer les emplacements de cellules implicites. La partie délicate est que je veux que cet algorithme boucle jusqu'à la fin sans devoir implicitement définir une cellule spécifique. C'est parce que je peux avoir n'importe quel nombre de colonnes supplémentaires, ou n'importe quel nombre de rangées supplémentaires entre les deux. La partie importante est que je devrais créer la ligne et la colonne Grand total.

Un résultat souhaité serait:

Place  | Beans | Buns | Breads | etc | GrandTotal 
Bobby's | 550 | 20 |  30 | 10 |  610 
Sen's  | 550 | 20 |  30 | 10 |  610 
Solaire's | 550 | 20 |  30 | 10 |  610 
      | 1650 | 60 |  90 | 30 |  1830 

À l'heure actuelle, cela se fait en C# cibler un document Excel avec Excel Interop. Je comprends que cela peut également être fait dans les formules VBA ou Excel, donc je vais taguer les deux à ce poste. La formule elle-même fera plus que simplement sommer les lignes, mais je ne peux pas comprendre comment prédire l'emplacement de la cellule suivante.

+0

De la même façon exacte que vous le feriez en VBA: en suivant où vous avez commencé et ce que la dernière ligne et colonne les données sont. BTW 'query' est un nom terrible pour une chaîne contenant une formule' SUM', * en particulier * dans C# où 'query' est un nom couramment utilisé pour un objet' IQueryable '. –

+0

Si vous n'écrivez pas les données vous-même, vous devez "trouver la dernière ligne/colonne dans une plage", et c'est un problème résolu pour lequel vous pouvez facilement trouver une solution. –

+1

Enfin, si vos données sont "pré-pivotées", alors pourquoi n'est-ce pas dans un tableau croisé dynamique, qui peut assez facilement calculer ces totaux pour vous? Exactement ce que signifie «fera plus que simplement additionner les lignes»? Vos exemples (y compris la partie '" = Sum (?:?) "') Impliquent tous une somme directe. –

Répondre

1

est ici une option, je suis sûr que ce n'est pas le plus efficace si:

lCol = Sheets("SheetName").Cells(1, Sheets("SheetName").Columns.Count).End(xlToLeft).Column 
lRow = Sheets("SheetName").Range("A" & Rows.Count).End(xlUp).Row 

Sheets("SheetName").Cells(1, lCol + 1).Value = "Grand Total" 

For i = 2 To lRow 

    Sheets("SheetName").Cells(i, lCol + 1).Formula = "=SUM(RC[-" & lCol - 1 & "]:RC[-1])" 

Next i 

lCol = Sheets("SheetName").Cells(1, Sheets("SheetName").Columns.Count).End(xlToLeft).Column 

For i = 2 To lCol 

    Sheets("SheetName").Cells(lRow + 1, i).Formula = "=SUM(R[-" & lRow - 1 & "]C:R[-1]C)" 

Next i 
+0

Je devrais pouvoir convertir ceci en syntaxe C# et le tester. J'ai oublié le R1C1 pour le nommage des cellules, j'étais coincé sur l'écriture d'un dictionnaire pour les lettres de cellules. – Arvayne

+0

Merci, la notation R1C1 est exactement ce dont j'avais besoin. – Arvayne