Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1872to1876
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

Spalten gruppieren

Spalten gruppieren
23.02.2022 10:15:42
Sabine
Hallo liebe Leser,
ich habe folgendes Anliegen:
Ich möchte gerne in einer Datei Spalten gruppieren.
Grundlage ist Zelle C6. Dort steht die KW, die ausgewählt wurde.
Ab Zelle AJ7 stehen die KWs den Spalten entlang mit den jeweiligen Werten darunter.
Nun soll geschaut werden, in welcher Zelle (AJ7, AJ8,...) der Wert Hintergrund ist, dass sich ein Diagramm darauf bezieht. In diesem sollen nur so viele Balken angezeigt werden, wie die KW ausgewählt wurde (KW = 6 --> 6 Balken).
Ich habe bereits begonnen zu programmieren, komme aber gerade nicht weiter:
Sub Spalten_ausblenden() ' Spalten_ausblenden Makro ' variabel mit ausgewählter Woche Spalten ausblenden für Diagramm Stunden im Zeitverlauf Dim i As Integer Dim j As Integer Dim k As Integer j = 36 'Zähler soll nach rechts gehen (die Spalten entlang), 36=Spalte AJ k = 7 'Zeile 7 i = ActiveSheet.Range("c6").Value 'i = Zellinhalt C6, d.h. KW, nach der gruppiert werden soll (KW +1) ActiveSheet.Cells(k, j).Select If Cells(k, j).Value >
Ich habe die Vermutung, dass das Problem bei dem ersten "Columns("j:j").Select" besteht, denn dort hakt es.
Ggf. wäre es besser mit J=J+1 aber ich weiß nicht, wo ich es einbinden soll.
Kann mir jemand helfen?
Lieben Dank und
liebe Grüße,
Sabi

23
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Spalten gruppieren
23.02.2022 11:26:55
Yal
Hallo Sabine,
hinter eine KW steht ein Datum. Wenn Du eine Pivotchart anstatt normalen Chart kannst Du durch Filterung (KW <= x) oder gar Slicer ("Zeitasche").
VG
Yal
AW: Spalten gruppieren
23.02.2022 11:54:03
Sabine
Hallo Yal,
hinter der KW steht tatsächlich kein Datum. Dort steht nur 1, 2, 3,... . Das heißt dort ist kein Datum formatiert o.ä.
Zum anderen habe ich mehrere Blätter mit dem selben Inhalt, d.h. pro Bereich ein Blatt.
Infolgedessen ist es mühsam in jedes Blatt reinzugehen und den Filter anzupassen.
Ich habe es nun ohne Makro mit Namen definieren + bereich.verschieben gelöst.
Allerdings wüsste ich trotzdem gerne, wo ich das Makro anpassen muss.
LG,
Sabine
Anzeige
AW: Spalten gruppieren
23.02.2022 14:33:28
Yal
Hallo Sabine,
vielleicht so:

Sub Spalten_ausblenden()
Dim Sp As Integer
'ActiveSheet ist immer default
'alles ungruppieren
For Sp = 36 To 92
Columns(Sp & ":" & Sp).Ungroup
Next
'Finden, wo die Bedingung nicht mehr triff
Sp = 36
Do While Cells(7, Sp).Value 
VG
Yal
AW: Spalten gruppieren
23.02.2022 14:57:38
Sabine
funktioniert leider nicht. Dann taucht derselbe Fehler auf wie bei mir:
x 400
LG
Sabi
AW: Spalten gruppieren
23.02.2022 15:12:33
Yal
... und zwar oben recht an der 5ter Stelle richtig?
Gedanken kann ich nicht lesen und Datei, die ich nicht in der Hand habe, nicht begutachten. Ich könnte ja,was nachbauen. Aber es würde in meiner Datei funktionieren und nicht in deinem.
Ich nehme mit, dass mein erster Vorschlag funktioniert.
Wenn Du mehr brauchst, musst Du eine aussagefähige Datei hochladen (beseitige darin alle was nicht im Internet gehört).
VG
Yal
Anzeige
AW: Spalten gruppieren
23.02.2022 15:27:01
Sabine
Ja ich lade eine Datei hoch. Dauert nur etwas.
AW: Spalten gruppieren
23.02.2022 16:11:14
Sabine
Okay, nicht wundern, habe alles mögliche rausgeschmissen, auch das Diagramm das sich auf die Daten bezieht.
Aber hier:
https://www.herber.de/bbs/user/151323.xlsm
kannst du sehen was ich meine.
Wenn ich bei den Makros den gespeicherten auswähle und laufen lasse, kommt 400.
LG
Sabi
AW: Spalten gruppieren
23.02.2022 17:28:16
Yal
Hallo Sabine,
wenn man testen kann, kommt man schnell auf viel mehr Erkenntnisse:
_ Columns(x:y) akzeptiert keine Zahlen. Es müssen Buchstabe sein. Dann nehmen wir die Zelle in Zeile 1 und daraus "EntireColumn". Ein Bereich wird mit Range(Zelle1, Zelle2) definiert.
_ Ungroup auf Spalten die nicht groupiert sind, magt der Compiler nicht. Wir legen eine Fehler-Toleranz "On Error Resume Next"
darüber hinaus:
_ die Spalten müssen nicht einzeln ungroupiert, es reicht wenn man den gesamte Block ungroupiert. Geht ein paar Mikrosekunden schneller ;-) Vorallem aber leichter zu lesen.
_ Grenzspalten habe ich als Konstanten (nicht veränderbare Variablen), auch für ein erleichtertes Lesen.
Neuer Code:

Sub Spalten_ausblenden()
Dim Sp As Long
Const SP_anf = 36
Const SP_end = 92
'ActiveSheet ist immer default, es sei denn, der Code ist in dem Codefenster eines Blattes. Dann ist immer dieses Blatt per Default gemeint
'Alles ungruppieren, fehlertolerant
On Error Resume Next  'Ignoriere den Fehler und mache einfach weiter
Range(Cells(1, SP_anf), Cells(1, SP_end)).EntireColumn.Ungroup
On Error GoTo 0 'Nicht mehr fehlertolerant
'Finden, wo die Bedingung nicht mehr triff
Sp = SP_anf
Do While Cells(7, Sp).Value 
VG
Yal
Anzeige
AW: Spalten gruppieren
24.02.2022 09:22:26
Sabine
Hallo Yal,
lieben Dank. Das hat schon sehr geholfen. Allerdings ist das Resultat genau anders herum. Das heißt er gruppiert die ersten Spalten. wo die Werte drin stehen, statt die, wo keine stehen (das heißt von hinten nach vorne bis Wert Ich habe das Makro abgeändert und versucht es hinzubekommen:

Sub Spalten_ausblenden()
Dim Sp As Long
Const SP_anf = 37
Const SP_end = 92
'ActiveSheet ist immer default, es sei denn, der Code ist in dem Codefenster eines Blattes. Dann ist immer dieses Blatt per Default gemeint
'Alles ungruppieren, fehlertolerant
On Error Resume Next  'Ignoriere den Fehler und mache einfach weiter
Range(Cells(1, SP_anf), Cells(1, SP_end)).EntireColumn.Ungroup
On Error GoTo 0 'Nicht mehr fehlertolerant
'Finden, wo die Bedingung nicht mehr triff
Sp = SP_anf
Do
Range(Cells(1, SP_anf), Cells(1, SP_end)).EntireColumn.Group
Loop While Cells(7, Sp).Value > Range("C6").Value And Sp 
Allerdings gruppiert er nun alle Spalten. *Hand gegen Kopf schlag*
Irgendwo hakt es noch.
Liebe Grüße,
Sabi
Anzeige
AW: Spalten gruppieren
24.02.2022 11:13:47
Yal
Hallo Sabi,
wenn Du den Code ganz langsam liest und dir dabei Gedanken machst, was es bedeutet, wirst merken, dass es gar nicht so skryptisch wie es wirkt.
Es reicht nicht der Vorzeichen der Prüfung umzudrehen (< anstatt >=), es muss auch von hinten eingegangen werden.

Sp = SP_end
Do While Cells(7, Sp).Value  Sp_anf  'letzteres ist ein "Fallschirm-Klausel" gegen endlose Schleifen
Sp = Sp - 1
Loop
Die Prüfung der Fallschirmklausel und die Gruppierung muss auch angepasst werden

'dann gruppieren, falls nicht durch Fallschirm-Klausel ausgestiegen
If Sp 
VG
Yal
Anzeige
AW: Spalten gruppieren
24.02.2022 11:26:03
Yal
...noch mal kurz nachgedacht:
es würde -im ursprünglichen Code- sogar reichen, wenn die Gruppierung auf die "anderen Spalten" stattfindet

'dann gruppieren, falls nicht durch Fallschirm-Klausel ausgestiegen
If Sp 
Aber lass dich nicht verwirren!
VG
Yal
AW: Spalten gruppieren
24.02.2022 15:35:07
Sabine
Hallo Yal,
hat so noch nicht funktioniert, habe es aber Gott sei dank nun hinbekommen.
Mit Hilfe von debug.print ist mir nun ein Licht aufgegangen.
So sieht es jetzt aus:

Sub Spalten_ausblenden()
Dim Sp As Long
Const SP_anf = 37
Const SP_end = 92
'ActiveSheet ist immer default, es sei denn, der Code ist in dem Codefenster eines Blattes. Dann ist immer dieses Blatt per Default gemeint
'Alles ungruppieren, fehlertolerant
On Error Resume Next  'Ignoriere den Fehler und mache einfach weiter
Range(Cells(1, SP_anf), Cells(1, SP_end)).EntireColumn.Ungroup
On Error GoTo 0 'Nicht mehr fehlertolerant
'Finden, wo die Bedingung noch zutriff
Sp = SP_end
Do Until Cells(7, Sp).Value = Range("C6").Value And Sp > SP_anf
Sp = Sp - 1
Loop
Range(Cells(1, Sp + 1), Cells(1, SP_end)).EntireColumn.Group
End Sub
Jetzt muss ich es noch hinbekommen, dass die Spalten dann auch zugeklappt sind...Man das dauert. In der Zeit habe ich weitere drei Codes geschrieben, die sogar funktionierten. Aber der hier ist irgendwie ...kompliziert für mich. Ich such mich mal durch hier...
LG
Sabi
Anzeige
AW: Spalten gruppieren
24.02.2022 15:55:53
Sabine
Ich habe jetzt eingefügt, dass die Spalten gleich zugeklappt werden.
Nun wollte ich noch einfügen, dass das Makro startet, wenn der Wert in Zelle C6 sich ändert:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.Count > 1 Then Exit Sub
If Intersect(Target, Range("$C$6")) Is Nothing Then Exit Sub
Dim Sp As Long
Const SP_anf = 37
Const SP_end = 92
'ActiveSheet ist immer default, es sei denn, der Code ist in dem Codefenster eines Blattes. Dann ist immer dieses Blatt per Default gemeint
'Alles ungruppieren, fehlertolerant
On Error Resume Next  'Ignoriere den Fehler und mache einfach weiter
Range(Cells(1, SP_anf), Cells(1, SP_end)).EntireColumn.Ungroup
On Error GoTo 0 'Nicht mehr fehlertolerant
'Finden, wo die Bedingung noch zutriff
Sp = SP_end
Do Until Cells(7, Sp).Value = Range("C6").Value And Sp > SP_anf
Sp = Sp - 1
Loop
Range(Cells(1, Sp + 1), Cells(1, SP_end)).EntireColumn.Group
ActiveSheet.Outline.ShowLevels RowLevels:=0, ColumnLevels:=1
ActiveSheet.Outline.ShowLevels RowLevels:=1
End Sub
Allerdings funktioniert es leider nicht.
Weiß da jemand einen Rat?
LG,
Sabi.
Anzeige
AW: Spalten gruppieren
24.02.2022 16:20:07
Yal
Hallo Sabine,
das Ändern eines Zellwertes wird mit SelectionChange abgefangen. Jedoch tückisch, denn Target ist die Zelle, wo man ankommt, aber nicht die die man gerade verlassen hat. Man fängt die "alte Adresse" mit einer statischen Variable, die immer am Ende neu gesetzt wird.
Ereignisse ("Events") haben die Besonderheit, dass die durch Ereignis abgebrochen werden können. Was auch zu einer -fast- Endlosschleife führen kann.
Daher sollte man immer in einer Ereignisbehandlung einen Ereignis-Blocker haben: Application.EnableEvents = False und am Ende Application.EnableEvents = True

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Static Memory As String
Dim Sp As Long
Const SP_anf = 37
Const SP_end = 92
If Target.Cells.Count > 1 Then GoTo Memory_Save
If Intersect(Target, Range(Memory)) Is Nothing Then GoTo Memory_Save
'Alles ungruppieren, fehlertolerant
On Error Resume Next  'Ignoriere den Fehler und mache einfach weiter
Range(Cells(1, SP_anf), Cells(1, SP_end)).EntireColumn.Ungroup
Application.EnableEvents = False
'Finden, wo die Bedingung noch zutriff
Sp = Range("AK7:CK7").Find(What:=Range("C6")).Column
If Sp > 0 Then Range(Cells(1, Sp + 1), Cells(1, SP_end)).EntireColumn.Group
'Gruppierung zuklappen
ActiveSheet.Outline.ShowLevels RowLevels:=0, ColumnLevels:=1
ActiveSheet.Outline.ShowLevels RowLevels:=1
GoTo Memory_Save:
Memory = Target.Range("A1").Address '"A1" ist der relative bezug, falls Target mehr als eine Zelle hat
Application.EnableEvents = True
End Sub
VG
Yal
Anzeige
Korrektur
24.02.2022 17:04:11
Yal
Ganz unten, nicht

ActiveSheet.Outline.ShowLevels RowLevels:=1
GoTo Memory_Save:
Memory = Target.Address
Application.EnableEvents = True
End Sub
sondern

ActiveSheet.Outline.ShowLevels RowLevels:=1
Memory_Save:
Memory = Target.Address
Application.EnableEvents = True
End Sub
Sonst kommt "Sprungmarke nicht definiert".
VG
Yal
Korrektur 2
24.02.2022 17:07:20
Yal
Man sollte ja seine Code testen...
Da der erste Intersect mekert, solang "Memory" noch nicht einmal befüllt wurde, habe ich den On Error Resume Next davor gestellt.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Static Memory As String
Dim Sp As Long
Const SP_anf = 37
Const SP_end = 92
On Error Resume Next  'Ignoriere den Fehler und mache einfach weiter
If Target.Cells.Count > 1 Then GoTo Memory_Save
If Intersect(Target, Range(Memory)) Is Nothing Then GoTo Memory_Save
'Alles ungruppieren, fehlertolerant
Range(Cells(1, SP_anf), Cells(1, SP_end)).EntireColumn.Ungroup
Application.EnableEvents = False
'Finden, wo die Bedingung noch zutriff
Sp = Range("AK7:CK7").Find(What:=Range("C6")).Column
If Sp > 0 Then Range(Cells(1, Sp + 1), Cells(1, SP_end)).EntireColumn.Group
'Gruppierung zuklappen
ActiveSheet.Outline.ShowLevels RowLevels:=0, ColumnLevels:=1
ActiveSheet.Outline.ShowLevels RowLevels:=1
Memory_Save:
Memory = Target.Address
Application.EnableEvents = True
End Sub
VG
Yal
Anzeige
Makro Start bei Änderung Zelle
24.02.2022 17:09:41
Sabine
Hallo Yal,
danke für die Unterstützung.
Er hat jetzt gebracht Fehler bei Kompilierung o.ä.
Ich habe dann das Memory_Save noch definiert aber hat nicht geholfen.
Ich beschäftige mich morgen damit.
LG
Sabi
Korrektur 3
24.02.2022 20:43:18
Yal
Man... bin ich aus der Übung.
es geht doch mit Worksheet_Change. ABER. In C6 muss eine Wert eingetragen werden, keine Formel. Auf Änderung der Ergebnis eine Formel (die selbst sich nicht ändert) reagiert das Ereignis-Prozedure nicht. Dann muss Du suchen, in welcher Zelle eine Eingabe gemacht wird, die zu einem neuen ergebnis in der Zelle C6 führt.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Sp As Long
Const SP_anf = 37
Const SP_end = 92
On Error Resume Next  'Ignoriere den Fehler und mache einfach weiter
If Target.Address  "$C$6" Then Exit Sub
'Alles ungruppieren, fehlertolerant
Range(Cells(1, SP_anf), Cells(1, SP_end)).EntireColumn.Ungroup
Application.EnableEvents = False
'Finden, wo die Bedingung noch zutriff
Sp = Range("AK7:CK7").Find(What:=Range("C6")).Column
If Sp > 0 Then Range(Cells(1, Sp + 1), Cells(1, SP_end)).EntireColumn.Group
'Gruppierung zuklappen
ActiveSheet.Outline.ShowLevels RowLevels:=0, ColumnLevels:=1
ActiveSheet.Outline.ShowLevels RowLevels:=1
Application.EnableEvents = True
End Sub
VG
Yal
Start Makro bei Änderung Zelle
25.02.2022 08:54:37
Sabine
Guten Morgen Yal,
die Erklärung

"In C6 muss eine Wert eingetragen werden, keine Formel. Auf Änderung der Ergebnis eine Formel (die selbst sich nicht ändert) reagiert das Ereignis-Prozedure nicht. Dann muss Du suchen, in welcher Zelle eine Eingabe gemacht wird, die zu einem neuen Ergebnis in der Zelle C6 führt."
hat sehr geholfen!
In der Zelle C7, also darunter, ist ein Dropdown (variabel), in dem man die KW auswählen kann.
Von da aus zieht es sich dann in Zelle C6, d.h. in Zelle C6 steht (wenn(in Zelle C7 was steht; nimm Zelle C7; sonst die vergangene Woche).
Wenn ich bei der Dropdown was auswähle, rechnet sich nun das Makro. Super.
Wenn ich die Zahl aus Zelle C7 lösche, also entf drücke, dann allerdings nicht, Das verstehe ich noch nicht ganz...*Schulter zuck*
Mein Code sieht jetzt so aus:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.Count > 1 Then Exit Sub
If Intersect(Target, Range("$C$7")) Is Nothing Then Exit Sub
Dim Sp As Long
Const SP_anf = 37
Const SP_end = 92
'ActiveSheet ist immer default, es sei denn, der Code ist in dem Codefenster eines Blattes. Dann ist immer dieses Blatt per Default gemeint
'Alles ungruppieren, fehlertolerant
On Error Resume Next 'Ignoriere den Fehler und mache einfach weiter
Range(Cells(1, SP_anf), Cells(1, SP_end)).EntireColumn.Ungroup
On Error GoTo 0 'Nicht mehr fehlertolerant
'Finden, wo die Bedingung noch zutriff
Sp = SP_end
Do Until Cells(7, Sp).Value = Range("C6").Value And Sp > SP_anf
Sp = Sp - 1
Loop
Range(Cells(1, Sp + 1), Cells(1, SP_end)).EntireColumn.Group
ActiveSheet.Outline.ShowLevels RowLevels:=0, ColumnLevels:=1
ActiveSheet.Outline.ShowLevels RowLevels:=1
End Sub
und funktioniert soweit auch. Super. Nur eben wenn ich die Zahl lösche aus C7 tut sich nichts. dann muss ich das Makro manuell starten.
LG
Sabi
AW: Start Makro bei Änderung Zelle
25.02.2022 11:12:30
Yal
... dann anstatt in C7 was zu entfernen, lege immer "54" rein.
Ich sehe aber, dass Du immer noch den Do Until verwendest (der Find funkioniert auch wie einen Charm) und den Fallschirm-Klausel nicht angepasst hast.
Sage bitte dann nicht, dass ich Dich nicht vorgewarnt hätte...
VG
Yal
AW: Start Makro bei Änderung Zelle
25.02.2022 11:42:51
Sabine
Hallo Yal,
ja den Rest muss ich noch anpassen. Das war mir dann etwas zu wirr. Da kam eine Korrektur und die Korrektur der Korrektur.
Da muss ich mich noch einmal durchwurschteln und ich möchte es ja auch verstehen. Nicht nur copy+paste.
Danke für deine Hilfe.
LG,
Sabi
Übersicht: drück aufm blauen "zum Archivthread" oT
25.02.2022 11:48:33
Yal
AW: Spalten gruppieren
24.02.2022 16:00:28
Yal
hallo Sabine,
Herzliche Glückwunsch.
Jedoch pass bei einem Do While / Do Until in Kombination mit einer Gleichheitsbedingung auf: es könnte in Endloschleife harten. Da hilft nur noch, Excel mit Task Manager abschiessen.
Auch die Änderung eines Do While in Do Until sollte dazu führen, dass die Fallschirm-Klausel angepasst wird.
Ist mir inzwischen eingefallen: mit einer Wertsuche geht es ganz gut:

Sub Spalten_ausblenden()
Dim Sp As Long
Const SP_anf = 37
Const SP_end = 89
On Error Resume Next  'Ignoriere den Fehler und mache einfach weiter
Range(Cells(1, SP_anf), Cells(1, SP_end)).EntireColumn.Ungroup
'Finden, wo die Bedingung noch zutriff
Sp = Range("AK7:CK7").Find(What:=Range("C6")).Column 'Achtung verursacht ev. auch ein Fehler. Den "On Error Goto 0" habe ich rausgenommen
If Sp >= Sp_anf Then Range(Cells(1, Sp), Cells(1, SP_end)).EntireColumn.Group
End Sub
Es ist nur die Frage, ob bei der Eingabe "7" in C6 die Woche 7 mitgruppiert werden soll oder nicht.
Wenn nicht dann

If Sp >= Sp_anf Then Range(Cells(1, Sp + 1), Cells(1, SP_end)).EntireColumn.Group
VG
Yal

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige