Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1096to1100
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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
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
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 :-?
Anzeige
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
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

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige