Hallo zusammen,
ich benötige hier kurz eure Hilfe!
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!
:15:
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
Hallo Semmy,
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
Vielen Dank euch beiden!
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.
Vielen Dank euch beiden!
Ihr habt mir sehr geholfen.
Beste Grüße und einen schönen Tag noch!
:15:
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
(27.08.2020, 09: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 kommt dann ein Fehler bei
Zelle.Select
keine Ahnung was ich da machen muss
Hallo,
lösche die Zeile, die brauchst Du nicht.
Danke dir.
war ja doch ganz einfach.
Ich versuch es dann mal in meine Hauptliste einzubauen.
mal sehen ob es dann so klappt wie ich es mir vorgestellt habe.
Danke euch!
Ich brauche doch noch mal Hilfe.
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.
Vielen Dank!
Hallöchen,
in einem Code weiter oben prüfst Du den Monat:
If InStr(Zelle, Monate(i, 1)) Then
Bei zwei Bedingungen prüfst Du beide, im Prinzip:
If InStr(Zelle, Monate(i, 1)) And InStr(Zelle, "AAA") Then