Zeilen basierend auf mehreren Zellen ausblenden

Zeilen basierend auf mehreren Zellen ausblenden

Meine Datenbank wird immer umfangreicher und ich versuche, sie ein wenig handlicher zu machen. Im Wesentlichen versuche ich Folgendes:

Wenn Zelle E:E = "Abgeschlossen" ist, wird die entsprechende Zeile ausgeblendet.
Andernfalls, wenn Zelle F:F = "Abgeschlossen" ist, wird dieselbe/entsprechende Zeile ausgeblendet.

Dies wird für die 52 Wochen des Jahres fortgesetzt, plus eine unendliche Anzahl von Zeilen, abhängig von den Daten

Ich habe einen einfachen Code ausprobiert:

Private Sub Worksheet_Change(check)

    If Range("E:Z") = Complete Then
        Rows("3:7000").EntireRow.Hidden = True
    Else
        Rows("3:7000").EntireRow.Hidden = False
    End If

Dies wird kompiliert, aber sonst passiert nicht viel.

Jede Hilfe wäre großartig.

Antwort1

OK, lassen Sie uns das auseinandernehmen.

Ihre Befehle sprechen ganze Zeilen und ganze Spalten als Blöcke an, werten aber nicht die aktuelle Zelle aus. Ein Textwert muss in VBA in doppelte Anführungszeichen gesetzt werden, sonst erwartet Excel, dass es sich um eine benannte Variable oder ein benanntes Objekt handelt.

Soweit ich es verstehe, möchten Sie in den Spalten E bis Z nach dem Wort „Complete“ suchen. Das Ereignis Worksheet_Change wirkt auf ein Ziel, also die Zelle, die geändert wurde. Um zu sehen, ob sich die Zelle in den Spalten E bis Z befindet, können Sie prüfen, ob sich das Ziel mit diesem Bereich überschneidet.

Intersect(Target, Range("E:Z"))

Dieser Befehl gibt ein Bereichsobjekt zurück. Wenn die geänderte Zelle nicht im angegebenen Bereich liegt, wird nichts zurückgegeben. Das nächste ist also ein bisschen eine doppelte Verneinung, aber wir möchten, dass etwas passiert, wenn das SchnittobjektnichtNICHTS. Dies schreibt sich wie folgt

If Not Intersect(Target, Range("E:Z")) Is Nothing Then
'   do something
End If

Als nächstes möchten Sie prüfen, ob der Wert der Zielzelle „Vollständig“ ist. Es wäre vielleicht eine gute Idee, dies nicht zwischen Groß- und Kleinschreibung unterscheiden zu lassen. Das Umschließen des Ziels in ein wird UCasedies also beheben.

If Not Intersect(Target, Range("E:Z")) Is Nothing Then
    If UCase(Target.Value) = "COMPLETE" Then
        ' some code to hide the row
    End If
End If

Der Code zum Ausblenden der Zeile muss die Zeilennummer der Zielzelle abrufen. Dies kann mit erfolgen Target.Row, das dann dem Rows()Befehl ähnlich wie dem von Ihnen verwendeten übergeben werden kann, jedoch nur für die Zeile der Zielzelle.

Rows(Target.Row).EntireRow.Hidden = True

Bisher wird der Code

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("E:Z")) Is Nothing Then
    If UCase(Target.Value) = "COMPLETE" Then
        Rows(Target.Row).EntireRow.Hidden = True
    End If
End If

End Sub

... und das funktioniert für einzelne Zeilen. Wenn Sie jedoch „Complete“ auf einmal in mehrere Zeilen kopieren, enthält das Ziel mehr als eine Zeile und der Code muss entsprechend angepasst werden. Deklarieren Sie einen Bereich mit dem Namen cel und durchlaufen Sie dann jede Zelle im Zielbereich. Die Befehle UCase und Rows müssen nun celstattTarget

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

Dim cel As Range
If Not Intersect(Target, Range("E:Z")) Is Nothing Then
    For Each cel In Target
        If UCase(cel.Value) = "COMPLETE" Then
            Rows(cel.Row).EntireRow.Hidden = True
        End If
    Next cel
End If

End Sub

Und da haben Sie es.

verwandte Informationen