Wie kann ich in VBA Zellen summieren?
Bin absoluter VBA-Neuling! Ich möchte von einem Arbeitsblatt "Tabelle1" jeweils 2 Zellen aus Spalte B summieren und in "Tabelle2" Spalte B anzeigen lassen. Also quasi Tabelle1(B1+B2) in Tabelle2(B1), Tabelle1(B3+B4) in Tabelle2(B2) und so weiter. Wie geht das?
4 Antworten
Zellen kannst Du in zwei Weisen ansprechen:
Range("A1") oder cells(1,1). Bei cells ist zu beachten, dass erst Zeile, dann Spalte genannt wird, quasi andersrum als bei Formeln.
Eine Zelle hat diverse Eigenschaften (Schriftfarbe, Rahmen etc.) - Du möchtest den Wert verändern:
Range("A1").value=... oder cells(1,1).value=...
Um noch das Tabellenblatt zu berücksichtigen:
Sheets("Tabelle2").Range("B2").value=
Zum Rechnen:
Bei nur zwei Zellen kannst Du diese einfach zusammenzählen. Sonst gäbe es noch die Summenfunktion in VBA worksheetfunction.sum
Sheets("Tabelle2").Range("B2").value=sheets("Tabelle1").Range("B3").value+sheets("Tabelle1").Range("B4").value
sheets("Tabelle2").range("B2").value=WorksheetFunction.Sum(Sheets("Tabelle1").Range("B3:B4").Value)
AH! Mal wieder ein Fall, wo gründlich lesen geholfen hätte ... guter Hinweis, das und so weiter habe ich nicht wirklich wahrgenommen.
Wenn es keinen echten Grund gibt für VBA, würde ich dringend die Formellösung von DeeDee empfehlen, da machen Makros nur den üblichen Ärger ohne Mehrwert.
Ja, wenn man das doch mit VBA und mit einer Schleife lösen will, ist eigentlich nur die Frage, wie man den Versatz der Zeilen macht. So sollte es gehen, auch wenn ich irgendwie denke, dass es eleganter sein sollte.
Sub zaehlen()
For i = 1 To 5 'entsprechend erhöhen
Sheets("Tabelle2").Cells(i, 2).Value = Sheets("Tabelle1").Cells(i + i - 1, 2).Value + Sheets("Tabelle1").Cells(i + i, 2).Value
Next
End Sub
Nachdem ich mich jetzt 1 1/2 h mit der Syntax rumgeärgert hab, geb ich jetzt auch noch meinen Senf dazu:
VBA ist sehr unflexibel, so dass ich immer eine Formellösung bevorzuge (Formel in Tabelle2!B1:
=index(Tabelle1!B:B;Zeile(B1)*2-1;0)+index(Tabelle1!B:B;Zeile(B1)*2);0))
und runterziehen soweit nötig. Eine Formel wird auch von zB LibreOffice & Co "verstanden", VBA-Makros nicht.
Wenns aber unbedingt VBA sein muss (zB zum VBA-Lernen) dann diese UdF (ebenfalls in i'einer Tabelle, B1 setzen und runterziehen)
- Public Function SumZweiZeilenZuEiner(Target As Range)
- Application.Volatile
- SumZweiZeilenZuEiner = ActiveWorkbook.Worksheets("Tabelle1").Cells(Target.Row * 2, Target.Column).Value + ActiveWorkbook.Worksheets("Tabelle1").Cells(Target.Row * 2 - 1, Target.Column).Value
- End Function
Die Berechnung jeder einzelnen Funktion dauert allerdings ziemlich lang, was eine Neuberechnung der Datei empfindlich verzögern kann.
Beachte: änderst du den Namen der Funktion, musst Du ihn auch im Inneren der Funktion (Beginn lange Zeile=3.Punkt) anpassen!
Muss es ein Makro sein?
Du kannst auch in Tabelle2, B1 folgende Formel verwenden:
=SUMME(INDIREKT("Tabelle1!B"&ZEILE(A1)*2-1&":B"&ZEILE(A1)*2))
Diese Formel in Spalte B runterkopieren.
Alternativ in B1:
=SUMME(BEREICH.VERSCHIEBEN(Tabelle1!B$1:B$2;ZEILE(A1)*2-2;0))
und ebenfalls runterkopieren.
DH!
Noch alternativer in B1 (:o):
=INDEX(Tabelle1!$B$1:$B$1000;ZEILE(A1)*2)+INDEX(Tabelle1!$B$1:$B$1000;ZEILE(A1)*2-1)
Wenn Du das nicht per Funktion, sondern unbedingt per VBA lösen willst, wäre das hier eine recht simple Lösung:
Sub Summieren()
Dim i As Integer
For i = 1 To 100 Step 2
Sheets("Tabelle2").Cells(Application.WorksheetFunction.RoundUp(i / 2, 0), 2) = Cells(i, 2) + Cells(i + 1, 2)
Next i
End Sub
Das geht aber sicherlich auch eleganter.
So wäre es imho etwas eleganter, aber wohl auch komplizierter:
Sub Summieren2()
Dim Bereich As Range
Dim Zelle As Range
Dim Summe As Double
Set Bereich = ActiveSheet.Range("B1:B100")
For Each Zelle In Bereich
If Zelle.Row Mod 2 = 0 Then
Summe = Zelle.Value + Zelle.Offset(-1, 0).Value
Sheets("Tabelle2").Cells(Zelle.Row / 2, 2) = Summe
End If
Next Zelle
End Sub
Es fehlt aber immer noch z.B. eine Fehlerbehandlung.
Ich nehme an, da muss auch noch eine Schleife drumrum. Wegen
Ansonsten DH!