Frage von MaityP, 43

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?

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von Ninombre, Community-Experte für Excel, 31

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)

Kommentar von DeeDee07 ,

Ich nehme an, da muss auch noch eine Schleife drumrum. Wegen

und so weiter

Ansonsten DH!

Kommentar von Ninombre ,

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
Kommentar von MaityP ,

Hat geklappt :) 

Muss nur i+i-2 und i+i-3 sein. Vielen Dank!

Kommentar von Ninombre ,

argh - also, es ist gut, dass Du Dich so schnell eingearbeitet hast, um die notwendigen Änderungen direkt vorzunehmen, aber auch ein Zeichen, dass meine Konzentration heute nahe Null ist, weil ich den Text in der Frage auch beim zweiten Mal nicht beachtet habe.

Expertenantwort
von Iamiam, Community-Experte für Excel, 18

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!

Expertenantwort
von Oubyi, Community-Experte für Excel, 21

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.

Kommentar von Oubyi ,

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.

Expertenantwort
von DeeDee07, Community-Experte für Excel, 23

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.

Kommentar von DeeDee07 ,

Alternativ in B1:

=SUMME(BEREICH.VERSCHIEBEN(Tabelle1!B$1:B$2;ZEILE(A1)*2-2;0))

und ebenfalls runterkopieren.

Kommentar von Oubyi ,

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)

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten