Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1872to1876
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Array durchlaufen und Zeilen löschen

Array durchlaufen und Zeilen löschen
16.03.2022 12:42:58
Constantin
Hallo,
ich möchte in einer Tabelle alle Zeilen, die eine bestimmte Bedingung in Spalte A nicht erfüllen, löschen und übergebe dafür als Kriterium eine Variable (Array?) mit verschiedenen Elementen.
In der beigefügten Mappe stehen in der Tabelle "Daten" (ab Zeile 2) die zu prüfenden Zeilen. Die zu prüfende Spalte ist die Spalte A. Ich möchte dafür folgenden Zellinhalt übergeben, z.B.: ABC; AZZ; XYZ1; AZ36
Beginnt eine Zeile (in Spalte A) nicht mit einem der hier genannten Strings, soll diese Zeile gelöscht werden, sonst nicht. Ist der Eintrag in Spalte A z.B. "AZF", soll diese Zeile gelöscht werden, da diese Bezeichnung nicht Teil des Suchstrings ist. Eine Zeile mit der Bezeichnung XYZ11 dürfte man nicht löschen, da sie mit XYZ1 beginnt (also immer der Teilstring von links gesehen ist zu prüfen; wenn nicht in der Variable (Array) enthalten, dann Zeile löschen.)
Ich würde mich freuen, wenn jemand einen guten VBA-Tipp hätte.
Grüße, Constantin
https://www.herber.de/bbs/user/151799.xlsx

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Array durchlaufen und Zeilen löschen
16.03.2022 12:59:17
ChrisL
Hi Constantin

Sub t()
Dim lngZeile As Long, i As Integer, b As Boolean
Dim arrKuerzel As Variant
arrKuerzel = Split("ABC;AZZ;XYZ1;AZ36", ";")
Application.ScreenUpdating = False
With Worksheets("Daten")
For lngZeile = .Cells(.Rows.Count, 1).End(xlUp).Row To 2 Step -1
b = False
For i = LBound(arrKuerzel) To UBound(arrKuerzel)
If .Cells(lngZeile, 1) Like arrKuerzel(i) & "*" Then
b = True
Exit For
End If
Next i
If Not b Then .Rows(lngZeile).Delete
Next lngZeile
End With
End Sub
cu
Chris
AW: Array durchlaufen und Zeilen löschen
16.03.2022 14:31:50
Constantin
Hallo Chris,
vielen Dank für den Lösungsvorschlag. Funktioniert bestens!
Grüße, Constantin
Anzeige
kleiner Tip am Rande:
16.03.2022 14:40:38
Daniel
Wenn man prüfen will, ob eine Schleife vollständig durchlaufen ist, dann kann man das auch am Schleifenzähler feststellen.
bei einem vollständigen Durchlauf ist der Schleifenzähler immer größer als der Schleifenendwert.
Wurde die Schleife vorzeitig mit Exit For verlassen, ist der Schleifenzähler kleiner oder gleich dem Schleifenendwert.
damit spart man sich die zusätzliche Variable und aus:

b = False
For i = LBound(arrKuerzel) To UBound(arrKuerzel)
If .Cells(lngZeile, 1) Like arrKuerzel(i) & "*" Then
b = True
Exit For
End If
Next i
If Not b Then .Rows(lngZeile).Delete
wird

For i = LBound(arrKuerzel) To UBound(arrKuerzel)
If .Cells(lngZeile, 1) Like arrKuerzel(i) & "*" Then Exit For
Next i
If i > UBound(arrKuerzel) Then .Rows(lngZeile).Delete
Gruß Daniel
Anzeige
Tipp gelesen, danke owT.
16.03.2022 18:26:23
ChrisL
.
AW: Array durchlaufen und Zeilen löschen
17.03.2022 14:12:02
ChrisL
Hi
Hier die Variable ausgesondert. Die Verwendung einer Unterprozedur ist natürlich nicht zwingend.

Sub Makro1()
Dim x As String
x = "ABC;AZZ;XYZ1;AZ36"
Call MachMal(x)
End Sub

Private Sub MachMal(strKuerzel As String)
Dim lngZeile As Long, i As Integer
Dim arrKuerzel As Variant
arrKuerzel = Split(strKuerzel, ";")
Application.ScreenUpdating = False
With Worksheets("Daten")
For lngZeile = .Cells(.Rows.Count, 1).End(xlUp).Row To 2 Step -1
For i = LBound(arrKuerzel) To UBound(arrKuerzel)
If .Cells(lngZeile, 1) Like arrKuerzel(i) & "*" Then Exit For
Next i
If i > UBound(arrKuerzel) Then .Rows(lngZeile).Delete
Next lngZeile
End With
End Sub
cu
Chris
Anzeige
AW: Array durchlaufen und Zeilen löschen
17.03.2022 18:09:54
Constantin
Hallo Chris,
irgendwas muss auf meiner Seite wohl die Kompilierung geblockt haben. Ich habe eine neue Datei verwendet. Klappt jetzt einwandfrei (und auch mit Variable). Besten Dank!!!
Grüße, Constantin
AW: Array durchlaufen und Zeilen löschen
16.03.2022 13:12:36
MCO
Hallo Constantin!
Damit sollte es klappen:
Wühl dich mal durch

Sub filter()
arr = Array("ABC", "AZZ", "XYZ1", "AZ36")
For i = ActiveSheet.UsedRange.Rows.Count To 2 Step -1
For begr = 0 To UBound(arr)
If Left(Cells(i, 1), Len(arr(begr))) = arr(begr) Then
'Cells(i, 1).Interior.ColorIndex = 4
Rows(i).Delete
Exit For
End If
Next begr
Next i
End Sub
Gruß, MCO
Anzeige
AW: Array durchlaufen und Zeilen löschen
16.03.2022 14:36:57
Constantin
Hallo MCO,
hat auch geklappt (musste nur " arr" einsetzen). Vielen Dank für Deinen Alternativ-Vorschlag. Ebenfalls sehr hilfreich.
Grüße, Constantin
AW: Array durchlaufen und Zeilen löschen
16.03.2022 14:55:35
Daniel
Hi
ich bevorzuge es zum Löschen von Zeilen, diese zuerst per Formel zu markieren und dann über Exclmenüfunktionen wie Duplikate-Entfernen zu löschen. das ist in der Regel bei großen Datenmengen schneller als einzelne Zeilen per Schleife zu löschen:

Sub löschen()
Dim var As String
Dim FO As String
var = "ABC;AZZ;XYZ1;AZ36"
var = "{""" & Replace(var, ";", """,""") & """}"
FO = "=IF(OR(Left(RC1,Len(_var_))=_var_),Row(),0)"
FO = Replace(FO, "_var_", var)
With Sheets("Daten").Cells(1, 1).CurrentRegion
With .Columns(.Columns.Count + 1)
.FormulaR1C1 = FO
.Cells(1, 1).FormulaR1C1 = 0
.EntireRow.RemoveDuplicates .Column, xlNo
.ClearContents
End With
End With
End Sub
Gruß Daniel
Anzeige
AW: Array durchlaufen und Zeilen löschen
17.03.2022 12:09:22
Constantin
Hallo Daniel,
Danke für die zusätzlichen Tipps. Die Geschwindigkeit kann evtl. noch eine Rolle spielen. Allerdings taucht momentan folgendes Problem auf: Es kommt die Meldung: Falsche Anzahl an Argumenten oder unzulässige Zuweisung einer Eigenschaft. Ich möchte die Suchbegriffe in einer Variablen übergeben, z.B. strText="ABC;ABD;ABX"
Irgendwie scheint es, dass ich irgendwas übersehen habe. Wie müsste z.B. das Programm von Chris angepasst werden, damit SPLIT sich auf eine Variable (z.B. strrText) bezieht? Es sollen dann alle Zeilen gelöscht werden, die in Spalte 1 weder mit ABC, ABD oder ABX beginnen. Wie kann ich eine Variable übergeben? Split (strtext, ...) hat nicht funktioniert.
Danke im Voraus nochmal für Eure Hilfe.
Grüße, Constantin

Sub t()
Dim lngZeile As Long, i As Integer, b As Boolean
Dim arrKuerzel As Variant
arrKuerzel = Split("ABC;AZZ;XYZ1;AZ36", ";")
Application.ScreenUpdating = False
With Worksheets("Daten")
For lngZeile = .Cells(.Rows.Count, 1).End(xlUp).Row To 2 Step -1
b = False
For i = LBound(arrKuerzel) To UBound(arrKuerzel)
If .Cells(lngZeile, 1) Like arrKuerzel(i) & "*" Then
b = True
Exit For
End If
Next i
If Not b Then .Rows(lngZeile).Delete
Next lngZeile
End With
End Sub

Anzeige
AW: Array durchlaufen und Zeilen löschen
17.03.2022 14:00:00
Daniel
HI
naja, Variable statt konstanter Text einzusetzen, das sind doch Basics, die bei Basiskenntnissen eigentlich bekannt sein sollen.
wenns probleme gibt, solltest du schon deinen Code zeigen, vorallem auch wo und wie die Variable befüllt wird.
Ansonsten, wenn du Fragen zu Chris Code hast, frage Chris.
Gruß Daniel
AW: Array durchlaufen und Zeilen löschen
17.03.2022 18:17:52
Constantin
Hallo Daniel,
Klappt auch - und die "Speed" ist in der Tat beeindruckend und bei größeren Datenmengen sehr nützlich. Danke.
Grüße, Constantin
AW: Array durchlaufen und Zeilen löschen
17.03.2022 14:20:24
Rudi
schwebt dir sowas vor?

Sub aaaa()
Call ZeilenLoeschen("ABC;ABD;ABX")
End Sub
Sub ZeilenLoeschen(strTEXT As String)
Dim lngZeile As Long, i As Integer
Dim rngDEL As Range
Dim arrKuerzel As Variant
arrKuerzel = Split(strTEXT, ";")
Application.ScreenUpdating = False
With Worksheets("Daten")
For lngZeile = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
For i = LBound(arrKuerzel) To UBound(arrKuerzel)
If .Cells(lngZeile, 1) Like arrKuerzel(i) & "*" Then
If rngDEL Is Nothing Then
Set rngDEL = .Cells(lngZeile, 1)
Else
Set rngDEL = Union(rngDEL, .Cells(lngZeile, 1))
End If
End If
Next i
Next lngZeile
End With
If Not rngDEL Is Nothing Then
rngDEL.EntireRow.Delete
End If
End Sub
Gruß
Rudi
Anzeige
AW: Array durchlaufen und Zeilen löschen
17.03.2022 16:51:38
Constantin
Hallo Rudi,
vielen Dank für Deinen Vorschlag. Vielleicht liegt es an der Version. Kann es sein, dass Excel 2013 "meckert" und Excel 2010 nicht? Bei Excel 2010 lief z.B. die Version von Chris einwandfrei. Auch folgende Änderung hat das Programm vertragen:
Statt: arrKuerzel = Split("ABC;AZZ;XYZ1;AZ36", ";") habe ich den Inhalt zuerst in eine Variable gesetzt: strText = "ABC;AZZ;XYZ1;AZ36" und dann : arrKuerzel = Split(strText, ";") verwendet. Dann erschien die Fehlermeldung (in Excel 2013). In 2010 geht es offensichtlich. Erscheint diese "Wahrnehmung" plausibel?
Die Variable strText hat bei jedem Öffnen der Datei unterschiedliche Inhalte, deswegen nicht fest vorgegeben. Ich übernehme die Werte aus einer anderen Zelle. Danach ist jede Zeile in Spalte A zu prüfen, ob sie mit einer der angegeben Buchstabenfolgen (von links gesehen) übereinstimmt oder nicht. Wenn nicht, dann ist die Zeile zu löschen (für obiges Beispiel wäre die Zeile zu löschen, wenn nur "AB" in Spalte A stünde). Alle Zeilen, die mit ABC, AZZ, XYZ1 oder AZ36 beginnen, müssten in diesem Beispiel erhalten bleiben.
Ihr habt mir schon sehr viel geholfen. Ich werde es einfach nochmal genau anschauen.
Grüße, Constantin
Anzeige
AW: Array durchlaufen und Zeilen löschen
17.03.2022 18:15:05
Constantin
Hallo Rudi,
so eine "innere Einkehr" ist manchmal nicht schlecht. Es klappt jetzt. Danke nochmal.
Grüße, Constantin

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige