Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA SummeWenn

VBA SummeWenn
30.06.2022 11:44:55
Thomas
Hallo,
ich würde gerne dynamisch eine SummeWenn in VBA nutzen, im Anhang eine Beispiel Tabelle, die aber immer unterschiedlich viele Zeilen haben kann.
Unten drunter (gelb markiert) sollen dann immer die Summen der jeweiligen Spalte stehen, das wenn bezieht sich immer auf einen String.
Wie kann ich das in VBA abbilden?
Danke
https://www.herber.de/bbs/user/153893.xlsm
Anzeige

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA SummeWenn
30.06.2022 12:57:52
UweD
Hallo
ich würde eine Kombi aus Formel und VBA nehmen

=SUMMEWENN($A$4:$A$14;$C17;D$4:D$14)
wird für dein Beispiel in den Bereich D17:G19 geschrieben und anschliessend in Werte umgewandelt

    Dim iR As Integer
Dim iC As Integer
Dim iLC As Integer
Dim iLR As Integer
Dim iZ1 As Integer, iS1 As Integer, iZE As Integer, iFr
iZ1 = 4 'erste Zeile mit Daten
iS1 = 4 'erste Spalte mit Daten
iFr = 2 'Anzahl freie Zeilen bis Summenbereich
iLR = Cells(Rows.Count, 1).End(xlUp).Row
iLC = Cells(4, Columns.Count).End(xlToLeft).Column
iZE = iLR - 2 'Start Summenbereich
With Cells(iZE, iS1).Resize(3, iLC - iS1 + 1)
'Zählenwenn setzte
.FormulaR1C1 = "=SUMIF(R" & iZ1 & "C1:R" & iZE - iFr - 1 & "C1,RC3,R" & iZ1 & "C:R" & iZE - iFr - 1 & "C)"
'Formel in Wert
.Value = .Value
End With

Anzeige
AW: VBA SummeWenn
01.07.2022 08:45:21
Thomas
Hall Uwe,
der Code funktioniert in der Beispieldatei perfekt, ich bekomme ihn nur nicht in meine original Datei, dürfte daran liegen das ich hier

.FormulaR1C1 = "=SUMIF(R" & iZ1 & "C1:R" & iZE - iFr - 1 & "C1,RC3,R" & iZ1 & "C:R" & iZE - iFr - 1 & "C)"
nicht so ganz durch blicke.
Anbei mal ein screenshot von der original Datei, am beispiel von Spalte D, die geht von D4 bis D538, die Summierung soll jetzt in D545 starten und in D547 (gelb markiert) enden, das zu suchende Kriterium steht in "A546" und im Bereich "B4-B438 (im Beispiel in B538) und das ganze soll dann von Spalte 4 bis 29 und Zeile 545-547 laufen.
Userbild
Danke für die Hilfe
MFG
Anzeige
AW: VBA SummeWenn
01.07.2022 08:59:41
Herbert_Grom
Hallo Thomas,
das dürfte m. E. daran liegen, dass deine Beispieldatei im Layout nicht der Originaldatei entspricht, denn ansonsten funzt Uwe's Code perfekt. Also, wenn du willst, dass wir dir helfen, dann lade deine Originaldatei hoch und ersetze sensible Daten mit Dummy's.
Servus
AW: VBA SummeWenn
01.07.2022 09:22:42
UweD
Hallo
Das liegt daran, dass vorher nur 2 'freie' Zeilen zwischen letztem Datensatz und Beginn Summenbereich waren
Hier sind es jetzt 6
Das kannst du aber hier selbst einstellen.

 iFr = 2 'Anzahl freie Zeilen bis Summenbereich
Was mit aber auffällt:
Hier ist Spalte C im unteren Bereich leer. Wenn das immer so ist, kann ich das Makro unschreiben und die letzte Zeile aus C und die letzte Zeile aus A
für die Abgrenzung verwenden.
Ist das so?
LG UweD
Anzeige
noch was
01.07.2022 09:35:43
UweD
Hallo nochmal
da des Suchtext jetzt in B anstelle C steht, muss hier auch geändert werden
aus Spalte 3 wird 2
.FormulaR1C1 = "=SUMIF(R" & iZ1 & "C1:R" & iZE - iFr - 1 & "C1,RC2,R" & iZ1 & "C:R" & iZE - iFr - 1 & "C)"
LG UweD
Anzeige
AW: noch was
01.07.2022 12:12:01
Thomas
Hi, danke nochmal für die Hilfe, aber die Formel überfordert mich leider etwas, ich hab jetzt nochmal eine Datei gebaut die den gleichen aufbau hat wie die original.
https://www.herber.de/bbs/user/153908.xlsm
MFG
Nachfrage
01.07.2022 13:12:20
UweD
Hallo nochmal
es ist noch nicht klar, wo der zu suchende Text steht.
Die Formel in z.B. D21
- soll den Text, der in B21 steht suchen oder aus B22? oder aus C21 oder C22?
- dann die Formel aus D22
- soll die sich dann auf B22 beziehen ....
- Soll den Text finden in B4: B14 oder in C4:C14?
LG
Anzeige
AW: Nachfrage
01.07.2022 13:28:43
Thomas
Hi,
sorry ich tu mir mit dem erklären wie es funktionieren soll glaub ich etwas schwer, hab grad auch nochmal nachgedacht, vielleicht ist SummeWenn auch garnicht richtig...
In Zeile D21 soll die Summe stehen zu dem zu Suchenden Kriterium aus B22, der Wert aus B22 steht im Suchbereich Spalte B, also in dem Beispiel in B4-B14 (in den gelb markierten Feldern) Wenn dann der Wert gefunden wurde, müsste in D21 die Summe aus D4,D8 und D12 stehen, In D22 dann D5,D9,D13 usw. und dann natürlich für jede Spalte.
Also in dem Beispiel müsste in D21 wenn man davon ausgeht das sowohl in B6,B10,B14 der zu suchende Wert stehen würde, als Ergebnis 377 stehen (D4+D8+D160)
In D22 367 als Summe (D5+D9+D13)
Danke
MFG
Anzeige
AW: noch was
01.07.2022 13:21:17
UweD
So?
 ABCDEFG
1   Text
2   01020304
3   JanFebMrzApr
4 Umsatz InlandText140160140140
5Anderer TextUmsatz ExportAnderer Text140200140140
6 Umsatz SonstigeNoch anderer Text0000
7       
8 Umsatz InlandText77777777
9Anderer TextUmsatz ExportAnderer Text77607777
10 Umsatz SonstigeNoch anderer Text0000
11       
12 Umsatz InlandText16090160160
13Anderer TextUmsatz ExportAnderer Text150150150150
14 Umsatz SonstigeNoch anderer Text-10-10-10-10
15       
16       
17 SummeTextSonst wasSonst wasSonst wasSonst was
18 SummeAnderer TextSonst wasSonst wasSonst wasSonst was
19 SummeNoch anderer TextSonst wasSonst wasSonst wasSonst was
20       
21 Umsatz InlandText377327377377
22 Umsatz ExportAnderer Text367410367367
23 Umsatz SonstigeNoch anderer Text-10-10-10-10

ZelleFormel
D21=SUMMEWENN($B$4:$B$14;$B21;D$4:D$14)

LG UweD
Anzeige
AW: noch was
01.07.2022 13:30:25
Thomas
Ja das sieht glaub ich so aus wie es sein soll, die Ergebnisse passe mal
AW: noch was
01.07.2022 14:02:07
UweD
Ok.
dann so

    Dim iR As Integer
Dim iC As Integer
Dim iLC As Integer
Dim iLR As Integer
Dim iZ1 As Integer, iS1 As Integer, iZE As Integer, iFr, iAnz
iZ1 = 4 'erste Zeile mit Daten
iS1 = 4 'erste Spalte mit Daten
iFr = 6 'Anzahl freie Zeilen bis Summenbereich
iAnz = 3 'Anzahl der Summenzeilen
iLR = Cells(Rows.Count, "B").End(xlUp).Row
iLC = Cells(4, Columns.Count).End(xlToLeft).Column
iZE = iLR - 2 'Start Summenbereich
With Cells(iZE, iS1).Resize(iAnz, iLC - iS1 + 1)
'Zählenwenn setzte
'Beispiel für D21:  =SUMMEWENN($B$4:$B$14;$B21;D$4:D$14)
.FormulaR1C1 = "=SUMIF(R" & iZ1 & "C2:R" & iZE - iFr - 1 & "C2,RC2,R" & iZ1 & "C:R" & iZE - iFr - 1 & "C)"
'Formel in Wert
.Value = .Value
End With
End Sub
LG UweD
Anzeige
AW: noch was
01.07.2022 15:03:02
Thomas
Hallo Uwe,
damit klappt es dann leider garnicht mehr....
Das Suchkriterium wird aus deinem Code auf B21 gesetzt, müsste aber B22 sein, allerdings wird dann trotzdem "falsch" summiert, da dann nicht jede 4 Zeile summiert wird, sondern immer die in der auch das Suchkriterium steht, aber für die D21 z.b. wäre das ja falsch.
Im Anhang die Beispieldatei mit deinem Code, ich hätte in D21 377 erwartet, in D22 367 und in D23 -10 , wie in deinem Screenshot eben auch.
Anzeige
AW: noch was
01.07.2022 15:19:17
UweD
Du hast eben geschrieben, dass das Beispiel so passt.
Jetzt doch nicht.
Jede 4. Zeile... das ist doch egal, wenn der Suchtext entsprechend in Spalte B dort steht
Also ich bin raus und lasse die Frage offen.
LG UweD
AW: VBA SummeWenn
30.06.2022 14:53:15
Herbert_Grom
Hallo,
in welcher Weise soll die Formel dynamisch sein? Zeilen und/oder Spalten einfügen?
Servus
Anzeige
AW: VBA SummeWenn
01.07.2022 08:01:07
Thomas
Hallo Herbert,
in sofern dynamisch, das es sein kann das es mal mehr und mal weniger Zeilen sind, die Spalten Anzahl ist fix.
Nur durch die unterschiedliche Zeilen Anzahl muss die Formel dynamisch sein.
Thomas
;
Anzeige
Anzeige

Infobox / Tutorial

Dynamische SummeWenn-Funktion in VBA


Schritt-für-Schritt-Anleitung

Um die SUMMEWENN-Funktion in VBA dynamisch zu nutzen, kannst du folgende Schritte befolgen:

  1. Öffne deine Excel-Datei und drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Füge ein neues Modul hinzu, indem du mit der rechten Maustaste auf "VBAProject" klickst, dann "Einfügen" und "Modul" auswählst.

  3. Kopiere den folgenden VBA-Code in das Modul:

    Sub DynamischeSummeWenn()
       Dim iR As Integer
       Dim iC As Integer
       Dim iLC As Integer
       Dim iLR As Integer
       Dim iZ1 As Integer, iS1 As Integer, iZE As Integer, iFr As Integer, iAnz As Integer
    
       iZ1 = 4 ' Erste Zeile mit Daten
       iS1 = 4 ' Erste Spalte mit Daten
       iFr = 6 ' Anzahl freie Zeilen bis Summenbereich
       iAnz = 3 ' Anzahl der Summenzeilen
    
       iLR = Cells(Rows.Count, "B").End(xlUp).Row
       iLC = Cells(4, Columns.Count).End(xlToLeft).Column
       iZE = iLR - 2 ' Start Summenbereich
    
       With Cells(iZE, iS1).Resize(iAnz, iLC - iS1 + 1)
           .FormulaR1C1 = "=SUMIF(R" & iZ1 & "C2:R" & iZE - iFr - 1 & "C2,RC2,R" & iZ1 & "C:R" & iZE - iFr - 1 & "C)"
           .Value = .Value ' Formel in Wert umwandeln
       End With
    End Sub
  4. Schließe den VBA-Editor und gehe zurück zu Excel.

  5. Führe das Makro aus, indem du ALT + F8 drückst, das Makro auswählst und auf "Ausführen" klickst.

Dieser Code nutzt die SUMMEWENN-Funktion, um Summen basierend auf einem Suchkriterium zu berechnen. Du kannst die Parameter anpassen, um sie an deine Daten anzupassen.


Häufige Fehler und Lösungen

  • Fehler: "Falsches Ergebnis wird angezeigt"

    • Lösung: Überprüfe, ob die Bereiche in deinem Code mit denen in deinem Arbeitsblatt übereinstimmen. Achte darauf, dass die Suchkriterien korrekt gesetzt sind.
  • Fehler: "Makro läuft nicht"

    • Lösung: Stelle sicher, dass du Makros in Excel aktiviert hast. Gehe zu "Datei" > "Optionen" > "Trust Center" > "Einstellungen für das Trust Center" und aktiviere die Makros.

Alternative Methoden

Falls du nicht VBA verwenden möchtest, kannst du auch einfach die SUMMEWENN-Formel direkt in Excel verwenden:

=SUMMEWENN($B$4:$B$14;B21;D$4:D$14)

Diese Formel kann direkt in eine Zelle eingegeben werden und ist eine einfache Möglichkeit, Summen zu bilden, ohne VBA zu nutzen.


Praktische Beispiele

Hier ist ein einfaches SUMMEWENN-Beispiel, das auf den Daten in einer typischen Excel-Tabelle basiert:

  1. Du hast Daten in den Zellen B4:B14, die verschiedene Kategorien darstellen.
  2. In D4:D14 stehen die Werte, die du summieren möchtest.
  3. In Zelle B21 gibst du das Kriterium ein, nach dem du suchen möchtest.
  4. In D21 kannst du die Formel verwenden:

    =SUMMEWENN($B$4:$B$14;B21;D$4:D$14)

Das Ergebnis zeigt dir die Summe aller Werte aus D4:D14, die mit dem Kriterium in B21 übereinstimmen.


Tipps für Profis

  • Verwende Named Ranges: Um deine Formeln lesbarer zu gestalten, kannst du benannte Bereiche verwenden. Dies vereinfacht die Wartung der Formeln und macht sie verständlicher.

  • Fehlerbehandlung im VBA: Implementiere Fehlerbehandlung in deinem VBA-Code, um sicherzustellen, dass dein Makro auch bei unerwarteten Eingaben robust bleibt.

On Error Resume Next
  • Dynamische Bereiche: Nutze dynamische Bereiche in VBA, um sicherzustellen, dass dein Code auch bei variierenden Datenmengen funktioniert.

FAQ: Häufige Fragen

1. Wie kann ich die Anzahl der Summenzeilen anpassen?
Du kannst die Variable iAnz im VBA-Code ändern, um die Anzahl der Summenzeilen anzupassen.

2. Funktioniert der Code auch in Excel Online?
Der VBA-Code funktioniert nur in der Desktop-Version von Excel. Excel Online unterstützt keine VBA-Makros.

3. Kann ich die SUMMEWENN-Funktion auch in anderen Programmiersprachen verwenden?
Ja, ähnliche Funktionen sind auch in anderen Programmiersprachen wie Python oder R verfügbar, jedoch musst du die Syntax entsprechend anpassen.

4. Was ist der Unterschied zwischen SUMMEWENN und SUMMEWENNS?
SUMMEWENN ermöglicht die Summierung basierend auf einem einzigen Kriterium, während SUMMEWENNS mehrere Kriterien unterstützt.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige