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-Key: 3220038098

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

Printed on: April 18, 2024 at 15:04 o'clock

Member: colinardo
colinardo Jun 30, 2022 updated at 15:39:05 (UTC)
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
Member: justlukas
justlukas Jun 30, 2022 at 14:23:01 (UTC)
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
Member: colinardo
Solution colinardo Jun 30, 2022 updated at 14:32:52 (UTC)
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
Member: it-frosch
Solution it-frosch Jun 30, 2022 at 16:28:11 (UTC)
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
Member: justlukas
justlukas Jul 01, 2022 at 09:39:46 (UTC)
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
Member: colinardo
Solution colinardo Jul 01, 2022 updated at 10:07:38 (UTC)
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
Member: justlukas
justlukas Jul 01, 2022 at 10:56:01 (UTC)
Goto Top
Wahnsinn. Danke euch beiden!!!

VG
Member: ThePoly
ThePoly Jan 22, 2024 at 12:44:22 (UTC)
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!!
Member: colinardo
colinardo Jan 22, 2024 updated at 13:04:09 (UTC)
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
Member: ThePoly
ThePoly Jan 22, 2024 updated at 14:20:49 (UTC)
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
Member: colinardo
colinardo Jan 22, 2024 updated at 15:02:27 (UTC)
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