Mit SUM() in VBA
Wenn ich einen Satz von Zellen in einem Arbeitsblatt, das möchte ich hinzufügen bin, kann ich die Formel verwenden:
=SUM(Sheet1!A1:A10)
Dazu in einer sub, die ich benutzen würde:
Sub example1()
Dim r As Range, v As Variant
Set r = Sheets("Sheet1").Range("A1:A10")
v = Application.WorksheetFunction.Sum(r)
End Sub
Wenn, ich möchte jedoch hinzufügen, bis eine einzelne Zelle über viele Arbeitsblätter, verwende ich die Formel:
=SUM(Sheet1:Sheet38!B2)
Im VBA diese Zeile scheitert kläglich, wie beschrieben in der Geben Sie eine Excel-Bereich über die Blätter in VBA:
Sub dural()
v = Application.WorksheetFunction.Sum("Sheet1:Sheet3!B2")
End Sub
Habe ich zwei workarounds. Ich kann die Summe durch 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 mit Evaluate()
:
v = Evaluate("Sum(Sheet1:Sheet3!B2)")
Ist es möglich Application.WorksheetFunction.Sum()
für diese Berechnung, oder sollte ich stick die Schleife?
- Warum nicht
evaluate
? - Ich habe nicht getan, alle von diesem in einer langen Zeit, also werde ich nicht hinzufügen, das als Antwort, bis Sie können es versuchen, aber nicht die müssen Sie auch nutzen:
Set r = Sheets("Sheet1").Range("Sheet1:Sheet3!B2")
tun, und dannSum
aufr
? Oder ähnliches... was auch immer Sie tun müssen, erstellen Sie einen Bereich aus den Blättern. Du bist wahrscheinlich besser dran mit einem Ihrer anderen Ansätze aber. - Ich verwende
Evaluate()
und es funktioniert einwandfrei....aber wenn ich die Berechnung basiert auf einem dynamischen Bereich (auf allen Platten), ist es eine zusätzliche Schritt macht die Zeichenfolge, die ich versorgen mussEvaluate()
- Danke für die Idee, etwas ich kann nicht scheinen, um ein Range-Objekt, das aus Zellen von verschiedenen Blättern.
- Könnten Sie einen benannten Bereich, der den Blatt-Namen, die Sie wollen, dann verwenden Sie diese Formel
=SUMPRODUCT(SUM(INDIRECT("'" & sheetrng & "'!B2")))
wo sheetrng ist der benannte Bereich. Offensichtlich müssen Sie es konvertieren in einen string für die Evaluate-Methode. - danke..........Ich werde darüber nachdenken müssen, wie Sie zu erstellen, dass den Benannten Bereich....................
- Sie können auch zwei versteckte leere Blatt "START" und "Ende" und Buchstütze der Blätter, die Sie wollen. Dann
v = Evaluate("Sum(START:FINISH!B2)")
- Danke für die Anregung.................Es funktioniert gut, da alle Daten der Blätter in der Arbeitsmappe zusammengefasst sind, sowieso.
- Und wie Sie wissen, aber ich werde hier für die Zukunft die Zuschauer, Sie können ersetzen Sie die B2 Teil mit einem Dynamikumfang Referenz. Zum Beispiel, sagen, dass Sie den Bereich, den Sie festlegen möchten, wie eine variable
rng
es wärev = Evaluate("Sum(START:FINISH!" & rng.Address(1,1) & ")")
- DASS ES GENAGELT !!................es behandelt sowohl den dynamischen Bereich und die variable Blätter Problem..............DANKE!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, das Problem mit der worksheetfunction.Summe ist, dass diese Argumente zu bewerten, nicht als string. WorksheetFunction.Summe("Tabelle1!A1:A3") fehlschlägt. Allerdings gelingt dies
Den Bereichen könnte das sein, was Sie mögen.
Müssen Sie die Schleife, um die Berechnung ausführen über alle Blätter, es ist der effizienteste Weg, durch die Blicke der Dinge. Wie oben erwähnt, können Sie jeden Bereich separat statt.
Sich lohnen könnte, konvertieren Bereich Ihre hinzufügen von bis ein Doppelzimmer (oder single, integer, etc), weil manchmal VBA liest die zahlen als text.
v = v + Cdbl(Sheets(i).Range("B2"))
Der Grund, warum Sie Probleme mit
Application.WorksheetFunction.Sum("Sheet1:Sheet3!B2")
ist, weil, wenn Sie geben Sie die Formel in die Excel-range " Tabelle1:Tabelle3!B2' nicht anerkannt werden, die von excel.Verwendung einer
Application.WorksheetFunction
es hat die Arbeit in excel außerhalb von VBA.Hoffe, das hilft.
!
vor dem Doppelpunkt.