web-dev-qa-db-fra.com

Utilisation de SUM () dans VBA

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?

11
Gary's Student

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.

4
mongoose36

J'ai pu le faire fonctionner juste par la ligne:

Cells(x,y) = WorksheetFunction.sum(range(a,b:a,d))
1
L DeFramce

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.

enter image description here

Pour utiliser un Application.WorksheetFunction il doit fonctionner dans Excel en dehors de VBA.

J'espère que ça t'as aidé.

1
Tabias
 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
1
Ganesh Karra