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

Forumthread: Automatische Summenbildung per VBA

Automatische Summenbildung per VBA
ChrisW
Hallo Leute,
ich habe ein Problem mit der Programmierung von Summenformeln
Userbild
Die weissen Zellen in Spalte B enthalten die Zahlenwerte, alle farbigen Zellen die in Zeile C stehenden Formeln.
Ich muss automatisch die in Spalte C geschriebenen Formeln erzeugen in der entsprechende Zelle in Spalte B
In die hellhelben Zellen (Colorindex 36) soll die Summe der darunterliegenden weissen Zellen.
In die gelben Zellen (Colorindex 6) die Summe der hellgelben Zellen
In die apricot farbenen Zellen (Colorindex 40) die Summe der Gelben Zellen
usw, aber die Summierung soll nur bis zur nächsten "dunkleren" Farbe gehen.
D.h in der Obersten Zelle steht die Gesamtsumme aller weissen Zellen
Diese Tabelle ist nur ein kleiner Ausschnitt aus einer Tabelle mit 20 Spalten und über 400 Zeilen, und die Anpassung jedes Mal von Hand zumachen ist schon sehr mühselig.
Leider verzweifle ich aber an der Programmierung
Ich habe zu verdeutlichung in Spalte A einen Index eingefügt, damit man sieht was übergeordnet ist.
Ich hoffe Ihr versteht mein Problem und könnt mir helfen
Vielen Dank
Euer Chris
Anzeige
AW: Automatische Summenbildung per VBA
27.08.2009 17:03:04
BoskoBiati
Hallo Chris,
wenn statt der Indizes in A die richtigen Bezeichnungen stünden, wäre es evtl einfacher. Insbesondere die Zeilen mit Sum(b6) oder sum(b17) sind nicht sehr einleuchtend.
AW: Automatische Summenbildung per VBA
27.08.2009 20:08:09
fcs
Hallo Chris,
das ganze sollte sich wesentlich einfacher gestalten lassen, wenn du mit der Summenfunktion innerhalb der
Funktion TEILERGEBNIS bzw. englisch SUBTOTAL arbeitest. Dann wird die Kontrolle der Zeilennummern
für die 6 Hierarchiestufen deiner Tabelle einfacher.
Interessant wäre natürlich auch zu wissen, wie die Ursprungsdaten dieser Zusammenfassung aussehen. Wenn du nicht krampfhaft an die optische Form gebunden bist, dann wäre wahrscheinlich eine Zusammenstellung der Daten als Pivotbericht wesentlich einfacher zu gestalten bzw. man könnte aus dem Pivotbericht mit verhältnismäßig geringem Aufwand die von dir anvisierte Form generieren.
Gruß
Franz
Anzeige
Zustimmung,...
27.08.2009 22:02:16
Luc:-?
...Franz,
habe so etwas mal vor Jahren gemacht, nicht mit (Fkt) Teilergebnis und nicht als Pivot, aber auf der Basis der nur per SQL-Abfrage vorverdichteten Primärdaten. Die komplette Ergebnistabelle wurde dann unterhalb der Primärdaten mithilfe einer Parameterzeile generiert. War etwas aufwendig u.würde ich heute sicher nicht mehr so machen... Die Form von Chris erinnert aber eher an ein Ergebnis der Methode Teilergebnis, aber die "hasse" ich wg ihrer unschönen Auswirkungen auf das TabBlatt...
Pivot-Kreuztab ist wahrscheinl die beste Empfehlung...
Gruß Luc :-?
Anzeige
AW: Zustimmung,...
28.08.2009 08:15:47
ChrisW
Hallo Franz, Luc und Bosco,
Die Tabelle ist ein Auszug aus einer aus SAP gezogenen Kontierungsübersicht mit diversen Unterkontierungen in einer Baumstruktur.
Die weissen Zellen sind die tiefste (Ebene 6) Kontierungsebene, die orange die höchste.
leider habe ich keinen Einfluss auf die Struktur der Daten und zur weiterverarbeitung brauche ich die Kontierungszusammenfassung als Formel.
Hellgelb (Ebene5) ist die Überkontierung zu den weissen direkt unter ihr befindlichen Kontierungen,
Gelb (Ebene4) fasst alle hellgelben Kontierungen zusammen, Apricot (Ebene3) die Gelben, Hellorange(Ebene2) die Apricotfarbenen und Orange(Ebene1) alle Hellorangen.
Mein Hauptproblem sind die ineinander verschachtelten Schleifen (Referenz soll die Farbe der Zellen sein) und die Schreibweise wie ich aus den zurückgegebenen Werten der entsprechenden Zeilennummer die Formel generiere.
Wenn ich die Formeln aufzeichne kommt sowas wie unten dabei heraus (ist nicht genau passend zu meiner Beispieltabelle, aber vom Prinzip):
Range("B5").Select
ActiveCell.FormulaR1C1 = "=SUM(R[1]C)"
Range("B6").Select
ActiveCell.FormulaR1C1 = "=SUM(R[1]C,R[87]C)"
Range("B7").Select
ActiveCell.FormulaR1C1 = _
"=SUM(R[1]C,R[24]C,R[26]C,R[69]C,R[70]C,R[71]C,R[72]C,R[73]C,R[74]C,R[75]C,R[76]C,R[84]C,R[85]C)"
Range("B8").Select
ActiveCell.FormulaR1C1 = _
"=SUM(R[1]C,R[3]C,R[5]C,R[7]C,R[9]C,R[11]C,R[13]C,R[15]C,R[17]C,R[19]C,R[21]C)"
Range("B9").Select
ActiveCell.FormulaR1C1 = "=SUM(R[1]C)"
....
Vielleicht habt Ihr ja eine Teillösung für mich, z.B. wie ich die Formel erstellen kann.
Vielen Dank,
Chris
Anzeige
M.E. reagiert die Fkt Teilergebnis auf unter...
28.08.2009 14:18:26
Luc:-?
...schiedl Schriftstile wie kursiv, fett usw, Chris,
das wäre aber hier nicht optimal, wenn die ganze Struktur mit Lücken für die Summierungsformeln so aus SAP kommt...
Ein Ausfüllen der Lücken per VBA ist zwar mögl, aber dazu müssen einheitl Kriterien existieren, damit das ggf auch verallgemeinert wdn kann; das Vorhandensein einer Lücke bei gleichzeitig vorhandenem Vorspaltentext allein wird wohl nicht reichen, es sei denn, den Oberpositionen desselben (und ihren zugehörigen Unterpositionen) sind irgendwo eindeutige Indizes zugeordnet. Das würde sich relativ einfach darstellen, wenn die Anzahl der Summanden pro Oberbegriff stets gleich wäre. Ist sie das nicht, also stattdessen dynamisch, wird's problematisch — ihre MaxMenge müsste dann explizit aufgeführt wdn und die ggf nicht vorhandenen 0 gesetzt wdn.
Man könnte statt mit (externen) Indizes auch mit Farben arbeiten, aber die müssen dann auch wirklich physisch vorhanden sein. Wenn also entweder Indizes (irgendwo) oder Farben tatsächlich vorhanden sind, ließe sich das lösen, aber wohl eher nicht mit dem MakroRecorder... ;-)
Evtl gäbe es auch eine FmlLösung, die sich an Markierungen in einer Hilfsspalte orientiert. Zumindest die niedrigsten Oberpositionen wären so ermittelbar. Außerdem gibt's noch die xlFkt DBSUMME, die alles summiert, was den gleichen Index hat (wird in separaten Zellen neben bzw oberhalb der Tabelle angegeben). Dazu müsste der aber entsprechend umgestaltet wdn und außerdem Bestandteil der Tabelle sein (evtl ausgeblendet). In der Richtung solltest du mal (alternativ) probieren! Werde das wahrscheinlich auch mal versuchen... ;-)
Gruß Luc :-?
Anzeige
AW: Teilergebnisse, Summe aus Zellfarben
28.08.2009 16:39:02
fcs
Hallo Chris,
hier meine beiden VBA-Lösungen.
Gruß
Franz
Lösung 1 generiert Teilergebnis-Formeln
Option Explicit
'Variablendeklaration
Private ws As Worksheet, lZeile As Long
Private ZeileEnde As Long, ZeileStart As Long, ZeileLetzte As Long
Private Const lSpalteText As Long = 1
Private Const lSpalteFormel As Long = 2
Private Const Zeile_1 As Long = 5 '1. Zeile mit Werten
'Colorindex der zu vergleichenden Farben
Private Const Farbe_1 As Long = 45 'Farbe der obersten Ebene, Ebene 1
Private Const Farbe_2 As Long = 44 'Farbe Ebene 2
Private Const Farbe_3 As Long = 40 'Farbe Ebene 3
Private Const Farbe_4 As Long = 6  'Farbe Ebene 4
Private Const Farbe_5 As Long = 36 'Farbe Ebene 5
Private Const Farbe_6 As Long = 0  'Farbe der untersten Ebene oder ohne Füllfarbe, Ebene 6
Sub TeilergebnisformelnEinfuegen()
'Fügt auf Basis der Zellfarben Teilergebnis-Summenformeln ein
Set ws = ActiveSheet
With ws
ZeileLetzte = .Cells(.Rows.Count, lSpalteText).End(xlUp).Row
End With
'Summenformeln Ebene 5 einfügen
Call TeilErgebnis(Farbe:=Farbe_5)
'Summenformeln Ebene 4 einfügen
Call TeilErgebnis(Farbe:=Farbe_4)
'Summenformeln Ebene 4 einfügen
Call TeilErgebnis(Farbe:=Farbe_3)
'Summenformeln Ebene 4 einfügen
Call TeilErgebnis(Farbe:=Farbe_2)
'Summenformeln Ebene 4 einfügen
Call TeilErgebnis(Farbe:=Farbe_1)
End Sub
Sub TeilErgebnis(Farbe As Long)
'Teilergebnis-Summenformeln bei Farbe einfügen
With ws
ZeileEnde = ZeileLetzte
For lZeile = ZeileLetzte To Zeile_1 Step -1
With .Cells(lZeile, lSpalteFormel)
If .Interior.ColorIndex = Farbe Then
ZeileStart = lZeile + 1
.Formula = "=SUBTOTAL(9,R[1]C[0]:R[" & ZeileEnde - ZeileStart + 1 & "]C[0])"
'Nächste Zelle der Ebene 6 finden
Do Until ws.Cells(lZeile, lSpalteFormel).Interior.ColorIndex = Farbe_6 _
Or ws.Cells(lZeile, lSpalteFormel).Interior.ColorIndex = xlColorIndexNone
lZeile = lZeile - 1
If lZeile 

Lösung 2 generiert Summenformeln mit den Summenzellen der nächsten Unterebene als Parameter.
Option Explicit
'Variablendeklaration
Private ws As Worksheet, lZeile As Long
Private ZeileEnde As Long, ZeileStart As Long, ZeileLetzte As Long
Private Const lSpalteText As Long = 1
Private Const lSpalteFormel As Long = 2
Private Const Zeile_1 As Long = 5 '1. Zeile mit Werten
'Colorindex der zu vergleichenden Farben
Private Const Farbe_1 As Long = 45 'Farbe der obersten Ebene, Ebene 1
Private Const Farbe_2 As Long = 44 'Farbe Ebene 2
Private Const Farbe_3 As Long = 40 'Farbe Ebene 3
Private Const Farbe_4 As Long = 6  'Farbe Ebene 4
Private Const Farbe_5 As Long = 36 'Farbe Ebene 5
Private Const Farbe_6 As Long = 0  'Farbe der untersten Ebene oder ohne Füllfarbe, Ebene 6
Sub SummenformelnEinfuegen()
'Fügt auf Basis der Zellfarben Summenformeln ein
Set ws = ActiveSheet
With ws
ZeileLetzte = .Cells(.Rows.Count, lSpalteText).End(xlUp).Row
End With
'Summenformeln Ebene 5 einfügen
Call Summenformel(Farbe1:=Farbe_5, Farbe2:=Farbe_6, Farbe3:=xlColorIndexNone)
'Summenformeln Ebene 4 einfügen
Call Summenformel(Farbe1:=Farbe_4, Farbe2:=Farbe_5)
'Summenformeln Ebene 3 einfügen
Call Summenformel(Farbe1:=Farbe_3, Farbe2:=Farbe_4)
'Summenformeln Ebene 2 einfügen
Call Summenformel(Farbe1:=Farbe_2, Farbe2:=Farbe_3)
'Summenformeln Ebene 1 einfügen
Call TeilErgebnis1(Farbe1:=Farbe_1, Farbe2:=Farbe_2)
End Sub
Sub Summenformel(Farbe1 As Long, Farbe2 As Long, Optional Farbe3 As Long = -1)
'Summenformeln bei Zellen mit Farbe1 einfügen
Dim strFormel As String
If Farbe3 = -1 Then Farbe3 = Farbe2
With ws
ZeileEnde = ZeileLetzte
strFormel = ""
For lZeile = ZeileLetzte To Zeile_1 Step -1
With .Cells(lZeile, lSpalteFormel)
If .Interior.ColorIndex = Farbe2 Or .Interior.ColorIndex = Farbe3 Then
If strFormel = "" Then
strFormel = "=SUM(" & .Address(ReferenceStyle:=xlR1C1)
Else
strFormel = strFormel & ", " & .Address(ReferenceStyle:=xlR1C1)
End If
ElseIf .Interior.ColorIndex = Farbe1 Then
strFormel = strFormel & ")"
.Formula = strFormel
strFormel = ""
End If
End With
Next
End With
End Sub

Anzeige
Das ginge viel einfacher mit einer Fml auf...
28.08.2009 18:52:21
Luc:-?
...Basis der Indizierung lt Lead Column, Franz & Chris,
wenn sie ohne Pktt daherkommt — also A, AA, AAA...
In die Lücken muss dann nur...
=SUMMENPRODUKT((LINKS(A$5:A$27;LÄNGE(A5))=A5)*(LÄNGE(A$5:A$27)=LÄNGE(A5)+1);B$5:B$27)
...eingesetzt wdn.
Wenn die Originaltab zu umfangreich für Handarbeit ist, kann das auch per VBA-Subroutine  ( _ Makro) erledigt wdn; entweder mit der Find-Methode für leere Zellen und Replace durch Fml oder so...

For Each x In Range("B5:B27")
If IsEmpty(x) Then x.Formula = "=SUMPRODUCT((LEFT(A$5:A$27,LEN(A" & x.Row & "))=A" & _
x.Row & ")*(LEN(A$5:A$27)=LEN(A" & x.Row & ")+1),B$5:B$27)"
Next x

Der evtl größere Bereich muss dann natürlich entsprechend berücksichtigt/angepasst wdn...
Gruß Luc :-?
Anzeige
Das muss ich erst mal sacken lassen... Schönes WE
28.08.2009 21:33:58
ChrisW
Hallo Alle Zusammen,
Ich habe gerade erst gesehen, das mein Problem von Euch weiter bearbeitet wurde (ich habe die e-mailbenachrichtigung leider nicht eingeschaltet),
Ich mache aber jetzt Feierabend und versuche die Lösungen von Euch übers Wochenende durchzutesten und zu verstehen.
Da ist bestimmt das bei was ich brauche.
Also vorab schon mal Vielen Dank für Eure Hilfsbereitschaft, ich melde mich dann am Montag wieder und hoffe mein Excelproblem dann auf dem richtigen Weg zu haben -
Vielen Dank und ein schönes WE -
Chris
Anzeige
Dito schöWE und dann bis Montag,...
28.08.2009 22:32:10
Luc:-?
...Chris!
Für alle Interessierten: Hier und hier geht's offensichtlich auch um dieses Thema...
Luc :-?
AW: Automatische Summenbildung per VBA
28.08.2009 15:30:40
Petra
Hallo Chris
ich hab mal so was ähnliches machen müssen. Bist du einer einer Beispiellösung noch interessiert?
Ansonsten Montag wieder, jetzt ist bald Wochenende!
Schönen Tag noch
Petra
Anzeige
AW: Automatische Summenbildung per VBA
28.08.2009 21:36:51
ChrisW
Hallo Petra,
Danke für Dein Hilfsangebot,
Ich habe einige Lösungsvorschläge unten bekommen die ich erst ausprobieren möchte.
Wenn ich aber nicht weiterkomme, dann melde ich mich am Montag nochmal.
Vielen Dank und eun schönes Wochenende
Chris
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Automatische Summenbildung per VBA in Excel


Schritt-für-Schritt-Anleitung

  1. VBA-Editor öffnen:

    • Drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Neues Modul erstellen:

    • Klicke mit der rechten Maustaste auf "VBAProject (deineArbeitsmappe)" und wähle "Einfügen" > "Modul".
  3. Code einfügen:

    • Füge den folgenden VBA-Code ein, um die Summenbildung basierend auf den Zellfarben durchzuführen:
    Option Explicit
    Private ws As Worksheet, lZeile As Long
    Private ZeileLetzte As Long
    Private Const lSpalteText As Long = 1
    Private Const lSpalteFormel As Long = 2
    Private Const Zeile_1 As Long = 5 '1. Zeile mit Werten
    
    Private Const Farbe_1 As Long = 45 'Farbe Ebene 1
    Private Const Farbe_2 As Long = 44 'Farbe Ebene 2
    Private Const Farbe_3 As Long = 40 'Farbe Ebene 3
    Private Const Farbe_4 As Long = 6  'Farbe Ebene 4
    Private Const Farbe_5 As Long = 36 'Farbe Ebene 5
    Private Const Farbe_6 As Long = 0  'Farbe Ebene 6
    
    Sub SummenformelnEinfuegen()
       Set ws = ActiveSheet
       With ws
           ZeileLetzte = .Cells(.Rows.Count, lSpalteText).End(xlUp).Row
       End With
       Call Summenformel(Farbe1:=Farbe_5, Farbe2:=Farbe_6)
       Call Summenformel(Farbe1:=Farbe_4, Farbe2:=Farbe_5)
       Call Summenformel(Farbe1:=Farbe_3, Farbe2:=Farbe_4)
       Call Summenformel(Farbe1:=Farbe_2, Farbe2:=Farbe_3)
       Call Summenformel(Farbe1:=Farbe_1, Farbe2:=Farbe_2)
    End Sub
    
    Sub Summenformel(Farbe1 As Long, Farbe2 As Long)
       Dim strFormel As String
       With ws
           For lZeile = ZeileLetzte To Zeile_1 Step -1
               With .Cells(lZeile, lSpalteFormel)
                   If .Interior.ColorIndex = Farbe1 Then
                       strFormel = "=SUM("
                   ElseIf .Interior.ColorIndex = Farbe2 Then
                       strFormel = strFormel & .Address(ReferenceStyle:=xlR1C1) & ", "
                   ElseIf .Interior.ColorIndex = Farbe1 Then
                       strFormel = Left(strFormel, Len(strFormel) - 2) & ")"
                       .Formula = strFormel
                   End If
               End With
           Next lZeile
       End With
    End Sub
  4. Makro ausführen:

    • Schließe den VBA-Editor und gehe zurück zu Excel. Führe das Makro SummenformelnEinfuegen aus.

Häufige Fehler und Lösungen

  • Fehler beim Ausführen des Makros: Stelle sicher, dass du die richtigen Farbcodes für die Zellen verwendest. Die Farbcodes müssen mit den in deinem Arbeitsblatt übereinstimmen.
  • Formeln werden nicht korrekt angezeigt: Überprüfe, ob die Zellformatierung auf "Standard" eingestellt ist und dass keine Leerzeichen in den Zelladressen vorhanden sind.
  • Unerwartete Ergebnisse bei der Summenbildung: Vergewissere dich, dass die Zellen, die summiert werden sollen, die korrekte Farbe haben und dass es keine anderen Formate gibt, die die Berechnung beeinflussen könnten.

Alternative Methoden

  1. TEILERGEBNIS-Funktion: Du kannst die Funktion SUBTOTAL (in englisch: TEILERGEBNIS) verwenden, um Summen in einer Liste zu bilden, die von Filteroperationen betroffen sind. Diese Funktion ist besonders nützlich, wenn du nur sichtbare Daten summieren willst.

    =SUBTOTAL(9, B5:B20)
  2. Pivot-Tabellen: Eine Pivot-Tabelle kann ebenfalls verwendet werden, um Daten zusammenzufassen und zu aggregieren, ohne VBA zu nutzen. Dies ist besonders hilfreich, wenn du eine große Datenmenge hast.


Praktische Beispiele

  • Beispiel 1: Angenommen, du hast eine Liste von Verkaufszahlen in Spalte B, und du möchtest die Summe dieser Werte in einer Zelle mit einer bestimmten Hintergrundfarbe (z.B. hellgelb) anzeigen. Verwende den oben genannten VBA-Code, um die Summenformeln in die entsprechenden Zellen einzufügen.
  • Beispiel 2: Wenn du in einem Bericht die Summenbildung für verschiedene Kategorien benötigst, kannst du die SUBTOTAL-Funktion verwenden, um die Summe der sichtbaren Zellen in einem gefilterten Bereich zu berechnen.

Tipps für Profis

  • Code anpassen: Du kannst die VBA-Subroutine anpassen, um zusätzliche Funktionen hinzuzufügen, wie z.B. die Möglichkeit, nur bestimmte Zellen zu summieren oder unterschiedliche Farbcodes zu verwenden.
  • Fehlerprotokollierung: Implementiere eine einfache Fehlerprotokollierung im VBA-Code, um festzustellen, welche Zellen nicht korrekt bearbeitet wurden.
  • Optimierung: Überprüfe die Performance deines VBA-Codes, insbesondere bei großen Datenmengen. Verwende Application.ScreenUpdating = False, um die Geschwindigkeit zu erhöhen.

FAQ: Häufige Fragen

1. Wie kann ich die Summenbildung auf Englisch ändern? Um die Summenbildung auf Englisch zu ändern, kannst du die entsprechenden englischen Formeln wie SUBTOTAL verwenden.

2. Ist es möglich, die Summenformeln in einer bestimmten Sprache zu generieren? Ja, indem du die VBA-Funktionen entsprechend anpasst und die englischen Begriffe wie SUM oder SUBTOTAL verwendest.

3. Welche Excel-Version wird benötigt, um diese VBA-Lösungen zu verwenden? Die beschriebenen VBA-Lösungen sind in Excel 2007 und neueren Versionen verfügbar. Achte darauf, die Makros in der Datei zu aktivieren.

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