Ich bin grade dabei eine Auswertung zu bauen und möchte etwas an der Benutzerfreundlichkeit anpassen.
Es geht um folgendes: In der Liste sind sehr viele Spalten enthalten die erst im laufe des Jahres befüllt werden können (nach Monaten).
In vielen Überschriften der Tabellenspalten sind die Monate als Text enthalten. Ich habe bereits eine kleine Legende erstellt in der die Monate aufgeführt sind und daneben gibt es die Möglichkeit mit einem Doppelklick ein Haken zu setzten (hat den Wert 1).
Jetzt benötige ich ein Marko, welches 2 Dinge macht. 1. Es dürfen nur Spalten ein oder ausgeblendet werden in denen überhaupt ein Monat aufgeführt ist (in der Testdatei ist die erste Spalte "Nr", diese soll gar nicht von dem Makro erfasst werden und immer stehen gelassen werden, da kein Monat enthalten ist) 2. Es sollen nur die Spalten angezeigt werden die in der Legende mit einem Haken versehen wurden.
Ich hoffe es findet sich jemand der mir hier helfen kann.
Vielen Dank im Voraus an alle die sich dem annehmen möchten!
Sub Spaltenkontrolle() Dim Zelle As Range, Monate, i As Long Application.ScreenUpdating = False Monate = Range("C2:D13") For Each Zelle In Range("i16:AR16") For i = 1 To UBound(Monate, 1) If InStr(Zelle, Monate(i, 1)) Then Zelle.EntireColumn.Hidden = IIf(Monate(i, 2) = 1, False, True) Exit For End If Next i Zelle.Select Next Zelle Application.ScreenUpdating = True End Sub
Weise dem blauen Button das Makro zu und starte dann.
Probier es mal aus.
Gruss Raoul
Folgende(r) 1 Nutzer sagt Danke an Raoul21 für diesen Beitrag:1 Nutzer sagt Danke an Raoul21 für diesen Beitrag 28 • SemmyW
schau mal, ob anliegender Code in Deinem Sinne funktioniert.
Es sind ja nur wenige Spalten, so dass aller in einer Schleife ein/ausgeblendet werden kann. Bei sehr vielen Spalten könnte man die einzublendenden Spalte auch sammeln und in einem Rutsch einblenden.
Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Not Intersect(Target, Range("D2:D13")) Is Nothing Then With Application .Cursor = xlNorthwestArrow If Target = 1 Then Target = vbNullString Else Target = 1 .Cursor = xlDefault Cancel = True End With End If
End Sub
Private Sub Worksheet_Change(ByVal Target As Range) Dim iZeile As Long, rZelle As Range
If Not Intersect(Target, Range("D2:D13")) Is Nothing Then
With Application .ScreenUpdating = False .EnableEvents = False End With
Range("I16:AR16").EntireColumn.Hidden = True 'Alles ausblenden For Each rZelle In Range("I16:AR16") 'Kopfbereich festlegen For iZeile = 2 To 13 'Alle Monate durchgehen With Cells(iZeile, "C") If .Value Like Right$(rZelle.Value, Len(.Value)) Then If .Offset(0, 1).Value = 1 Then rZelle.EntireColumn.Hidden = False 'Einblenden End If End If End With
Next iZeile Next rZelle
With Application .ScreenUpdating = True .EnableEvents = True End With
End If
End Sub
viele Grüße aus Freigericht Karl-Heinz
Folgende(r) 1 Nutzer sagt Danke an volti für diesen Beitrag:1 Nutzer sagt Danke an volti für diesen Beitrag 28 • SemmyW
Die richtige Datei hat später ca 800 Spalten und es werden nicht alle Spalten mit einem Monatsnamen nebeneinander aufgeführt.
Ich habe jetzt beides testen können und der Code von Raoul hat in meinen kleinen Tests besser funktioniert, da er wirklich die Spalten in "ruhe" lässt die keinen der Monatsnamen im Titel enthalten.
Die Option von volti, dass die Liste sofort aktualisiert wird finde ich auch nicht schlecht.
27.08.2020, 11:33 (Dieser Beitrag wurde zuletzt bearbeitet: 27.08.2020, 11:33 von volti.)
Hallo Semmy,
danke für die Rückmeldung.
Ich hatte es auch erst so wie Raoul, also dass jede Spalte einzeln ein/ausgeblendet wird und damit wären auch Spalten ohne Monatsname "in Ruhe" gelassen worden. Das habe ich später geändert.
Mir war angesichts der Musterdatei nicht bewusst, dass es auch noch andere Spalten gibt...
viele Grüße Karl-Heinz
Folgende(r) 1 Nutzer sagt Danke an volti für diesen Beitrag:1 Nutzer sagt Danke an volti für diesen Beitrag 28 • SemmyW
27.08.2020, 12:45 (Dieser Beitrag wurde zuletzt bearbeitet: 27.08.2020, 12:57 von SemmyW.)
(27.08.2020, 10:41)Raoul21 schrieb: Hi Semmy
probier mal
Code:
Sub Spaltenkontrolle() Dim Zelle As Range, Monate, i As Long Application.ScreenUpdating = False Monate = Range("C2:D13") For Each Zelle In Range("i16:AR16") For i = 1 To UBound(Monate, 1) If InStr(Zelle, Monate(i, 1)) Then Zelle.EntireColumn.Hidden = IIf(Monate(i, 2) = 1, False, True) Exit For End If Next i Zelle.Select Next Zelle Application.ScreenUpdating = True End Sub
Weise dem blauen Button das Makro zu und starte dann.
Probier es mal aus.
Gruss Raoul
Ich brauche doch nochmal Hilfe. in meiner Tabelle sind Legende und die Tabelle mit den Daten nicht auf dem selben Blatt. Du hast hier ja einfach nur die Zellen ausgewählt in dem Blatt, welches ich grade betrachte.
für die legende habe ich es geschafft die Daten dem Datenblatt zuzuweisen: Monate = Sheets("tabelle1").Range("C2:D13")
aber wenn ich dies für die Tabelle mit den Monatsdaten anpasse kommt ein Fehler.
Vielen Dank schon mal! Also um das nochmal klar zustellen,
Es wurde jetzt noch eine stufe komplizierter. Dachte ich könnte es selber erweitern, aber da sitze ich schon zu lange dran ...
Ich hatte Ursprünglich geplant einfach nur die Monate ein oder ausblenden zu lassen, also 1 Kriterium.
Jetzt bräuchte ich dies für 4 Kriterien die sich gegenseitig nicht ausschließen sollen. Ich meine damit, dass wenn es eine Zelle gibt die "HerstellerAAA Dezember" heißt und eine Zelle mit "HerstellerBBB Dezember", dass ich jetzt ein Haken bei Hersteller AAA setzte und einen Haken bei Dezember und ich somit nur noch die Zelle "HerstellerAAA Dezember" angezeigt bekommen.
ich habe meine Testliste jetzt entsprechend erweitert.