Wie kann man in Excel per VBA abhängig von einem Wert Spalten aus-/einblenden?
Hey. Ich weiß zu diesem Thema gibt es schon ein paar Einträge im Netz. jedoch habe ich es nie für mich umformuliert bekommen. Vielleicht kann mir hier jemand helfen?
In Zelle G6 steht ein Wert von 1-6. Abhängig davon sollen dann immer andere Spalten ausgeblendet werden. Mein Code zur Zeit:
Sub Ausblenden()
'
' Ausblenden Makro
'
' Tastenkombination: Strg+a
'
If "G6" = "1" Then
Columns("v:bn").EntireColumn.Hidden = False
Columns("v:bn").EntireColumn.Hidden = True
Else
If "G6" = "2" Then
Columns("v:bn").EntireColumn.Hidden = False
Columns("ae:bn").EntireColumn.Hidden = True
Else
If "G6" = "3" Then
Columns("v:bn").EntireColumn.Hidden = False
Columns("an:bn").EntireColumn.Hidden = True
Else
If "G6" = "4" Then
Columns("v:bn").EntireColumn.Hidden = False
Columns("aw:bn").EntireColumn.Hidden = True
Else
If "G6" = "5" Then
Columns("v:bn").EntireColumn.Hidden = False
Columns("bf:bn").EntireColumn.Hidden = True
Else
If "G6" = "6" Then
Columns("v:bn").EntireColumn.Hidden = False
End If
End If
End If
End If
End If
End If
End Sub
Ich bin ein VBA anfänger, also bitte seit nachsichtig x). Danke schon einmal im voraus!
2 Antworten
Dein Code sieht gar nicht so schlecht aus. Um den Wert einer Zelle anzusprechen, musst du aber Range("G6") schreiben, und nicht einfach "G6". Eigentlich wäre es sogar Range(“G6”).Value, aber wenn man das nicht dazuschreibt, ist es immer die Eigenschaft “Value”.
Wenn du nur ein Arbeitsblatt hast, ist Range eindeutig, sonst eventuell ActiveSheet.Range oder Sheets("Reitername").Range("G6")
Die Struktur mit den vielen End If am Ende ist nicht so schön, da kommt man durcheinander. Dafür gibt es “ElseIf”, wo man viele Bedingungen hintereinanderschreiben kann. Schau dir online mal Beispiele an wie das geht (suche "VBA IF ELSEIF" oder so)
Noch besser ist “Select Case”. Da brauchst du die Range nur einmal hinzuschreiben. Das geht so:
Select Case Range(“G6”)
Case “1”
Columns…
Case “2”
Columns…
(…)
End Select
Lass es am besten erstmal so wie es ist, und bring es mit Range("G6") zum Laufen.
Den verbesserten Stil kannst du dann ja danach noch ausprobieren.
Na klar. Da brauchst du diese voreingestellten "Events", die du im Object-Browser in dem Arbeitsblatt findest.
Wenn du links "Worksheet" und rechts "Change" auswählst, kommt automatisch eine solche Prozedur, die du nur noch ausfüllen musst. Das läuft, wenn eine Zelle geändert wird.
Private Sub Worksheet_Change(ByVal Target As Range)
End Sub
Da kann einfach der Name deines anderen Makros rein, damit es ausgeführt wird. Oder du fragst erst ab, ob es wirklich Zelle “G6” ist, die sich geändert hat, also:
If Target Is Range(“G6”) Then...
Guten Abend. Ich habe jetzt den Objektbrowser gefunden und Worksheet + Change ausgewählt. Wie ich das jetzt aber bei mir einfüge, weiß ich leider nicht.
Und wenn ich "Sub Ausblenden()" gegen "Private Sub Worksheet_Change(ByVal Target As Range)" tausche, funktioniert es nicht. Es wäre nett, wenn du mir da nochmal kurz helfen könntest. Danke :D
Sub Worksheet_Change(ByVal Target As Range)
If Target Is Range(“G6”) Then Sub Ausblenden()
end sub
diese 'einzeilige' Kurzfassung sollte gehen (weil in diesem Sub kein else vorhanden, man spart sich so end if), die Langfassung geht so
Sub Worksheet_Change(ByVal Target As Range)
If Target Is Range(“G6”) Then
Sub Ausblenden()
end if
end sub
das Private ist ebenfalls nicht zwingend erforderlich, gibt hier keinen Grund dafür, ausser dass es vllt in der Makroliste verborgen wird (hab ich nicht ausprobiert)
Hallo Geo700,
Wegen der Event-Steuerung muss ich nochmal eine neue Antwort aufmachen, damit ich ein Bild einfügen kann.
Der Makroname wird nicht ersetzt, sondern in die Event-Prozedur eingefügt wie gezeigt. "MyMacro" durch den richtigen Namen ersetzen.
“Sheet1” ist links ausgewählt.
![- (Computer, programmieren, Microsoft Excel)](https://images.gutefrage.net/media/fragen-antworten/bilder/331665277/0_big.jpg?v=1576918235000)
Hi nochmal. Wenn ich nerve dann lass es, aber danke erstmal bis hier her...
Mein Code im Sheet1 ist jetzt:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target Is Range("G6") Then
Ausblenden
End If
End Sub
Und darüber steht im linken Kästchen "Worksheet" und im rechten "Change". In Modul4 steht der Code
Sub Ausblenden()
'
' Ausblenden Makro
'
' Tastenkombination: Strg+a
'
If "G6" = "1" Then
Columns("v:bn").EntireColumn.Hidden = False
Columns("v:bn").EntireColumn.Hidden = True
Else
If "G6" = "2" Then
Columns("v:bn").EntireColumn.Hidden = False
Columns("ae:bn").EntireColumn.Hidden = True
Else
If "G6" = "3" Then
Columns("v:bn").EntireColumn.Hidden = False
Columns("an:bn").EntireColumn.Hidden = True
Else
If "G6" = "4" Then
Columns("v:bn").EntireColumn.Hidden = False
Columns("aw:bn").EntireColumn.Hidden = True
Else
If "G6" = "5" Then
Columns("v:bn").EntireColumn.Hidden = False
Columns("bf:bn").EntireColumn.Hidden = True
Else
If "G6" = "6" Then
Columns("v:bn").EntireColumn.Hidden = False
End If
End If
End If
End If
End If
End If
End Sub
Nur jetzt passiert nichts mehr. Es wird nichts ausgeblendet. Vielleicht kannst du mir ja nochmal helfen. Vielen Dank nochmal für deine restlichen Antworten.
Da steht wieder nur “G6”. Eine Bedingung wie “G6”=”1” trifft natürlich nie zu… Da muss Range(“G6”) hin. Ansonsten sollte es passen.
Stimmt ja... ich hatte da nochmal dran rum probiert. Nun funktioniert es wieder, wenn ich das Makro manuell starte. Automatisch leider nicht. Vielleicht ist noch wichtig zu sagen, dass die Zelle durch eine Formel geändert wird und nicht manuell. Ansonsten drücke ich halt immer auf den Command-Button. Wenn es nicht geht, dann gehts nicht.
Ich habe mal ein bisschen im Netz gesucht. Vielleicht hilft das:
"das Change()-Event reagiert nicht auf Berechnungen sondern 'nur' auf Eingaben in die Zelle.
Bei Formeln verändert sich am Inhalt der Zelle ja nichts, da steht immer dieselbe Formel drin.
Verwende daher das Calculate()-Event. Hier hast Du dann allerdings kein Target-Objekt mehr zur Verfügung sondern musst die betreffende Zelle direkt prüfen." http://www.office-loesung.de/ftopic523332_0_0_asc.php
Probier's halt aus. Es gibt ja außer Change noch mehrere andere Events für Worksheet, die man auswählen kann. Das "Target" braucht man ja nicht unbedingt. Calculate sollte passen.
Hey. Danke erstmal, es funktioniert nun super. Weißt du auch, wie ich die Zelle G6 permanent überwachen lassen kann, so dass ich keine Tastenkombination oder keinen Command-Button mehr drücken muss?