Wie kann ich in VBA Zellen summieren?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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)

DeeDee07  30.09.2016, 21:01

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

und so weiter

Ansonsten DH!

0
Ninombre  30.09.2016, 21:26
@DeeDee07

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
2
MaityP 
Fragesteller
 30.09.2016, 21:56
@Ninombre

Hat geklappt :) 

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

0
Ninombre  30.09.2016, 22:50
@MaityP

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.

0

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.

DeeDee07  30.09.2016, 20:23

Alternativ in B1:

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

und ebenfalls runterkopieren.

2
Oubyi, UserMod Light  30.09.2016, 21:29
@DeeDee07

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)
2

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.

Woher ich das weiß:Berufserfahrung – IT-Administrator (i.R.)
Oubyi, UserMod Light  30.09.2016, 21:20

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.

0