justlukas
Goto Top

Excel automatisch Zeilen ausblenden wenn in zwei Spalten Werte sind

Hallo zusammen,

ich habe eine Excelliste mit einer Gutscheinübersicht. Dort ist neben anderen Spalten, eine Spalte G wann der Gutschein ausgestellt wurde und eine Spalte H wann dieser eingelöst wurde. Ich möchte nun erreichen, dass die entsprechende Zeile ausgeblendet wird, wenn sowohl in der Zelle G als auch in der Zelle H dieser Spalte ein Wert eingetragen wurde.

Wahrscheinlich lässt sich das nur mit VBA lösen, oder? Könnte da jemand helfen?

VG

Content-ID: 3220038098

Url: https://administrator.de/contentid/3220038098

Ausgedruckt am: 05.11.2024 um 23:11 Uhr

colinardo
colinardo 30.06.2022 aktualisiert um 17:39:05 Uhr
Goto Top
Servus @justlukas .
Automatisch sobald sich Zellen in den Spalten ändern folgendermaßen:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim cell As Range
    If Not Intersect(Range("G:H"), Target) Is Nothing Then  
        For Each cell In Target
            If Cells(cell.Row, "G") <> "" And Cells(cell.Row, "H") <> "" Then  
                cell.EntireRow.Hidden = True
            End If
        Next
    End If
End Sub

screenshot

Grüße Uwe
justlukas
justlukas 30.06.2022 um 16:23:01 Uhr
Goto Top
Hallo Uwe!

Tausend Dank für deine schnelle Antwort! Du warst schneller als ich meine Nachricht editieren konnte. Ich habe leider einen wichtigen Punkt vergessen. Dürfte ich Dich nochmal um Deine Hilfe bitten?

Kann man es einrichten, dass das Ausblenden nicht automatisch (also ich Echtzeit), sondern per Knopfruck bzw. per Schaltfläche passiert?

Besten Dank!

Lukas
colinardo
Lösung colinardo 30.06.2022 aktualisiert um 16:32:52 Uhr
Goto Top
Zitat von @justlukas:
Kann man es einrichten, dass das Ausblenden nicht automatisch (also ich Echtzeit), sondern per Knopfruck bzw. per Schaltfläche passiert?
Klar, Code oben in dem Sheet austauschen durch
Sub HideRows()
    Dim r As Long
    For r = 1 To UsedRange.SpecialCells(xlCellTypeLastCell).Row
        If Cells(r, "G") <> "" And Cells(r, "H") <> "" Then  
            Rows(r).Hidden = True
        End If
    Next
End Sub
und mit Button verbinden.

Bzw. wenn man den Code nicht im Code-Backend des jeweiligen Sheets platzieren möchte sondern egal wo (Modul/Klasse) so schreiben und das Sheets(1) durch das jeweils gewünschte Sheet ersetzen.
Sub HideRows()
    Dim r As Long
    With Sheets(1)
        For r = 1 To .UsedRange.SpecialCells(xlCellTypeLastCell).Row
            If .Cells(r, "G") <> "" And .Cells(r, "H") <> "" Then  
                .Rows(r).Hidden = True
            End If
        Next
    End With
End Sub
it-frosch
Lösung it-frosch 30.06.2022 um 18:28:11 Uhr
Goto Top
Hallo Lukas,

warum setzt du nicht einfach eine Formel rein die bei Vorhandensein von Werten in beiden Feldern ein Datum oder Feld leert. Anschließend auf diese Spalte einen Filter und diesen einfach aktualsieren.

Schon sind auch alle Zeilen weg.

Man muss doch nicht jede Kleinigkeit mit einer "Programmierung" lösen. face-wink
Zumal du ja sowieso irgendwo hin klicken willst damit es ausgeblendet wird.

Grüße vom it-frosch
justlukas
justlukas 01.07.2022 um 11:39:46 Uhr
Goto Top
Hallöchen it-Frosch,

das klingt auch fantastisch! Dieser Weg war mir nicht bekannt. Könntest du mir verraten welche Formel dir in den Sinn gekommen ist?

VG
colinardo
Lösung colinardo 01.07.2022 aktualisiert um 12:07:38 Uhr
Goto Top
z.B. zum Runterziehen in einer Spalte in Zeile 2
=WENN(UND($G2<>"";$H2<>"");"BEIDE BELEGT";"")  
Filter dann
screenshot

STRG + ALT + L aktualisiert den Filter dann.

Grüße Uwe
justlukas
justlukas 01.07.2022 um 12:56:01 Uhr
Goto Top
Wahnsinn. Danke euch beiden!!!

VG
ThePoly
ThePoly 22.01.2024 um 13:44:22 Uhr
Goto Top
Zitat von @colinardo:

Zitat von @justlukas:
Kann man es einrichten, dass das Ausblenden nicht automatisch (also ich Echtzeit), sondern per Knopfruck bzw. per Schaltfläche passiert?
Klar, Code oben in dem Sheet austauschen durch
Sub HideRows()
    Dim r As Long
    For r = 1 To UsedRange.SpecialCells(xlCellTypeLastCell).Row
        If Cells(r, "G") <> "" And Cells(r, "H") <> "" Then  
            Rows(r).Hidden = True
        End If
    Next
End Sub
und mit Button verbinden.

Bzw. wenn man den Code nicht im Code-Backend des jeweiligen Sheets platzieren möchte sondern egal wo (Modul/Klasse) so schreiben und das Sheets(1) durch das jeweils gewünschte Sheet ersetzen.
Sub HideRows()
    Dim r As Long
    With Sheets(1)
        For r = 1 To .UsedRange.SpecialCells(xlCellTypeLastCell).Row
            If .Cells(r, "G") <> "" And .Cells(r, "H") <> "" Then  
                .Rows(r).Hidden = True
            End If
        Next
    End With
End Sub

Ich schließe mich Lukas an, danke für den Beitrag!
Allerdings benötige ich für meinen zweck eine kleine Änderung an dem Code:
Die Zelle soll nicht nur befüllt sein, sondern einen bestimmten wert erhalten.
Beispiel: In Spalte "G" soll der Wert größer 1 o.ä. sein (die Zellen in der Spalte werden mit einem datum befüllt). In Spalte "H" wird enwteder Ja oder nein geschrieben werden. Wenn dann in Spalte G ein Datum und in Spalte H ein Ja steht, soll die Zelle, in der das vorkommt ausgeblendet werden. Bei nein muss nichts passieren. Bei der bestehenden Formel wurde die erste Zelle in der Spalte A1 (wird als Spalten Überschrift genutzt) auch gelöscht. Deswegen wenn möglich die Zeile 1 komplett von dem Code aussparen. Vielen Dank vorab!!
colinardo
colinardo 22.01.2024 aktualisiert um 14:04:09 Uhr
Goto Top
Servus @ThePoly, willkommen auf Administrator.de!
Beispiel: In Spalte "G" soll der Wert größer 1 o.ä. sein (die Zellen in der Spalte werden mit einem datum befüllt). In Spalte "H" wird enwteder Ja oder nein geschrieben werden. Wenn dann in Spalte G ein Datum und in Spalte H ein Ja steht, soll die Zelle, in der das vorkommt ausgeblendet werden. Bei nein muss nichts passieren. Bei der bestehenden Formel wurde die erste Zelle in der Spalte A1 (wird als Spalten Überschrift genutzt) auch gelöscht. Deswegen wenn möglich die Zeile 1 komplett von dem Code aussparen. Vielen Dank vorab!!
Gerne kein Problem, das erreichst du hiermit:
Sub HideRows()
    Dim r As Long
    With Sheets(1)
        For r = 2 To .UsedRange.SpecialCells(xlCellTypeLastCell).Row
            If IsDate(.Cells(r, "G").Value) And LCase(.Cells(r, "H").Value) = "ja" Then  
                .Rows(r).Hidden = True
            End If
        Next
    End With
End Sub
Grüße Uwe
ThePoly
ThePoly 22.01.2024 aktualisiert um 15:20:49 Uhr
Goto Top
Hallo Uwe,

besten dank für die schnelle Rückmeldung!
Es funktioniert leider noch nicht ganz, folgender Stand:
Ich habe deinen Code 1:1 übernommen, lediglich habe ich
Sub HideRows()
durch
Private Sub CommandButton1_Click()
ausgetauscht. Leider lässt er sich nicht ausführen und bemängelt folgenden Abschnitt
.UsedRange


Kann es sein, dass es mit dem Button bereits in dem Code vorkommt? Und was hat es mit
With Sheets(1)
auf sich, muss ich da etwas anpassen?

Noch eine kleine Anmerkung: der Fehler lautet: "Fehler beim Kompilieren: Unzulässiger oder nicht ausreichend definierter Verweis"
Vielen Dank!
Ricardo
colinardo
colinardo 22.01.2024 aktualisiert um 16:02:27 Uhr
Goto Top
Steht eigentlich oben schon alles im Beitrag für beide Varianten ausführlich erklärt. Bitte auch diese erst lesen. Merci.

Wenn du also einen Button hast kannst du die Methode aus dessen Click-Event so ausführen
Private Sub CommandButton1_Click()
    HideRows    
End Sub

Sub HideRows()
    Dim r As Long
    With Sheets(1)
        For r = 2 To .UsedRange.SpecialCells(xlCellTypeLastCell).Row
            If IsDate(.Cells(r, "G").Value) And LCase(.Cells(r, "H").Value) = "ja" Then    
                .Rows(r).Hidden = True
            End If
        Next
    End With
End Sub

Das Sheets(1) bezeichnet das Arbeitsblatt auf dem der folgende Code ausgeführt wird, in dem Fall also das erste Sheet der Arbeitsmappe!
Du kannst hier auch mir Namen arbeiten, bspw. With Sheets("Tabelle1"), oder auch With ActiveSheet für das aktuell ausgewählte Sheet.

Bei weiteren Grundlagen-Fragen dazu bitte PN damit der Thread des TOs hier nicht unübersichtlich wird (s. Diskussionsrichtlinien). Merci.

<Closed>

Grüße Uwe