'*******************************************************************
Sub Gruppierungsebene_InSpalteA()
'*******************************************************************
->Das Makro fügt im aktuellen Tabellenblatt vor Spalte A eine Spalte
->ein. In dieser Spalte wird die jeweilige Gruppierungs-Ebene
->der Zeile eingetragen
'*******************************************************************
->0. aktuelles Blatt auf Typ Tabelle überprüfen
-> nein: Meldung und Abbruch
->1. Abfrage der Startzeilennummer
-> bei Fehler, Meldung und Abbruch
->2. benutzten Bereich feststellen
->2.1 kein benutzter Bereich vorhanden -> Meldung und Abbruch
->3. neue Spalte als Spalte A einfügen
->3.1 Spalte als Text formatieren
->3.2 Überschrift->Gruppierung' in Zeile 1
-> (wenn Start-Zeile > 1)
->4 für alle Zeilen des benutzten Bereiches
-> Gruppierungsebene in Spalt A eintragen
->5. Spaltenbreite anpassen
->6. Aufräumen
Dim ws As Worksheet
Dim s_start_row As String, l_start_row As Long
Dim l_row_last As Long, l_col_last As Long, z As Long
->0. aktuelles Blatt auf Typ Tabelle überprüfen
-> nein: Meldung und Abbruch
If ActiveSheet.Type <> xlWorksheet Then
MsgBox (Das aktuelle Blatt ist keine Tabelle :-()
Exit Sub
End If
Set ws = ActiveSheet
->1. Abfrage der Startzeilennummer
-> bei Fehler, Meldung und Abbruch
s_start_row = InputBox( _
Bitte geben sie die Zeilennummer an, ab der mit & vbLf & _
der Ausgabe der Gruppierungs-Ebene begonnem werden soll., _
Eingabe der Startzeile, 2)
If IsNumeric(s_start_row) Then l_start_row = s_start_row
Select Case l_start_row
Case 1 To 65500
Case Else
MsgBox (Der Wert-> & s_start_row &-> ist unzulässig!)
GoTo Aufraeumen
End Select
->************************************
->2. benutzten Bereich feststellen
->2.1 kein benutzter Bereich vorhanden -> Meldung und Abbruch
If Not BenutztenBereichBestimmen(ws, l_row_last, l_col_last) Then
MsgBox ( _
Auf dem Blatt-> & ws.Name & _
-> ist kein benutzter Bereich vorhanden)
GoTo Aufraeumen
End If
->************************************
->3. neue Spalte als Spalte A einfügen
ws.Columns(1).Insert Shift:=xlToRight
->3.1 Spalte als Text formatieren
ws.Columns(1).NumberFormat = @
ws.Columns(1).HorizontalAlignment = xlCenter
->3.2 Überschrift Gruppierungs-Ebene in Zeile 1
-> (wenn Start-Zeile > 1)
If l_start_row > 1 Then
ws.Cells(1, 1).Value = Gruppierung
ws.Cells(1, 1).Font.Bold = True
End If
->************************************
->4 für alle Zeilen des benutzten Bereiches
-> Gruppierungsebene in Spalt A eintragen
For z = l_start_row To l_row_last
ws.Cells(z, 1).Value = ws.Rows(z).OutlineLevel
Next
->************************************
->5. Spaltenbreite anpassen
ws.Columns(1).AutoFit
Aufraeumen:
->************************************
->6. Aufräumen
Set ws = Nothing
End Sub
'*******************************************************************
Sub GroupHierarchie_InSpalteA()
'*******************************************************************
->Im aktuellen Tabellenblatt wird vor Spalte A eine Spalte eingefuegt.
->In dieser Spalte werden die Hierarchen ( Gruppierungs-Ebene)
->in der Form 1.1.1.1.1.1.1 eingetragen
'*******************************************************************
->0. aktuelles Blatt auf Typ Tabelle überprüfen
-> nein: Meldung und Abbruch
->1. Sicherheitsabfrage
->2. Abfrage der Startzeilennummer
-> bei Fehler, Meldung und Abbruch
->3. benutzten Bereich feststellen
->3.1 kein benutzter Bereich vorhanden -> Meldung und Abbruch
->4. neue Spalte als Spalte A einfügen
->4.1 Spalte als Text formatieren
->4.2 Überschrift->Hierarchie' in Zeile 1
-> (wenn Start-Zeile > 1)
->5. Initialisierung der Hirarchie-Variablen
->6 für alle Zeilen des benutzten Bereiches
->6.1 Hierarchie der Zeile fesstellen
->6.2 Hierarchie > letzte Hierarchie
->6.2.1 nix machen
->6.3 Hierarchie = letzter Hierarchie
->6.3.1 Hierarchie-Zähler erhöhen
->6.4. Hierarchie < letzte Hierarchie
->6.4.1 Hierarchie-Zähler erhöhen
->6.4.2 Hierarchie-Zähler der größeren Hierarchien initialisieren
->6.5 Hierarchie ausgeben
->7. Spaltenbreite anpassen
->8. Aufräumen
'*******************************************************************
Dim wb As Workbook, ws As Worksheet
Dim s_start_row As String, l_start_row As Long
Dim l_row_last As Long, l_col_last As Long
Dim H1 As Integer, H2 As Integer, H3 As Integer, H4 As Integer
Dim H5 As Integer, H6 As Integer, H7 As Integer, H8 As Integer
Dim lastH As Integer, aktH As Integer, z As Long, s_H As String
Const P As String = .
If ActiveSheet.Type <> xlWorksheet Then
MsgBox (Das aktuelle Blatt ist keine Tabelle :-()
Exit Sub
End If
Set wb = ActiveWorkbook
Set ws = ActiveSheet
->************************************
->1. Sicherheitsabfrage
If vbNo = MsgBox( _
Wollen sie in der Mappe & wb.Name & auf dem Blatt & ws.Name & vbLf & _
eine Spalte vor Spalte A einfügen, und dort die Hierarche ( Gruppierungs-Ebene) & vbLf & _
in der Form 1.1.1.1.1 ausgeben ?, vbQuestion + vbYesNo) _
Then GoTo Aufraeumen
->************************************
->2. Abfrage der Startzeilennummer
-> bei Fehler, Meldung und Abbruch
s_start_row = InputBox( _
Bitte geben sie die Zeilennummer an, ab der mit & vbLf & _
der Ausgabe der Hierarchie begonnem werden soll., _
Eingabe der Startzeile, 2)
If IsNumeric(s_start_row) Then l_start_row = s_start_row
Select Case l_start_row
Case 1 To 65500
Case Else
MsgBox (Der Wert-> & s_start_row &-> ist unzulässig!)
GoTo Aufraeumen
End Select
->************************************
->3. benutzten Bereich feststellen
->3.1 kein benutzter Bereich vorhanden -> Meldung und Abbruch
If Not BenutztenBereichBestimmen(ws, l_row_last, l_col_last) Then
MsgBox ( _
Auf dem Blatt-> & ws.Name & _
-> ist kein benutzter Bereich vorhanden)
GoTo Aufraeumen
End If
->************************************
->4. neue Spalte als Spalte A einfügen
ws.Columns(1).Insert Shift:=xlToRight
->4.1 Spalte als Text formatieren
ws.Columns(1).NumberFormat = @
->4.2 Überschrift Hierarchie in Zeile 1
-> (wenn Start-Zeile > 1)
If l_start_row > 1 Then
ws.Cells(1, 1).Value = Hierarchie
ws.Cells(1, 1).Font.Bold = True
End If
->************************************
->5. Initialisierung der Hirarchie-Variablen
H1 = 0: H2 = 1: H3 = 1: H4 = 1: H5 = 1: H6 = 1: H7 = 1: H8 = 1
->letzte erzeugte Hierarchiestufe
lastH = 1
->6 für alle Zeilen des benutzten Bereiches
For z = l_start_row To l_row_last
->6.1 Hierarchie der Zeile fesstellen
aktH = ws.Rows(z).OutlineLevel
If aktH > lastH Then
->6.2 Hierarchie > letzte Hierarchie
->6.2.1 nix machen
->ggf.Anfangsinitialisierung korrigieren
If H1 = 0 Then H1 = 1
ElseIf aktH = lastH Then
->6.3 Hierarchie = letzter Hierarchie
->6.3.1 Hierarchie-Zähler erhöhen
Select Case aktH
Case 1: H1 = H1 + 1
Case 2: H2 = H2 + 1
Case 3: H3 = H3 + 1
Case 4: H4 = H4 + 1
Case 5: H5 = H5 + 1
Case 6: H6 = H6 + 1
Case 7: H7 = H7 + 1
Case 8: H8 = H8 + 1
End Select
Else
->6.4. Hierarchie < letzte Hierarchie
->6.4.1 Hierarchie-Zähler erhöhen
->6.4.2 Hierarchie-Zähler der größeren Hierarchien initialisieren
Select Case aktH
Case 1: H1 = H1 + 1
H2 = 1: H3 = 1: H4 = 1: H5 = 1: H6 = 1: H7 = 1: H8 = 1
Case 2: H2 = H2 + 1
H3 = 1: H4 = 1: H5 = 1: H6 = 1: H7 = 1: H8 = 1
Case 3: H3 = H3 + 1
H4 = 1: H5 = 1: H6 = 1: H7 = 1: H8 = 1
Case 4: H4 = H4 + 1
H5 = 1: H6 = 1: H7 = 1: H8 = 1
Case 5: H5 = H5 + 1
H6 = 1: H7 = 1: H8 = 1
Case 6: H6 = H6 + 1
H7 = 1: H8 = 1
Case 7: H7 = H7 + 1
H8 = 1
End Select
End If
->6.5 Hierarchie ausgeben
Select Case aktH
Case 1
s_H = H1 & P
Case 2
s_H = H1 & P & H2 & P
Case 3
s_H = H1 & P & H2 & P & H3 & P
Case 4
s_H = H1 & P & H2 & P & H3 & P & H4 & P
Case 5
s_H = H1 & P & H2 & P & H3 & P & H4 & P & H5 & P
Case 6
s_H = H1 & P & H2 & P & H3 & P & H4 & P & H5 & P & H6 & P
Case 7
s_H = H1 & P & H2 & P & H3 & P & H4 & P & H5 & P & H6 & P & H7 & P
Case 8
s_H = H1 & P & H2 & P & H3 & P & H4 & P & H5 & P & H6 & P & H7 & P & H8 & P
End Select
ws.Cells(z, 1).Value = s_H
lastH = aktH
Next
->************************************
->7. Spaltenbreite anpassen
ws.Columns(1).AutoFit
Aufraeumen:
->************************************
->8. Aufräumen
Set ws = Nothing: Set wb = Nothing
End Sub
'**************************************************************
Function BenutztenBereichBestimmen(ws As Worksheet, _
l_ze As Long, l_spe As Long) As Boolean
Dim l_max_row As Long, l_max_col As Long, x As Long
Dim l_cols As Long, l_anz As Long
->liefert die letzte beschriebene Spalte/Zeile des Arbeitsblattes
->gibt FALSE zurück, wenn das Arbeitsblatt keinen Inhalt hat
BenutztenBereichBestimmen = True
->letzte Spalte bestimmen
l_spe = ws.Cells.SpecialCells(xlCellTypeLastCell).Column
If l_spe = 0 Then
BenutztenBereichBestimmen = False: Exit Function
End If
For x = l_spe To 1 Step -1
If (1 < ws.Cells(ws.Rows.Count, x).End(xlUp).Row) Or _
(ws.Cells(1, x).Value <> ) Then
l_spe = x: Exit For
End If
l_spe = x
Next
->letzte Zeile bestimmen
l_ze = ws.Cells.SpecialCells(xlCellTypeLastCell).Row
If l_ze = 0 Then
BenutztenBereichBestimmen = False: Exit Function
End If
For x = l_ze To 1 Step -1
If (1 < ws.Cells(x, ws.Columns.Count).End(xlToLeft).Column) Or _
(ws.Cells(x, 1).Value <> ) Then
l_ze = x: Exit For
End If
l_ze = x
Next
->Spalte=1, Zeile=1 und leere Zelle -> Blatt leer
If l_ze = 1 And l_spe = 1 And ws.Cells(1, 1).Value = Then
BenutztenBereichBestimmen = False: Exit Function
End If
End Function