Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Anzeige
Inhaltsverzeichnis

Gruppierung anhand Ebenennummern per VBA

Forumthread: Gruppierung anhand Ebenennummern per VBA

Gruppierung anhand Ebenennummern per VBA
29.11.2024 14:45:39
Alex
Hallo zusammen,

ich verzweifle gerade daran Daten mit Hilfe von VBA zu gruppieren. Ich habe einiges herumprobiert, bin allerdings immer wieder komplett gescheitert. Alles was ich hinbekommen habe war eine einzige Gruppe.

Ich habe eine Spalte A in der Ebenennummern stehen (siehe hier: https://www.herber.de/bbs/user/173889.xlsx). Anhand dieser Nummern möchte ich gliedern. Die Zeilen müssen in dieser Reihenfolge bleiben. Letztendlich soll sich alles bis zu Ebene 1 zusammenklappen lassen. Ich hoffe ihr versteht was ich meine.

Falls das jemand weiterhilft: Es handelt sich um eine Auswertung zur Gewinn- und Verlustrechnung. Ebene 1 ist eine Art Überschrift, Ebene 2 ist der Jahresüberschuss, Ebene 3 ist das Ergebnis der gewöhnlichen Geschäftstätigkeit, Ebene 4 ist das Betriebsergebnis und das Finanzergebnis.

Kann mir hier jemand weiterhelfen?

Viele Grüße
Alex
Anzeige

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Gruppierung anhand Ebenennummern per VBA
29.11.2024 15:11:58
Yal
Hallo Axel,

deine Datei hat nur eine Spalte A. Ich gehe davon aus, dass es eine Spalte B mit Daten gibt.

- markiere den gesamten Bereich (Strg+*)
- Menü "Einfügen", "Tabelle"
- im Menü "Tabellenentwurf", "Mit Pivottabelle zusammenfassen"
- Feld "Spalte1" als Zeilen platzieren (Drag'n-drop)
- Feld "Spalte1" als Wert platzieren. Standardmässig wird es als "Anzahl" aggregiert.

Ist günstig, hat das Nachteil, dass die Reihenfolge der Einträge von Spalte A nicht mehr berücksichtigt werden.

Möglichkeit 2:
- auch als Tabelle umwandeln
- Menü "Daten", "aus Tabelle/Bereich"
- Du bis im Power Query Editor,
- erste Spalte markieren,
- im Menü "Transformieren", "Gruppieren nach"
- eventuell Felder zu summieren eintragen, Vorgang "Summe" auswählen.
- Menü "Datei", "Schliessen & laden"

Möglichkeit VBA: wenn's unbedingt über VBA gehen soll, nachfragen. Die Lösung ist relativ einfach. Man sammelt über einen Dictionary. Jedoch unnötig kompliziert, falls eine der beiden vorigen Lösung passen würde.

VG
Yal
Anzeige
AW: Gruppierung anhand Ebenennummern per VBA
01.12.2024 20:58:51
Alex
Hallo Yal,

vielen Dank für deine Lösungsvorschläge.

Wenn ich das gerade richtig nachvollzogen habe, dann ist das aber nicht das was ich brauche. Ich habe einmal ein kleines Beispiel mit einer Gliederung gebastelt, die besser veranschaulicht, was ich realisieren möchte: https://www.herber.de/bbs/user/173917.xlsx

Da ich in Spalte B Summen gebildet habe, konnte ich die Gruppierung für das Beispiel mit der Funktion "AutoGliederung" vornehmen.

In den Daten, mit denen ich arbeite gibt es in Spalte B jedoch keine verformelten Summen. Spalte B enthält nur die Werte. Ich vermute, dass ich dann entweder ein Makro benötige, das mir die Summen durch die entsprechenden Formeln ersetzt, sodass ich dann mit "AutoGliederung" die Gruppierung vornehmen kann, oder (noch besser), das Makro würde zuerst die Summen verformeln und dann die Gruppierung vornehmen.

Ich hoffe du verstehst was ich meine.

Viele Grüße
Alex
Anzeige
AW: Gruppierung anhand Ebenennummern per VBA
29.11.2024 15:24:08
Yal
Hello again,

anbei die VBA-Variante:

Sub Gruppieren()

Dim D As Object
Dim Z As Range
Dim K

'Init
Set D = CreateObject("Scripting.Dictionary")
'Sammeln
For Each Z In Intersect(Range("A:A"), ActiveSheet.UsedRange)
D(CStr(Z.Value)) = D(CStr(Z.Value)) + Z.Value 'Summierung (in dem Fall absurd :-)
'D(CStr(Z.Value)) = D(CStr(Z.Value)) + 1 'Falls nur Zählung (beide gleichzeitig geht nicht)
Next
'Ausgeben
For Each K In D.keys
With Cells(Rows.Count, "D").End(xlUp)
.Offset(1, 0) = K
.Offset(1, 1) = D(K)
End With
Next
End Sub


VG
Yal
Anzeige
AW: Gruppierung anhand Ebenennummern per VBA
01.12.2024 23:09:28
Alex
Hallo Yal,

tut mir leid, ich hatte deinen Code übersehen. Das Makro funktioniert wunderbar aber wie die anderen beiden Lösungsansätze löst es leider mein Problem nicht.

Ich glaube ich habe das am Freitag nicht vernünftig erklärt. Wenn du dir mein Beispiel (https://www.herber.de/bbs/user/173917.xlsx) ansiehst, dann verstehst du was ich meine, denke ich.

Viele Grüße
Alex



Anzeige
AW: Gruppierung anhand Ebenennummern per VBA
04.12.2024 08:07:56
MCO
Sorry, ich kann da anhand der Nummern keine durchgängige Logik erkennen.
Andere scheinbar auch nicht, daher bleibt die Antwort aus.

Wenn du anhand der Zeilenwerte erklären kannst, welche gruppiert werden müssen, kommen wir weiter.
Beispiel
ab 1 immer bis unten
jeweils 2 bis zur nächsten 3
jeweils 3 bis zur nächsten 2

oder so ähnlich.
Kannst du das nicht erklären, kann man es auch nicht programmieren.

Gruß, MCO
Anzeige
AW: Gruppierung anhand Ebenennummern per VBA
04.12.2024 10:17:49
Yal
Hallo MCO,

es handelt sich um Ebenen: 1 bekommt die Summe alle zweier, 2 bekommt die Summe "seinen" dreier, es gibt ein 3 der Vierer hat.

Sehr kurze Problembeschreibung, komplizierte Behandlung. Wenn man annimmt, dass die Tiefe nicht vorher festgelegt ist, wird eine Universallösung eine harte Nuss (so mein Anspruch, sonst macht es keinen Spass ;-)

Ich beisse mich an dem Knochen seit ein paar Tagen. Hauptsächlich gedanklich, aber auch mit einer -unvollständigen- Lösungsansatz. Besonders die Kombination einer rekursive Behandlung mit einer Rückgabe in das Blatt macht mich Problem.
Zweite Schwierigkeitsstufe wäre anstatt feste Summen, Summenformeln in der Zellen abzugeben, um eine Autogliederung zu ermöglichen.

Hier mein bisherigen nicht vollständigen Code. Vielleicht kann jemand sein Spass daran haben:
Const EbnSp = 1

Const WerteSp = 2
Const SumSp = 3
Dim Zeile As Long

Sub Summieren_starten()
Range("Tabelle1").ListObject.DataBodyRange.Columns(3).ClearContents 'die Liste ist eine Tabelle umgewandelt worden. Überschrift in Zeile 1, Daten ab Zeile 2
Zeile = 2
Cells(2, SumSp).Value = Summieren(Cells(2, EbnSp).Value) 'erste Zeile, Referenz Gliederungswert
End Sub

Function Summieren(AktEbene As Long) As Double
Dim Summe As Double
Dim NextEb As Long
Dim eigZeile As Long
'AktZeile ist die Zeile der eventuelle Summe, wenn die Rekursion runterkommt

eigZeile = Zeile
'prüft die kommende Ebene
Do While Cells(Zeile, EbnSp).Value > ""
NextEb = Cells(Zeile + 1, EbnSp).Value 'immer das "Selbst" im Bezug zu was danach kommt richten.
Select Case NextEb
Case Is > AktEbene 'Steigend: neue Ebene "reingehen", Summe abnehmen, wenn runterkommt
'eigene verwalten,
'nicht, da nächste Eben vorhanden
'nächste einleiten
eigZeile = Zeile
Zeile = Zeile + 1
Summe = Summe + Summieren(NextEb)
'Rückgabe ablegen
Cells(eigZeile, SumSp).Value = Summe
eigZeile = Zeile
Case AktEbene 'gleiche Ebene
'eigene verwalten,
'Leaf: Werte in Spalte Sum kopieren
Cells(Zeile, SumSp).Value = Cells(Zeile, WerteSp).Value
'Wert in die Summe reinfliessen lassen
Summe = Summe + Cells(Zeile, WerteSp).Value
'nächste einleiten
Zeile = Zeile + 1
Case Is AktEbene 'absteigend: der Ast wird verlassen
'eigene verwalten
'Leaf: Werte in Spalte Sum kopieren
Cells(Zeile, SumSp).Value = Cells(Zeile, WerteSp).Value
'Wert in die Summe reinfliessen lassen
Summieren = Summe + Cells(Zeile, WerteSp).Value
'nächste einleiten
Zeile = Zeile + 1
Exit Function
Case Else '= ""
'eigene verwalten:
'Leaf: Werte in Spalte Sum kopieren
Cells(Zeile, SumSp).Value = Cells(Zeile, WerteSp).Value
'nächste einleiten
'nichts ausser zurückgeben
Summieren = Cells(Zeile, WerteSp).Value
Zeile = Zeile + 1
Exit Function
End Select
Loop
End Function

Ich habe noch eine Schwierigkeit beim "runterkommen", wenn nicht eine Ebene runter (also Richtung root) sondern 2 auf einmal vorkommt.

VG
Yal
Anzeige
Jetzt haben wir es!
06.12.2024 21:43:24
Yal
Hallo zusammen,

es hat lang gedauert, weil ich diese Woche wenig Zeit hatte.

Auf Basis der vorher erklärte Startzustand: Daten in einer Tabelle ( Range("Tabelle1").ListObject) ) die gesamte Berechnung mit einem rekursive Verfahren:

Const EbnSp = 1

Const WerteSp = 2
Const AusgSp = 3
Dim Zeile As Long

Sub Summieren_starten()
Range("Tabelle1").ListObject.DataBodyRange.Columns(3).ClearContents
Zeile = 1
Summieren 'erste Zeile, Referenz Gliederungswert
End Sub

Function Summieren() As Double
Dim Summe As Double
Dim ParentZ As Long
Dim eigEb As Long

ParentZ = Zeile 'Wer bin ich, Place to store result!
eigEb = Ebene(Zeile)
Do 'CLng(Cells(Zeile + 1, EbnSp).Value) > 0 'prüft die kommende Ebene
Select Case Ebene(Zeile + 1) 'Prüfung der nächste Zeile
Case 0 'Abschluss, wenn Ebene in nächste Zeile leer ist
'eigene verwalten:
Cells(Zeile, AusgSp).Value = Cells(Zeile, WerteSp).Value 'Leaf: Werte in Spalte Sum kopieren
'nächste einleiten
Summieren = Summe + Cells(Zeile, WerteSp).Value 'und in die Summe
Zeile = Zeile + 1
Exit Function
Case Is > eigEb 'Steigend: neue Ebene "reingehen", Summe abnehmen, wenn runterkommt
'eigene verwalten,
ParentZ = Zeile 'diese Zeile wird das Ergbnis der nächste Ebene bekommen
'nächste einleiten
Zeile = Zeile + 1
Cells(ParentZ, AusgSp).Value = Summieren() 'Rückgabe vom Rekurtsiv ablegen
'Rückgabe sammeln
Summe = Summe + Cells(ParentZ, AusgSp).Value 'und in die Summe einfliessen lassen
Case eigEb 'gleiche Ebene
'eigene verwalten,
Cells(Zeile, AusgSp).Value = Cells(Zeile, WerteSp).Value 'Leaf: Werte in Spalte Sum kopieren
Summe = Summe + Cells(Zeile, WerteSp).Value 'Wert in die Summe reinfliessen lassen
'nächste einleiten
Zeile = Zeile + 1
Case Is eigEb 'absteigend: der Ast wird verlassen
'eigene verwalten
'Leaf: Werte in Spalte Sum kopieren
Cells(Zeile, AusgSp).Value = Cells(Zeile, WerteSp).Value
'Wert in die Summe reinfliessen lassen
Summieren = Summe + Cells(Zeile, WerteSp).Value
'nächste einleiten
Zeile = Zeile + 1
Exit Function
End Select
Loop While Ebene(Zeile) > 0
Summieren = Summe
End Function

Function Ebene(Zeile As Long) As Long
On Error Resume Next
Ebene = CLng(Cells(Zeile, EbnSp).Value)
End Function


VG
Yal
Anzeige
AW: Jetzt haben wir es!
19.12.2024 18:00:31
Alex
Hallo Yal,

bitte entschuldige, dass ich erst jetzt antworte. Es war die letzten Wochen viel zu tun, weswegen ich es nicht früher geschafft habe.

Vielen Dank für die Mühe, die du dir gemacht hast.

Ich habe das ganze gerade getestet aber es ist nicht das was ich meinte.

Ich würde gerne die ebenen gruppieren. Ich habe inzwischen herausgefunden, dass das über VBA möglich ist. Beispielsweise für Ebene 10 (Zeilen 11-14):



Sub GruppiereZeilen()
' Gruppiert die Zeilen 3 bis 7
Rows("11:14").Group
End Sub


So würde ich gerne alle ebenen einklappen können und bei Bedarf wieder ausklappen können, damit alles, wenn man es nicht detailliert braucht, schön übersichtlich bleibt.

Ich habe aber auch gelesen, dass man maximal 8 Ebenen tief gruppieren kann. Das würde heißen, dass das was ich möchte, gar nicht umsetzbar ist, oder?

Viele Grüße
Alex
Anzeige
AW: Jetzt haben wir es!
19.12.2024 18:24:50
Yal
Hallo Alex,

ob Du mir 8 Ebenen zurecht kommst, kann ich nicht beurteilen.

Ich gebe zu, dass ich in der Aufgabe mein Spaß hatte, und nicht 100% die Fragestellung verfolgt habe. Ich hatte auch die Idee, basierend auf diesem Code, eine Formulerzeugung einzurichten, um anschließend die Autogliederung zu ermöglichen. Wegen der unvorhergesehen Schwierigkeiten war es mir doch zuviel "Sport".

Auf alle Fälle kann man damit summieren.

Der Beitrag ist sehr alt und nicht mehr sichtbar. Falls noch Handlungsbedarf besteht, bitte einen neuen Beitrag erfassen. Mit Link auf den alten:
https://www.herber.de/forum/archiv/1996to2000/1998137_Gruppierung_anhand_Ebenennummern_per_VBA.html

VG
Yal
Anzeige
Anzeige
Anzeige
Live-Forum - Die aktuellen Beiträge
Datum
Titel
14.05.2026 13:31:09
14.05.2026 09:50:42
13.05.2026 19:14:18