Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Ein- und Ausblenden mit 2 Bedingungen
#1
Guten Tag zusammen,

ich habe leider ein Problem und komme nicht weiter.

Im Worksheet Application, habe ich eine Reihe mit Dropdowns (yes oder no) und im Zelle 1D habe ich eine Zelle die mit 1 oder 2 durch ein Kreuzfeld variiert.
Im Worksheet Recipe habe ich dann mehrere Tabellen die ein- oder ausgeblendet werden sollen.

Beispiel:
Im Dropdown wird no ausgewählt und in 1D steht irgendwas:
Zeile 10:31 in Recipe ausgeblendet.

Im Dropdown wird yes ausgewählt und in 1D steht 1:
Zeile 10:31 in Recipe eingeblendet aber 21:31 ausgeblendet

Im Dropdown wird yes ausgewählt und in 1D steht 2:
Zeile 10:31 in Recipe eingeblendet aber 18:20 ausgeblendet

Bisheriger Code der leider nicht funktioniert:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)

If Cells(18, 3).Value = "no" Then
Worksheets("Recipe").Range("10:32").EntireRow.Hidden = True
ElseIf Cells(18, 3).Value = "yes" And Cells(1, 4).Value = "2" Then
    Worksheets("Recipe").Range("18:20").EntireRow.Hidden = True
    Worksheets("Recipe").Range("21:31").EntireRow.Hidden = False
ElseIf Cells(18, 3).Value = "yes" And Cells(1, 4).Value = "1" Then
    Worksheets("Recipe").Range("18:20").EntireRow.Hidden = False
    Worksheets("Recipe").Range("21:31").EntireRow.Hidden = True
End If

End Sub



Dies ist eine Erweiterung von dieser Aufgabe:
alt (auch aus dem Forum hier)

Dort war der Finale Code, dieser hier:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)

If Not Application.Intersect(Range("C18"), Range(Target.Address)) Is Nothing Then
   Select Case Target.Value
            Case Is = "yes": Worksheets("Recipe").Rows("10:32").EntireRow.Hidden = False
            Case Is = "no": Worksheets("Recipe").Rows("10:32").EntireRow.Hidden = True
   End Select
End If

End Sub


Leider reichen meine Excel Kenntnisse nicht, um die neuen Bedingungen in den alten Code mit einfließen zu lassen, vielleicht kann mir ja hier einer helfen.

Schon mal vielen Dank euch
Gruß
ExcelVBAAnfänger
Antworten Top
#2
Hallöchen,

Du kannst die neuen Bedingungen doch zusätzlich in den bisherigen Code einfliessen lassen, im Prinzip z.B.

Code:
Case Is = "yes"
  If blabal = "a" Then
    Worksheets("Recipe").Rows("10:32").EntireRow.Hidden = False
  elseif blabla="b" Then
    ...
  else
    ...
  end if
Case Is = "no"  Worksheets("Recipe").Rows("10:32").EntireRow.Hidden = True
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#3
Hallo Schauan,

erst mal Danke für den Tipp!

Mein jetziger Code:

Code:
Private Sub Worksheet_Change(ByVal Target As Range)

Dim rücksprungBlatt As Worksheet
Set rücksprungBlatt = ActiveSheet
Worksheets("Applications").Activate
Worksheets("Recipe").Activate
    If Not Application.Intersect(Range("C18"), Range(Target.Address)) Is Nothing Then
        Select Case Target.Value
            Case Is = "yes":
                If Cells(1, 4).Value = "1" Then
                    Worksheets("Recipe").Rows("10:32").EntireRow.Hidden = False
                    Worksheets("Recipe").Rows("21:31").EntireRow.Hidden = True
                ElseIf Cells(1, 4).Value = "2" Then
                    Worksheets("Recipe").Rows("10:32").EntireRow.Hidden = False
                    Worksheets("Recipe").Rows("18:20").EntireRow.Hidden = True
                End If
            Case Is = "no": Worksheets("Recipe").Rows("10:32").EntireRow.Hidden = True
        End Select
    End If

rücksprungBlatt.Activate
   
End Sub




Der klappt auch soweit gut, bei Recipe verändert sich leider nur was, wenn ich im Dropdown etwas ändere. Wenn ich aber mal eben schnell das Kreuzfeld verändere, passiert leider nichts, hättest du da noch einen Tipp?

Gruß
ExcelVBAAnfänger
Antworten Top
#4
Hat keiner vielleicht ne andere Idee, wie man es umsetzten könnte?

Gruß
ExcelVBAAnfänger
Antworten Top
#5
Hallöchen,

Du bist dabei vielleicht auf dem falschen Blatt. Wenn Du vor Bereichsangaben nix schreibst, gelten diese für das aktive Blatt. In Deinem Code hast Du unmittelbar nacheinander

Worksheets("Applications").Activate
Worksheets("Recipe").Activate

Macht hier sicher keinen Sinn, zuerst Applications zu aktivieren ...

Dann hast Du

If Cells(1, 4).Value = "1" Then
Worksheets("Recipe").Rows("10:32").EntireRow.Hidden = False

Da Recipe aktiv ist kannst Du Worksheets("Recipe"). weglassen. Falls sich Cells(1, 4).Value auf Applications beziehen soll, musst Du das davor schreiben.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#6
Hallo Schauan,

ich habe es gerade geändert, sowie du es gesagt hast und es läuft viel flüssiger und besser.

Aber das Hauptproblem hat sich leider noch nicht gebessert.

Also, wenn ich das Dropdownmenü als erstes benutze und dann das Kreuzfeld benutze passiert nichts.
Da anscheinend der VBA Code nur dann benutzt wird, wenn sich das Dropdown verändert.

Gruß
ExcelVBAAnfänger

Hallo Schauan,

ich habe jetzt den Code noch mal von der anderen Seite programmiert und es funktioniert gar nichts mehr,
da in der Praxis, als erstes das Dropdown benutzt wird und dann erst das Kreuzfeld.
Der Traum ist natürlich, dass egal welches Tool benutzt wird, der VBA Code jedes mal gestartet wird.

Code:
Private Sub Worksheet_Change(ByVal Target As Range)

Dim rücksprungBlatt As Worksheet
Set rücksprungBlatt = ActiveSheet

If Not Application.Intersect(Range("D1"), Range(Target.Address)) Is Nothing Then
        Select Case Target.Value
            Case Is = "1":
                If Worksheets("Applications").Cells(18, 3).Value = "yes" Then
                    Worksheets("Recipe").Rows("10:32").EntireRow.Hidden = False
                    Worksheets("Recipe").Rows("21:31").EntireRow.Hidden = True
                ElseIf Worksheets("Applications").Cells(18, 3).Value = "no" Then
                    Worksheets("Recipe").Rows("10:32").EntireRow.Hidden = True
                End If
            Case Is = "2":
                If Worksheets("Applications").Cells(18, 3).Value = "yes" Then
                    Worksheets("Recipe").Rows("10:32").EntireRow.Hidden = False
                    Worksheets("Recipe").Rows("18:20").EntireRow.Hidden = True
                ElseIf Worksheets("Applications").Cells(18, 3).Value = "no" Then
                    Worksheets("Recipe").Rows("10:32").EntireRow.Hidden = True
                End If
        End Select
    End If

    rücksprungBlatt.Activate
    
End Sub




Gruß
ExcelVBAAnfänger
Antworten Top
#7
Hallöchen,

ein WorkSheet_Change reagiert auf direkte Änderungen von Zellen, nicht jedoch auf Änderungen, die z.B. durch Formeln berechnet werden. Oben in der AUfgabenstellung schreibst Du von den DropDowns und ID's. Nun kommt noch ein Kreuzfeld ins Spiel ...
Eventuell solltest Du nochmal genau beschreiben, bei welcher Aktion was passieren soll.
Wenn Dein Kreuzfeld nicht Jakob Smile sondern ein Kontrollkästchen ist, dann wirkt ein Klicken nicht als Change ... HIer müsstest DU dem Kästchen ein Makro zuweisen. Allerdings wäre dann die Frage, was da für ein Target zutreffen soll ...

Eventuell wäre jetzt auch Zeit für eine Beispielmappe, auch wenn ich kein Freund davon bin Sad
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#8
Hallo Schauan,

ich versuche es noch mal jetzt ganz genau zu beschreiben :)

Ich hab in der Spalte C von Zeile 18-26, 9 Dropdowns mit der Auswahlmöglichkeit: yes oder no in dem Worksheet Applications.
In der Zelle X28-30 habe ich mir ein Kästchen gebaut mit 2 Optionsfelder:
1. Optionsfeld mit X
2. Optionsfeld mit Y
Wenn ich auf Optionsfeld X drücke, seht in D1 Applications eine 1, wenn ich auf Optionsfeld Y drücke, steht in D1 eine 2.

Im Worksheet Recipe habe ich Tabellen die entsprechend ein- oder ausgeblendet werden sollen, die Schwierigkeit besteht hier aber jetzt, dass in den jeweiligen Tabellen nicht immer alles ausgeblendet werden soll.

Also nehmen wir jetzt das Beispiel C18 aus Applications.
Wenn in der Zelle C18 ein no steht, wird in Recipe Zeile 10-31 komplett alles ausgeblendet.
Wenn in der Zelle C18 ein yes steht, können 2 Sachen passieren:
Optionsfeld X: soll bei Recipe Zeile 10-31 wieder eingeblendet werden aber Zeile 21-31 ausgeblendet.
Optionsfeld Y: soll bei Recipe Zeile 10-31 wieder eingeblendet werden aber Zeile 18:20 ausgeblendet.

Und dann selbe Spiel mit C19 für die Zeilen 33-55 usw..

Mit dem vorherigen Code hat wie gesagt alles schön geklappt, wenn ich in der Reihenfolge Optionsfeld und dann Dropdown betätige. In der Praxis wird aber leider erst das Dropdown betätigt. Und ich hätte es am liebsten so, dass es egal ist, wann ich welches Tool benutze, es soll sich immer direkt bei Veränderung der Tools, ändern.


War das jetzt besser erklärt? Oder soll ich mit der Beispielmappe anfangen?


Gruß
ExcelVBAAnfänger
Antworten Top
#9
Hallöchen,

wie ich schon schrieb, Du musst das Makro den Optionsfeldern zuweisen. Worksheet_Change geht nicht. Und dabei gibt es dann keinen Target.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#10
Hallo zusammen und hallo schaun,

wir haben es geschafft!

Heute morgen habe ich erst geschnallt, was Schauan mit dem Makro zu den Optionsfeldern zu weisen meint.
Also habe ich folgendes gemacht.

Diesen Code für das Dropdown gelassen:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)

Dim rücksprungBlatt As Worksheet
Set rücksprungBlatt = ActiveSheet
Application.ScreenUpdating = False
Worksheets("Applications").Activate
Worksheets("Recipe").Activate

If Not Application.Intersect(Range("C18"), Range(Target.Address)) Is Nothing Then
        Select Case Target.Value
            Case Is = "yes":
                If Cells(1, 4).Value = "1" Then
                    Worksheets("Recipe").Rows("10:32").EntireRow.Hidden = False
                    Worksheets("Recipe").Rows("21:31").EntireRow.Hidden = True
                ElseIf Cells(1, 4).Value = "2" Then
                    Worksheets("Recipe").Rows("10:32").EntireRow.Hidden = False
                    Worksheets("Recipe").Rows("18:20").EntireRow.Hidden = True
                End If
            Case Is = "no": Worksheets("Recipe").Rows("10:32").EntireRow.Hidden = True
        End Select
    End If

Application.ScreenUpdating = True

rücksprungBlatt.Activate

End Sub



Und dann noch extra diesen für Optionsfeld X:
Code:
Sub Quotation()

If Worksheets("Applications").Cells(18, 3).Value = "yes" Then
    Worksheets("Recipe").Rows("10:32").EntireRow.Hidden = False
    Worksheets("Recipe").Rows("21:31").EntireRow.Hidden = True
End If

End Sub

Und noch ein Modul für Optionsfeld Y:
Code:
Sub OrderConfirmation()

If Worksheets("Applications").Cells(18, 3).Value = "yes" Then
    Worksheets("Recipe").Rows("10:32").EntireRow.Hidden = False
    Worksheets("Recipe").Rows("18:20").EntireRow.Hidden = True
End If

End Sub


Und es klappt wunderbar.
Noch mal vielen Dank Schauan

Mit dem Activate, weiß ich, dass es eigentlich unnötig ist und nicht gerne gesehen wird. Aber komischer Weise funktionieren die anderen Programmierungen nicht so flüssig ohne dem. Also habe ich es drinne gelassen.

Gruß
ExcelVBAAnfänger
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste