Si j'ai un ensemble de cellules dans une feuille de calcul que je veux ajouter, je peux utiliser la formule:
=SUM(Sheet1!A1:A10)
Pour ce faire dans un sous, j'utiliserais:
Sub example1()
Dim r As Range, v As Variant
Set r = Sheets("Sheet1").Range("A1:A10")
v = Application.WorksheetFunction.Sum(r)
End Sub
Si, cependant, je veux ajouter une seule cellule sur plusieurs feuilles de calcul, j'utilise la formule:
=SUM(Sheet1:Sheet38!B2)
Dans VBA, cette ligne échoue lamentablement, comme expliqué dans Spécifiez une plage Excel entre les feuilles dans VBA :
Sub dural()
v = Application.WorksheetFunction.Sum("Sheet1:Sheet3!B2")
End Sub
J'ai deux solutions de contournement. Je peux la somme en programmant une boucle:
Sub example2()
Dim i As Long
Dim v As Variant
v = 0
For i = 1 To 38
v = v + Sheets(i).Range("B2")
Next i
End Sub
ou en utilisant Evaluate()
:
v = Evaluate("Sum(Sheet1:Sheet3!B2)")
Est-il possible d'utiliser Application.WorksheetFunction.Sum()
pour ce calcul, ou dois-je coller la boucle?
Je crois que le problème avec le worksheetfunction.sum est qu'il a besoin d'arguments pour évaluer la chaîne non. WorksheetFunction.Sum ("Sheet1! A1: A3") échoue également. Cependant, cela réussit
Application.WorksheetFunction.Sum(Sheet1.Range("A1"), Sheet2.Range("A1"))
Les gammes pourraient être ce que vous voulez.
J'ai pu le faire fonctionner juste par la ligne:
Cells(x,y) = WorksheetFunction.sum(range(a,b:a,d))
Vous devez utiliser la boucle pour effectuer le calcul sur toutes les feuilles, c'est le moyen le plus efficace par l'apparence des choses. Comme mentionné ci-dessus, vous pouvez plutôt taper chaque plage séparément.
Cela peut valoir la peine de convertir la plage que vous additionnez en double (ou simple, entier, etc.) car parfois VBA lit les nombres sous forme de texte.
v = v + Cdbl(Sheets(i).Range("B2"))
La raison pour laquelle vous rencontrez des problèmes avec Application.WorksheetFunction.Sum("Sheet1:Sheet3!B2")
est que si vous tapez cette formule dans Excel, la plage 'Sheet1: Sheet3! B2' ne sera pas reconnue par Excel.
Pour utiliser un Application.WorksheetFunction
il doit fonctionner dans Excel en dehors de VBA.
J'espère que ça t'as aidé.
Sub SumWorksheets()
Dim ws As Worksheet
Dim v As Variant
For Each ws In ThisWorkbook.Worksheets
' If ws.Name <> ThisWorkbook.ActiveSheet.Name Then ' (Sum other sheets only)
If ws.Name <> "" Then
Application.DisplayAlerts = False
v = v + ws.Range("B2")
Application.DisplayAlerts = True
End If
Next ws
MsgBox v
End Sub