PDA

Vollständige Version anzeigen : Zeilen gruppieren wenn Zelle leer ist


dercoach
22.08.2017, 14:43
Hallo zusammen,

ich möchte gerne auf Knopfdruck in zwei Bereichen eines Tabellenblattes (Zeilen 33-86 und Zeilen 88-101) alle Zeilen gruppieren, bei denen in Spalte A weder "x" noch "y" steht.

Anbei noch eine Beispieldatei, in der gezeigt wird, wie das Tabellenblatt vor und nach der Ausführung des Makros aussehen soll.

Vielen Dank vorab!

Gruß
Sebastian

klin89
22.08.2017, 18:13
Hallo dercoach, :)

Sub test()
Dim r As Range, rng As Range
Application.ScreenUpdating = False
With Sheets("Vor Ausführung Makro")
Set rng = Union(.Range("a33:a86"), .Range("a88:a101"))
rng.EntireRow.Hidden = False
For Each r In rng
If IsEmpty(r.Value) Then r.EntireRow.Hidden = True
Next
End With
Application.ScreenUpdating = True
End Sub

klin89

aloys78
22.08.2017, 18:54
Hallo Sebastian,

mein Vorschlag:
Sub aloys()
Dim wsQ As Worksheet
Dim wsZ As Worksheet
Dim LRow As Long
Dim r1 As Long, r2 As Long
Const sZeile As Long = 33

Set wsQ = Worksheets("Vor Ausführung Makro")
Set wsZ = Worksheets("Nach Ausführung Makro")

Application.ScreenUpdating = False
With wsZ
LRow = wsQ.Cells(Rows.Count, "A").End(xlUp).Row
wsQ.Range("A" & sZeile & ":A" & LRow).Copy .Range("A" & sZeile)
r1 = sZeile: r2 = r1
Do
If .Cells(r2, "A") <> "x" And .Cells(r2, "A") <> "y" Then
r2 = r2 + 1
Else
If r1 = r2 Then
r1 = r1 + 1
r2 = r1
Else
.Range(.Cells(r1, "A"), .Cells(r2 - 1, "A")).Rows.Group
.Range(.Cells(r1, "A"), .Cells(r2 - 1, "A")).Rows.Hidden = True
r1 = r2
End If
End If
Loop Until r2 > LRow
End With
Application.ScreenUpdating = True
End Sub
Gruß
aloys

dercoach
23.08.2017, 07:36
@klin89!

danke, dein Code geht schon in die richtige Richtung.
Ein paar Anpassungen bräuchte ich aber noch:

1. Das Makro soll immer in dem Tabellenblatt ausgeführt werden, in dem ich gerade bin. Es handelt sich nämlich manchmal um mehrere Blätter und diese heißen auch anders als in der Beispieldatei.
2. Die Zeilen sollen nicht ausgeblendet sondern gruppiert werden, so dass sie über das Klicken auf die 1 (oben links am Raster) "versteckt" werden können.
3. Es sollen die Zeilen gruppiert werden, bei denen in Spalte A nicht x oder y steht. Es gibt im Gegensatz zur Beispieldatei keine komplett leeren Zellen in Spalte A, da immer eine Formel dahintersteht und lediglich der Inhalt teilweise als "" ausgegeben wird.

Ich hoffe das war einigermaßen verständlich ausgedrückt :)

@aloys78:

danke auch dir, jedoch verstehe ich deinen Code leider nicht.
Es gibt eigentlich keine zwei Tabellenblätter wie in der Beispieldatei. Die Datei soll lediglich zeigen wie ein Tabellenblatt vor und nach der Ausführung des Makros aussehen soll.
Außerdem sehe ich keine Einschränkung auf bestimmte Zeilen.

Viele Grüße
Sebastian

klin89
23.08.2017, 08:43
Re dercoach, :)

Ich bin Franzose, ich weiß nicht, worum du mich bittest..
Sub test()
Dim r As Range, rng As Range
Application.ScreenUpdating = False
With ActiveSheet
Set rng = Union(.Range("a33:a86"), .Range("a88:a101"))
rng.ClearOutline
'rng.EntireRow.Hidden = False
For Each r In rng
If IsEmpty(r.Value) Then r.Rows.Group
'If IsEmpty(r.Value) Then r.EntireRow.Hidden = True
Next
End With
Application.ScreenUpdating = True
End Sub
klin89

Oge
23.08.2017, 09:36
Hallo Sebastian,

ich finde es gut, dass endlich jemand gruppiert statt zu verbergen.

Bei der Gruppierung über ein Makro ist es manchmal lästig, wenn man es mehrmals hintereinander ausführt. Daher ist es häufig ratsam zu Beginn des Makros die alte Gruppierung zu entfernen. Das hat in deinem Fall auch den Vorteil, dass ich durch einfache Einträge/Löschung in die entsprechende Zellen schnell die Ebene der Zeile wechseln kann.

dercoach
23.08.2017, 10:11
@klin89
Danke für deine nochmalige Unterstützung. Punkt 1 und 2 meiner Rückfrage funktionieren jetzt wunderbar. Gibt es nun auch noch eine Möglichkeit, das Makro so zu verändern, dass auch die Zellen gruppiert werden, die eine Formel enthalten, deren Ausgabewert leer ("") ist? Oder umgekehrt eben nur die Zellen ausblenden, in denen nicht x oder y steht?

Außerdem würde mich interessieren, ob ich den Bereich über weitere
, .Range("a88:a101")
beliebig erweitern kann.

Vielen Dank nochmal für die Hilfe!

@Helmut: Gruppieren ist aus meiner Sicht praktikabler, da man erstens auf einen Blick sieht, welche Zellen ausgeblendet sind und man zweitens diese Zellen viel leichter wieder einblenden kann.
Vor Ausführung des Makros besteht keinerlei Gruppierung auf dem Tabellenblatt.