2016-05-27 11 views
9

Wenn ich eine Reihe von Zellen in einem Arbeitsblatt, die ich hinzufügen will, kann ich die Formel:Mit SUM() in VBA

=SUM(Sheet1!A1:A10) 

Um dies zu tun in einem Unter, würde ich verwenden:

Sub example1() 
    Dim r As Range, v As Variant 

    Set r = Sheets("Sheet1").Range("A1:A10") 
    v = Application.WorksheetFunction.Sum(r) 
End Sub 

Wenn aber ich will eine einzelne Zelle über viele Arbeitsblätter addieren, verwende ich die Formel:

=SUM(Sheet1:Sheet38!B2) 

in VBA diese Linie kläglich versagt, wie erläutert in Specify an Excel range across sheets in VBA:

Sub dural() 
    v = Application.WorksheetFunction.Sum("Sheet1:Sheet3!B2") 
End Sub 

Ich habe zwei Problemumgehungen. Ich kann das die Summe durch die Programmierung einer Schleife:

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 

oder durch Evaluate() mit:

v = Evaluate("Sum(Sheet1:Sheet3!B2)") 

Ist es möglich, Application.WorksheetFunction.Sum() für diese Berechnung zu verwenden, oder sollte ich die Schleife bleiben?

+0

Warum nicht "evaluieren"? – findwindow

+0

Ich habe das schon lange nicht mehr gemacht, also werde ich das nicht als Antwort hinzufügen, bis Sie es versuchen können, aber sollten Sie nicht auch folgendes verwenden: 'Set r = Sheets (" Sheet1 ") .Range ("Sheet1: Sheet3! B2") 'und dann' Sum' auf 'r'? Oder ähnliches ... was immer Sie tun müssen, um aus den Blättern einen Bereich zu erstellen. Es ist jedoch wahrscheinlich besser, einen Ihrer anderen Ansätze zu verwenden. – gmiley

+1

@findwindow Ich benutze 'Evaluate()' und es funktioniert gut .... aber wenn ich basierend auf einem dynamischen Bereich * (gleich auf allen Blättern) * berechnen muss, gibt es einen zusätzlichen Schritt, der die Zeichenfolge muss ich liefern zu 'Evaluate() ' –

Antwort

2

Ich glaube, das Problem mit der WorksheetFunction.sum ist, dass es Argumente benötigt, um nicht Zeichenfolge zu bewerten. WorksheetFunction.Sum ("Sheet1! A1: A3") schlägt ebenfalls fehl. Dies gelingt jedoch

Application.WorksheetFunction.Sum(Sheet1.Range("A1"), Sheet2.Range("A1")) 

Die Bereiche können sein, was auch immer Sie mögen.

+0

............. Vielen Dank ............. –

1

Sie müssen die Schleife verwenden, um die Berechnung über alle Blätter durchzuführen, es ist der effizienteste Weg nach dem Aussehen der Dinge. Wie oben erwähnt, können Sie stattdessen jeden Bereich separat eingeben.

Es könnte sich lohnen, den Bereich zu konvertieren, den Sie zu einem Double addieren (oder Single, Integer usw.), weil VBA manchmal Zahlen als Text liest.

v = v + Cdbl(Sheets(i).Range("B2"))

Der Grund, warum Sie Probleme mit Application.WorksheetFunction.Sum("Sheet1:Sheet3!B2") sind mit, weil, wenn Sie diese Formel in Excel eingeben, Bereich ‚Sheet1: Sheet3 B2‘ wird von Excel nicht erkannt werden.

enter image description here

Um einen Application.WorksheetFunction verwenden Sie es in Excel außerhalb von VBA arbeiten muss.

Hoffe, dass hilft.

+0

Danke! ........................... –

+0

Um fair zu sein, der Bereich im Screenshot hat einen Tippfehler. Es gibt ein zusätzliches '!' Vor dem Doppelpunkt. –