VBA Zeilen Ein/Ausblenden wenn bestimmter Wert

shintaro

Cadet 2nd Year
Registriert
Okt. 2015
Beiträge
27
Guten Tag,

bisher konnte ich keinen passgenauen Beitrag finden, der meine Lösung bereithält.

Die Zelle B6 habe ich mit einem Kombinationsfeld (Active-X) verlinkt. Wenn ich in dem Kombinationsfeld ("A") anklicke, und dementsprechend in Zelle B6 dann A steht, sollen bestimmte Zeilen eingeblendet und andere ausgeblendet werden. Dasselbe gilt für B,C,D,E,F.
Als Bsp.
Bei A = alle Zeilen anzeigen
Bei B = Zeile 10:99 Einblenden, 100:600 Ausblenden
Bei C = Zeile 10:99 Ausblenden, 100:250 Einblenden, 250:600 Ausblenden
usw.

bisherige Lösung sieht so aus:
If Range("B6").Value = "A" Then
Rows("10:700").Hidden = False
End If
If Range("B6").Value = "B" Then
Rows("10:99").Hidden = False
Rows("100:600").Hidden = True
End If
If Range("B6").Value = "C" Then
Rows("10:99").Hidden = True
Rows("100:250").Hidden = False
Rows("251:600").Hidden = True
End If

Funktioniert allerdings nicht wirklich, nur manuell über "Starten" des Makros. Mir fehlt also der Part, der dafür sorgt, dass es automatisch passiert. Leider kenn ich mich nicht genug mit VBA aus, um dieses Problem zu lösen.

Ich danke euch für eure Hilfe!
 
Hilft mir jetzt leider noch nicht so weiter, hab es bereits in Worksheet Change eingebettet


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Range("B6").Value = "A" Then
Rows("10:700").Hidden = False
End If
If Range("B6").Value = "B" Then
Rows("10:99").Hidden = False
Rows("100:600").Hidden = True
End If
If Range("B6").Value = "C" Then
Rows("10:99").Hidden = True
Rows("100:250").Hidden = False
Rows("251:600").Hidden = True
End If
End Sub
Ergänzung ()

Also an sich muss ich nur Wissen, wie er den Sub automatisch ausführt, sobald sich der Wert in Zelle B6 ändert. Der Befehl an sich tut was er soll.
 
Zuletzt bearbeitet:
Füge ein Modul ein (Public, nicht Private).
Was wird in Zelle "B6" angezeigt, A oder 1? Bei mir werden korrekterweise Zahlen angezeigt.
So wie unten hat's bei mir funktioniert.

Public Sub HideOrUnhide()
If Range("B6").Value = 1 Then
Rows("10:700").Hidden = False
End If
If Range("B6").Value = 2 Then
Rows("10:99").Hidden = False
Rows("100:600").Hidden = True
End If
If Range("B6").Value = 3 Then
Rows("10:99").Hidden = True
Rows("100:250").Hidden = False
Rows("251:600").Hidden = True
End If

End Sub
 
Nein ein Text, also bspw. "Arbeitslose in MV" - kann ich definitiv nicht mit einer Zahl ersetzen. Allerdings funktioniert der Sub beim Ausführen ja, insofern seh ich darin nicht das Problem.

Wie genau funktioniert das ein "Public" Modul einfügen? Habe es so wie du benannt geändert und ein Modul mit dem Befehl erstellt. Leider funktioniert es immer noch nur über "Sub/Userform ausführen"
 
Hier mal aus einem meiner Excel-Dokumente als Beispiel:
(das gehört in Worksheet.Change deines Sheets)

Private Sub Worksheet_Change(ByVal Target As Range) If (Target.Column = 2 And Target.Row = 9) Then If (Range("B2").Value = 2015 Or Range("B2").Value = 2016) Then Rows("5:6").EntireRow.Hidden = False Else Rows("5:5").EntireRow.Hidden = False Rows("6:6").EntireRow.Hidden = True End If End If End Sub
 
Hm, ist aber ja bei dir ein anderer Fall - wüsste grad nicht, wie ich das übertragen soll
 
Warum ist das ein anderer Fall?
Abhängig vom Wert in einer Zelle werden Zeilen ein- oder ausgeblendet.
Das ist doch sogar nicht mal nur ähnlich, sondern exakt das selbe.

Edit/Erläuterung:
Beim ersten If frage ich ab, wann er das ganze überhaupt ausführen soll, nämlich nur dann, wenn in meinem Beispiel die Zelle in Spalte 2 Zeile 9 verändert wird. Mann will ja nicht, dass der ganze Code jedesmal läuft, wenn irgendwas auf dem Sheet verändert wird.
Danach das If Else blendet dann abhängig vom Wert in z.B. B2 bestimmte Zeilen aus und / oder ein.
 
Zuletzt bearbeitet:
Okay dann versteh ich es wohl nicht

If (Target.Column = 2 And Target.Row = 9) Then
-> Wofür diese Angabe?

If (Range("B2").Value = 2015 Or Range("B2").Value = 2016) Then
-> Seh keinen Sinn das bei mir mit "or" zu kennzeichen, da es 10 verschiedene Auswahlmöglichkeiten gibt

Else
Rows("5:5").EntireRow.Hidden = False
Rows("6:6").EntireRow.Hidden = True
-> Wann tritt dieser Fall ein? Verstehe es so, dass alle Zeilen angezeigt werden sollen, sofern 2015 oder 2016 in der Zelle B2 steht. Verstehe die Bedingung für "Else" nicht, wann wird denn Zeile 5 ausgeblendet und zeile 6 eingeblendet und wieso?
 
Hatte parallel zu deinem Post schon ne Erläuterung im letzten Post ergänzt.
In meinem Fall sind es halt zwei Möglichkeiten (2015,16 oder andere Jahre), bei deinen vielen Möglichkeiten machst du halt entweder viele If oder du nimmst ein Case.
Wenn ich gleich nochmal Luft habe, kann ich es dir aber auch mal komplett für deinen Fall umschreiben.
 
Mal abgesehn davon ist mein Problem ja, dass die Sub funktioniert aber nicht automatisch ausgeführt wird wenn sich der Wert in B6 ändert! Wenn ich die Sub manuell ausführe, wird es so getan wie es soll
Ergänzung ()

Also wenn ich deine Variante jetzt umschreibe, wie du es meinst dann bin ich ja bei dem gleichen Ergebnis mit dem Unterschied, dass du "EntireRow" noch dabei hast also:


If Range("B6").Value = A Then
Rows("10:700").EntireRow.Hidden = False
End If
If Range("B6").Value = 2 Then
Rows("10:99").EntireRow.Hidden = False
Rows("100:600").EntireRow.Hidden = True
End If
If Range("B6").Value = 3 Then
Rows("10:99").EntireRow.Hidden = True
Rows("100:250").EntireRow.Hidden = False
Rows("251:600").EntireRow.Hidden = True
Ergänzung ()

Ah deinen Edit jetzt gesehen... Also noch

If (Target.Column = 2 And Target.Row = 2) Then

oben drüber, damit er das nur nach Änderung von B2 ausführt?
 
Zuletzt bearbeitet:
Private Sub Worksheet_Change(ByVal Target As Range) If (Target.Column = 2 And Target.Row = 6) Then Select Case Range("B6").Value Case "A": Rows("10:700").EntireRow.Hidden = False Case "B": Rows("10:99").EntireRow.Hidden = False Rows("100:600").EntireRow.Hidden = True Case "C": Rows("10:99").EntireRow.Hidden = True Rows("100:250").EntireRow.Hidden = False Rows("251:600").EntireRow.Hidden = True End Select End If End Sub

So müsste es in deinem Fall aussehen.
Die Zeile mit dem If sorgt dafür, dass das ganze nur ausgeführt wird, wenn du den Wert in Spalte2:Zeile6 änderst (das ist ja B6).
Und dann werden einfach je nach Wert in B6 Zeilen ein- oder ausgeblendet. (Select Case ist wesentlich eleganter und besser zu lesen als lauter If)
Ergänzung ()

Ach und zum automatischen Ausführen: Der Code steht ja in Worksheet_Change (oben in den beiden DropDowns einfach links "Worksheet" und rechts "Change" auswählen) - das heißt, er wird vollautomatisch ausgeführt, wenn du was änderst. Brauchst du nicht in irgendein Modul oder so schreiben sondern direkt im Code von dem Sheet, wo das laufen soll.
 
Zuletzt bearbeitet:
Danke dir für deine Hilfe. Soweit alles Verstanden und für mich logisch... leider ändert sich immer noch nichts nach Auswahl :(
Ergänzung ()

Der Fehler liegt wohl im Dropdown, hab es ja als Active X Steuerelement gemacht und mit der Zelle B6 verlinkt - liegt da der Fehler? Bei manueller Eingabe von "A" "B" usw. funktioniert es. Allerdings scheint er den Zellwert nicht als das anzuerkennen, wenn ich ihn nach dem Kombinationsfeld ändere
Ergänzung ()

Hab es jetzt einfach über ein simples Dropdown-Menü gelöst - jetzt funktionierts. Danke für die Hilfe!
 
Zuletzt bearbeitet:
Ihr seid ein paar Knaller. Change Events sind schonmal eine gute Idee, aber wie wärs wenn ihr das Change Event der Combo Box abfangt?


Wenn du es tatsächlich als ActiveX eingebunden hast, machst du einfach einen Rechtsklick drauf und klickst dann auf Code anzeigen ... schon bist du in der entsprechenden SUB. Natürlich während du dich im Design Modus befindest.

Wenn du das Teil als normales Form Control eingebunden hast, mach einen Rechtsklick und klick dann auf Makro Zuweisen. Excel schlägt es dir sowas wie DropDown2_Change vor. Klick auf erstellen und schon kannst du loslegen.

Hab noch ne kleine Testdatei angelegt, da kannst du ein bisschen rumspielen.
 

Anhänge

  • ComboBox_Test.zip
    17,8 KB · Aufrufe: 400
Da er anscheinend nicht viel Erfahrung mit VBA hat, fand ich es fürs erste einfacher, die Variante mit Worksheet.Change und Zellabfrage dahinter zu wählen, weil er die immer nehmen kann, egal ob ComboBox, normaler Inhalt oder sonst was.
 
Also soweit bin ich von der bisherigen Variante überzeugt, zumindest funktioniert alles reibungslos. Oder gibt es irgendwelche Komplikationen, die künftig Probleme erzeugen könnten?
ActiveX hab ich komplett rausgelassen und mach es, wie zuvor erwähnt, über ein Dropdown Menü.

Trotzdem danke für deine Hilfe Janush! Und ja leider erst ganz neu in VBA eingestiegen und am erforschen der Möglichkeiten ;)

Beste Grüße
 
Zurück
Oben