Spalten via VBA ein und Ausblenden lassen, Wenn "Name" im Dropdown Menü?
Hallo Zusammen,
ich erarbeite aktuell ein Formular aus, dass mir und meinen Kollegen die Arbeit erleichtern soll. Jedoch komme ich gerade in VBA nicht weiter.
Hier ein Screenshot vom aktuellen Prototypen
Folgendes ist geplant
1. Anfragetyp
hat 3 Werte, nennen wir Sie "A", "B" und "C".
1.1. Je nach ausgewähltem Wert sollen sich Spalten Ein- und Ausblenden. Wenn kein Wert drinnen steht, aber "Bitte Auswählen" wie oben im Screenshot angezeigt, dann sollen alle Spalten eingeblendet sein.
2. Zusatzanfrage
hat auch 3 Werte, dieselben wie oben "A", "B" und "C".
2.1. Hier möchte ich, dass wenn ich beim Anfragetypen "A" ausgewählt habe, ich die Möglichkeit habe, separat bei Zusatzanfrage "B" oder "C" auszuwählen, oder halt in verschiedenen variationen.
2.2. Meine Problematik hierbei ist, dass wenn ich bei Anfragetyp "A" Ausgewählt habe, dann sollen sich alle anderen Typen ausblenden, sprich, der Punkt Zusatzanfrage muss den Anfragetypen wieder überschreiben.
2.3. Wenn Option ausgewählt ist, soll nichts passieren. Dies dient lediglich als Info.
Vielleicht denke ich, dass auch einfach komplizierter als es ist. :)
3.1. Lieferantenmenü
Für das Dropdownmenü "Lieferant" werde ich ebenfalls über VBA Spalten Ein- und Ausblenden lassen. Ich habe hier 27 verschiedene Daten, die sich über ebenfalls verschiedene Spalten erstecken.
Meine nächste Problematik ist folgende, dass ich bspw. Spalte "F" und dann "S - Z" ausblenden lassen muss, der Rest in den Spalten davor und auch danach soll aber eingeblendet bleiben. Wie kriege ich das vernünftig in den Code von VBA?
Zusatzinformation: Ich bin ein kompletter Laie in VBA und habe davor damit noch nie gearbeitet, versuche mich aber gerade im Coding ein wenig einzulesen. Wenn Ihr mir zusätzlich zu euren Vorschlägen eine kurze Erklärung geben könntet, wie und warum Ihr das genau so aufgebaut wie Ihr es getan habt, würde mir das sehr für die Zukunft helfen.
Ich danke euch vielmals für eure Unterstützung.
Mit freundlichen Grüßen
Ark
3 Antworten
Zusatzinformation: Ich bin ein kompletter Laie in VBA und habe davor damit noch nie gearbeitet,
Willst Du üben - dann übe. 😉
Ansonsten würde ich zu Deinem Tabellenblatt ein "Deckblatt" kreieren und darin die gesuchten Informationen per SVerweis bzw. per XVerweis abholen und anzeigen lassen.
Je nach ausgewähltem Wert sollen sich Spalten Ein- und Ausblenden. Wenn kein Wert drinnen steht,
Sollten sich dabei "Null-Werte" ergeben würde ich diese Zeilen per Autofilter aus/einblenden. Dazu wäre je ein einfaches Makro für Ein- und Ausblenden möglich, welches per Symbol durch Mausklick bedient werden könnte.
Zunächst einmal wäre für mich wichtig zu wissen, was hast du im Anschluss mit den Werten vor?
Ansehen auswerten, Kunden anrufen, drucken oder was auch immer?
Oder soll mit denen noch was geschehen?
Ich bin generell kein Freund von VBA in Excel, ich hätte daher 2 alternative Ideen.
Ich kenne deine Datenbasis nicht von welchem Umfang wir hier reden, aber ich würde hier tatsächlich eher an Access verweisen, dies scheint mir vom ersten Eindruck die bessere Software dafür zu sein.
Falls es unbedingt Excel sein muss, würde ich eher die dynamischen Arrayfunktionen Verwenden prädestiniert wäre hier der Filter in Kombination mit Spaltenwahl, anstelle also auszublenden zeigst du einfach nur die Relevante Daten an:
Hier ein Beispiel:
hier kommen 2 sehr ähnliche Varianten zum Einsatz, tun aber beide Grundsätzlich das gleiche, nämlich das Ausblenden was du in C2 oder C3 ausgewählt hast.
Zur Erklärung:
VSTAPELN(A6:I6;FILTER(A7:I18;F7:F18=C4))
Dies Stapelt die Überschriften und den Wertebereich übereinander, der Wertebereich wird außerdem nach dem in C4 ausgewählten Wert gefiltert.
SEQZENZ(;SPALTEN(A6:I6))
baut eine Datenreihe in Spaltenrichtung auf mit den Werten 1 bis 9 (sollte deine Tabelle nicht in Spalte A beginnen, muss hier ein Offset her, der dafür sorgt das der niedrigste Werte immer 1 ist.
Nun wird dieser Wert verglichen mit dem Spaltenindex den der Vergleich hervorbringt (Achtung VERGLEICH gibt einen relativen Spaltenindex zurück, daher ist auch der OFFSET nötig, falls die Tabelle nicht in Spalte A beginnt, außerdem prüft WENN ob in C3 optional drin steht, ist dies der Fall wird nur der Wert in C2 zu rate gezogen ist dies nicht der Fall wird der Wert in C3 genommen.
Spaltenwahl nimmt nun jene Werte blendet all jene Spalten ein.
Das war die gesamte Magie.
Die andere Variante unterscheidet sich nur sehr marginal, anstelle eines 2. Filters kommt hier ZUZEILE+WENNS zum Einsatz, WENNS hat im Gegensatz zu WENN die Besonderheit einen Standard Rückgabewert definieren zu können, gibt man diesen aber nicht an und die zuvor verwendeten Bedingungen greifen den Fall nicht ab, dann wird #NV ausgegeben; dies mache ich mir hier zu nutze, Spalten die Ungleich der definierten Spalte sind erhalte ich den Spaltenindex, für diese eine aber #NV.
hier als Bild
Im Anschluss löscht ZUZEILE durch den Parameter ;2 alle Fehler raus, es bleiben also nur noch alle Zahlen übrig.
Wie auch oben verrichtet nun Spaltenwahl noch sein Werk und das war es dann auch schon.
Ich persönlich finde die ZUZEILE Variante besser, da ich sie für Erweiterungen besser geeignet halte.
Ist aber Ende wie immer Geschmackssache.


Mir sagt der Screenshot nicht so viel. Hier wären zwei inaktiv und aktiv eventuell klarer.
Wenn du jedenfalls einen VBA Code brauchst, um etwas in Abhängigkeit ein/auszublenden, versuch folgendes:
Als Makro:
Sub SpalteEinAusblenden()
Dim ws As Worksheet
Dim zielZelle As Range
Dim targetColumn As Long
' Arbeitsblatt definieren
Set ws = ThisWorkbook.Sheets("DeinBlattName")
' Zelle definieren, die den Wert enthält
Set zielZelle = ws.Range("A1")
' Spaltennummer definieren, die ein- oder ausgeblendet werden soll
targetColumn = 3 ' Für Spalte "C"
' Bedingung überprüfen und Spalte ein- oder ausblenden
If zielZelle.Value = "Einblenden" Then
ws.Columns(targetColumn).Hidden = False
ElseIf zielZelle.Value = "Ausblenden" Then
ws.Columns(targetColumn).Hidden = True
End If
End Sub
und als im Hintergrund laufende Routine, die als Ereignis auf "change" reagiert:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim zielZelle As Range
Dim targetColumn As Long
' Zelle definieren, die überwacht wird
Set zielZelle = Me.Range("A1")
targetColumn = 3 ' Für Spalte "C"
' Überprüfen, ob die Änderung in der Zelle "A1" war
If Not Intersect(Target, zielZelle) Is Nothing Then
' Bedingung überprüfen und Spalte ein- oder ausblenden
If zielZelle.Value = "Einblenden" Then
Me.Columns(targetColumn).Hidden = False
ElseIf zielZelle.Value = "Ausblenden" Then
Me.Columns(targetColumn).Hidden = True
End If
End If
End Sub