Discussion:
EXCEL 2016 - VBA - Zeilen abhängig von einer bestimmten Bedingung löschen
(zu alt für eine Antwort)
Hakan Kaya
2018-05-24 06:45:39 UTC
Permalink
Hallo geschätztes Forum

Ich habe eine Tabelle in der abhängig von mehreren unterschiedlichen Bedingungen in Spalte 7 (G) Zeilen gelöscht werden sollen
Bedingungen heißen "H03" oder "LSH"

Zeilen also bei denen in Spalte 7 ein H03 oder LSH eingetragen ist sollen per Klick auf einen Button automatisch gelöscht werden.

Im Netz habe ich bisher diesen Code gefunden. Leider passiert trotz der Anpassungen die ich bisher vorgenommen habe nichts. Für Hilfe zur Lösung wäre ich sehr dankbar.


Sub bedingte_Zeilenloeschung()

'** Ermittlung der letzten Zeile in Spalte g

lz = Cells(Rows.Count, 7).End(xlUp).Rows.Row

'** Durchlauf aller Zeilen

For t = lz To 2 Step -1 'Zählung rückwärts bis Zeile 2

'Abfragen, ob in der ersten Spalte der Eintrag "H03" steht

If Cells(t, 7).Value = "H03" Then
If Cells(t, 7).Value = "LSH" Then

Rows(t).Delete Shift:=xlUp

End If

Next t

End Sub


Mit freundlichen Grüßen
Hakan
Thomas Kühn
2018-05-24 13:14:34 UTC
Permalink
Moin Hakan,
versuchs mal so:

Sub bedingte_Zeilenloeschung()
Dim lz As Long
'** Ermittlung der letzten Zeile in Spalte g
lz = Cells(Rows.Count, 7).End(xlUp).Rows.Row

'** Durchlauf aller Zeilen
For t = lz To 2 Step -1 'Zählung rückwärts bis Zeile 2
'Abfragen, ob in der ersten Spalte der Eintrag "H03" steht
If Cells(t, 7).Value = "H03" Or Cells(t, 7).Value = "LSH" Then
Rows(t).Delete Shift:=xlUp

End If
Next t
End Sub
Hakan Kaya
2018-05-24 15:50:56 UTC
Permalink
Post by Thomas Kühn
Moin Hakan,
Sub bedingte_Zeilenloeschung()
Dim lz As Long
'** Ermittlung der letzten Zeile in Spalte g
lz = Cells(Rows.Count, 7).End(xlUp).Rows.Row
'** Durchlauf aller Zeilen
For t = lz To 2 Step -1 'Zählung rückwärts bis Zeile 2
'Abfragen, ob in der ersten Spalte der Eintrag "H03" steht
If Cells(t, 7).Value = "H03" Or Cells(t, 7).Value = "LSH" Then
Rows(t).Delete Shift:=xlUp
End If
Next t
End Sub
Hallo Thomas

So funktioniert es jetzt. Zeilen in denen denen die bestimmten Werte H03 bzw. LSH in Spalte 7 (G) vorkommen werden jetzt zuverlässig gelöscht. Eine Frage hätte ich dennoch.
Kann ich die Liste der Bedingungen (also H03, LSH) unendlich weiterführen ohne das der Code anderweitig ergänzt werden muss.

Ich meine ich könnte dann einfach den Codebestandteil

"Or Cells(t, 7).Value = "LSH" Then"
an die entsprechende Codezeile anfügen oder? :-)

Ich danke Dir vielmals :-)
Gruß
Hakan
Claus Busch
2018-05-24 16:36:45 UTC
Permalink
Hallo Hakan,
Post by Hakan Kaya
So funktioniert es jetzt. Zeilen in denen denen die bestimmten Werte H03 bzw. LSH in Spalte 7 (G) vorkommen werden jetzt zuverlässig gelöscht. Eine Frage hätte ich dennoch.
Kann ich die Liste der Bedingungen (also H03, LSH) unendlich weiterführen ohne das der Code anderweitig ergänzt werden muss.
Ich meine ich könnte dann einfach den Codebestandteil
"Or Cells(t, 7).Value = "LSH" Then"
an die entsprechende Codezeile anfügen oder? :-)
du kannst die Werte, nach denen gelöscht werden soll in ein Array
eingeben, nach diesem Array filtern und die sichtbaren Zeilen auf einen
Rutsch löschen. Wenn sich die Werte zum Löschen ändern, musst du nur das
Array ändern:

Sub ZeilenLöschen()
Dim varDaten As Variant
Dim LRow As Long

'Hier die Werte eingeben, bei denen gelöscht werden soll
varDaten = Array("LSH", "H03", "B04", "C05")

With ActiveSheet
LRow = .Cells(.Rows.Count, 1).End(xlUp).Row
'Hier Bereich anpassen
.Range("A1:Z" & LRow).AutoFilter Field:=7, _
Criteria1:=varDaten, Operator:=xlFilterValues
.Range("A2:A" & LRow).SpecialCells(xlCellTypeVisible) _
.EntireRow.Delete
.AutoFilterMode = False

End With
End Sub


Mit freundlichen Grüßen
Claus
--
Windows10
Office 2016
Hakan Kaya
2018-05-24 18:47:43 UTC
Permalink
Post by Claus Busch
Hallo Hakan,
Post by Hakan Kaya
So funktioniert es jetzt. Zeilen in denen denen die bestimmten Werte H03 bzw. LSH in Spalte 7 (G) vorkommen werden jetzt zuverlässig gelöscht. Eine Frage hätte ich dennoch.
Kann ich die Liste der Bedingungen (also H03, LSH) unendlich weiterführen ohne das der Code anderweitig ergänzt werden muss.
Ich meine ich könnte dann einfach den Codebestandteil
"Or Cells(t, 7).Value = "LSH" Then"
an die entsprechende Codezeile anfügen oder? :-)
du kannst die Werte, nach denen gelöscht werden soll in ein Array
eingeben, nach diesem Array filtern und die sichtbaren Zeilen auf einen
Rutsch löschen. Wenn sich die Werte zum Löschen ändern, musst du nur das
Sub ZeilenLöschen()
Dim varDaten As Variant
Dim LRow As Long
'Hier die Werte eingeben, bei denen gelöscht werden soll
varDaten = Array("LSH", "H03", "B04", "C05")
With ActiveSheet
LRow = .Cells(.Rows.Count, 1).End(xlUp).Row
'Hier Bereich anpassen
.Range("A1:Z" & LRow).AutoFilter Field:=7, _
Criteria1:=varDaten, Operator:=xlFilterValues
.Range("A2:A" & LRow).SpecialCells(xlCellTypeVisible) _
.EntireRow.Delete
.AutoFilterMode = False
End With
End Sub
Mit freundlichen Grüßen
Claus
--
Windows10
Office 2016
Hallo Claus,

so werde ich das machen. Tausend Dank Dir und Thomas :-)
Hakan Kaya
2018-05-25 05:02:18 UTC
Permalink
Post by Hakan Kaya
Post by Claus Busch
Hallo Hakan,
Post by Hakan Kaya
So funktioniert es jetzt. Zeilen in denen denen die bestimmten Werte H03 bzw. LSH in Spalte 7 (G) vorkommen werden jetzt zuverlässig gelöscht. Eine Frage hätte ich dennoch.
Kann ich die Liste der Bedingungen (also H03, LSH) unendlich weiterführen ohne das der Code anderweitig ergänzt werden muss.
Ich meine ich könnte dann einfach den Codebestandteil
"Or Cells(t, 7).Value = "LSH" Then"
an die entsprechende Codezeile anfügen oder? :-)
du kannst die Werte, nach denen gelöscht werden soll in ein Array
eingeben, nach diesem Array filtern und die sichtbaren Zeilen auf einen
Rutsch löschen. Wenn sich die Werte zum Löschen ändern, musst du nur das
Sub ZeilenLöschen()
Dim varDaten As Variant
Dim LRow As Long
'Hier die Werte eingeben, bei denen gelöscht werden soll
varDaten = Array("LSH", "H03", "B04", "C05")
With ActiveSheet
LRow = .Cells(.Rows.Count, 1).End(xlUp).Row
'Hier Bereich anpassen
.Range("A1:Z" & LRow).AutoFilter Field:=7, _
Criteria1:=varDaten, Operator:=xlFilterValues
.Range("A2:A" & LRow).SpecialCells(xlCellTypeVisible) _
.EntireRow.Delete
.AutoFilterMode = False
End With
End Sub
Mit freundlichen Grüßen
Claus
--
Windows10
Office 2016
Hallo Claus,
so werde ich das machen. Tausend Dank Dir und Thomas :-)
Hallo Claus

Beim testen der bedingten Löschung von Zeilen ist mir aufgefallen, das die Bedingungen "H03" "LSH" und andere auch in der Spalte 8 (H) auftreten können. Nun habe ich gedacht ich könnte in die folgende Codezeile einfach noch ne 8 dranhängen, nach dem Komma. Ich musste feststellen, dass es dann doch nicht so einfach geht, die Suche auf die Spalte 8 (H) auszuweiten. Was kann ich machen, um die Suche auf die Spalte 8 auszuweiten?


Range("A1:Z" & LRow).AutoFilter Field:=7, _

Mit freundlichen Grüßen
Hakan
Claus Busch
2018-05-25 07:42:01 UTC
Permalink
Hallo Hakan,
Post by Hakan Kaya
Beim testen der bedingten Löschung von Zeilen ist mir aufgefallen, das die Bedingungen "H03" "LSH" und andere auch in der Spalte 8 (H) auftreten können. Nun habe ich gedacht ich könnte in die folgende Codezeile einfach noch ne 8 dranhängen, nach dem Komma. Ich musste feststellen, dass es dann doch nicht so einfach geht, die Suche auf die Spalte 8 (H) auszuweiten. Was kann ich machen, um die Suche auf die Spalte 8 auszuweiten?
Range("A1:Z" & LRow).AutoFilter Field:=7, _
dann probiere es so:

Sub ZeilenLöschen()
Dim varDaten As Variant
Dim LRow As Long
Dim i As Integer

'Hier die Werte eingeben, bei denen gelöscht werden soll
varDaten = Array("LSH", "H03", "B04", "C05")

With ActiveSheet
LRow = .Cells(.Rows.Count, 1).End(xlUp).Row
For i = 7 To 8
'Hier Bereich anpassen
.Range("A1:Z" & LRow).AutoFilter Field:=i, _
Criteria1:=varDaten, Operator:=xlFilterValues
.Range("A2:A" & LRow).SpecialCells(xlCellTypeVisible) _
.EntireRow.Delete
.ShowAllData
Next
.AutoFilterMode = False
End With
End Sub


Mit freundlichen Grüßen
Claus
--
Windows10
Office 2016
Claus Busch
2018-05-25 09:34:19 UTC
Permalink
Hallo nochmals,
Post by Hakan Kaya
Beim testen der bedingten Löschung von Zeilen ist mir aufgefallen, das die Bedingungen "H03" "LSH" und andere auch in der Spalte 8 (H) auftreten können. Nun habe ich gedacht ich könnte in die folgende Codezeile einfach noch ne 8 dranhängen, nach dem Komma. Ich musste feststellen, dass es dann doch nicht so einfach geht, die Suche auf die Spalte 8 (H) auszuweiten. Was kann ich machen, um die Suche auf die Spalte 8 auszuweiten?
wenn die zu filternden Spalten nicht nebeneinander liegen, kannst du die
Spalten auch in ein Array schreiben:

Sub ZeilenLöschen()
Dim varDaten As Variant, varFilter As Variant
Dim LRow As Long
Dim i As Integer

'Hier die Werte eingeben, bei denen gelöscht werden soll
varDaten = Array("LSH", "H03", "B04", "C05")
'Hier die zu filternden Spalten eingeben
varFilter = Array("G", "H", "K")

With ActiveSheet
LRow = .Cells(.Rows.Count, 1).End(xlUp).Row
For i = LBound(varFilter) To UBound(varFilter)
'Hier Bereich anpassen
.Range("A1:Z" & LRow).AutoFilter
Field:=Columns(varFilter(i)).Column, _
Criteria1:=varDaten, Operator:=xlFilterValues
.Range("A2:A" & LRow).SpecialCells(xlCellTypeVisible) _
.EntireRow.Delete
.ShowAllData
Next
.AutoFilterMode = False
End With
End Sub


Mit freundlichen Grüßen
Claus
--
Windows10
Office 2016
Hakan Kaya
2018-05-25 14:09:49 UTC
Permalink
Post by Claus Busch
Hallo nochmals,
Post by Hakan Kaya
Beim testen der bedingten Löschung von Zeilen ist mir aufgefallen, das die Bedingungen "H03" "LSH" und andere auch in der Spalte 8 (H) auftreten können. Nun habe ich gedacht ich könnte in die folgende Codezeile einfach noch ne 8 dranhängen, nach dem Komma. Ich musste feststellen, dass es dann doch nicht so einfach geht, die Suche auf die Spalte 8 (H) auszuweiten. Was kann ich machen, um die Suche auf die Spalte 8 auszuweiten?
wenn die zu filternden Spalten nicht nebeneinander liegen, kannst du die
Sub ZeilenLöschen()
Dim varDaten As Variant, varFilter As Variant
Dim LRow As Long
Dim i As Integer
'Hier die Werte eingeben, bei denen gelöscht werden soll
varDaten = Array("LSH", "H03", "B04", "C05")
'Hier die zu filternden Spalten eingeben
varFilter = Array("G", "H", "K")
With ActiveSheet
LRow = .Cells(.Rows.Count, 1).End(xlUp).Row
For i = LBound(varFilter) To UBound(varFilter)
'Hier Bereich anpassen
.Range("A1:Z" & LRow).AutoFilter
Field:=Columns(varFilter(i)).Column, _
Criteria1:=varDaten, Operator:=xlFilterValues
.Range("A2:A" & LRow).SpecialCells(xlCellTypeVisible) _
.EntireRow.Delete
.ShowAllData
Next
.AutoFilterMode = False
End With
End Sub
Mit freundlichen Grüßen
Claus
--
Windows10
Office 2016
Hallo Claus,

beide Deiner Vorschläge funktionieren in meinem Fall. Vielen lieben Dank :-)
Thomas Kühn
2018-05-24 13:18:13 UTC
Permalink
Noch kurze ergänzt zur Erklärung:

Hier fragst Du nach, ob in (t,7) der Wert "H03" steht.
Post by Hakan Kaya
If Cells(t, 7).Value = "H03" Then
Wenn das der Fall ist, dann fragst Du nun, ob in der gleichen Zelle
der Wert "LSH" steht. Das kann natürlich nicht sein.
Post by Hakan Kaya
If Cells(t, 7).Value = "LSH" Then
Rows(t).Delete Shift:=xlUp
End If
Hier fehlt dann syntaktisch noch das End If, somit bekommst Du
hier sicher einen Syntaxfehler beim Kompilieren.
Post by Hakan Kaya
Next t
End Sub
Gruß Thomas
Loading...