Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

VBA, Zeile löschen wenn...
#1
Hallo,
ich habe google schon hart gefordert, bin aber nicht ganz fündig geworden. Vielleicht benutze ich auch die falschen keywords..

Ich betreue in einem Verein eine Exceltabelle mit ca 800 Zeilen und 9 Spalten.
Davon möchte ich per Macro eine Zeile automatisch löschen wenn in spalte 1 ein bestimmter Nachname steht (bis zu 30 verschiedene) Oder in spalte 3 eine bestimmte Stadt (auch locker 20 oder mehr die gelöscht werden müssen)

Mein alter Weg war schlecht

Code:
last = Cells(Rows.Count, 1).End(xlUp).Row

i = 2
While i <= last
    If Cells(i, 3).Value = "Leipzig" Or Cells(i, 3).Value = "Halle" Or ... Or...Or...Or...Or...Or.... Then
        Rows(i).Delete
    Else
        i = i + 1
    End If
Wend
 
i = 2
While i <= last
    If Cells(i, 1).Value = "Jahn" Or Cells(i, 1).Value = "Müller" Or Cells(i, 1).Value = "Vater" Or ... Or ... Or...Or...Or...Then
        Rows(i).Delete
    Else
        i = i + 1
    End If
Wend

Inzwischen bin ich am Limit der "Or" angekommen, brauche aber noch mehr..

Ihr könnt euch vorstellen wie lang das Macro dauert....

In einem Englischen Forum habe ich folgendes gefunden


Code:
Sub Sample()
    Dim sString As String
    Dim MyAr
    Dim i As Long
    Dim delRange As Range, aCell As Range
    Dim ws As Worksheet

    Set ws = ThisWorkbook.Sheets("Sheet1")

    '~~> Add more to the list here separated by "/"
    sString = "Vater/Jahn/Müller"

    MyAr = Split(sString, "/")

    With ws
        For i = LBound(MyAr) To UBound(MyAr)

            Set aCell = .Columns(1).Find(What:=MyAr(i), LookIn:=xlValues, _
            LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
            MatchCase:=False, SearchFormat:=False)

            If Not aCell Is Nothing Then
                If delRange Is Nothing Then
                    Set delRange = .Rows(aCell.Row)
                Else
                    Set delRange = Union(delRange, .Rows(aCell.Row))
                End If
            End If
        Next i
    End With

    If Not delange Is Nothing Then delRange.Delete
End Sub




Hier habe ich das Problem das nur Spalte 1 durchsucht wird und nur die erste Zeile die gefunden wird gelöscht wird. (Auch sonst hab ich keine Ahnung was hier passiert, das ist über meinem einfachen "If Then Else" Wissen..)

Hat jemand Tipps wie ich das umsetzten kann?

Zusammenfassung:
Ich möchte die ganze Zeile löschen wenn jemand A oder D oder M oder P oder Y heißt oder wenn er aus A oder B oder N oder U oder Z kommt ohne mich in unendlichen if schleifen aufzuhängen.

Vielen Dank für die Hilfe.
Antwortento top
#2
Hi

kann mir gut vorstellen, dass mein Makro funktioniert, werde es ohne Datei aber nicht testen können.

Stehen die vielen Suchbegriffe vielleicht auch wo in der Tabelle gelistet? Wäre vorteilhaft.

Bedanken kannst Du Dich nachher, jetzt ist Zeit des Bittens.

Gruss, Raoul
Antwortento top
#3
Hallo,
Sub TEST()
Dim lngZ As Long
For lngZ = Range("A1").CurrentRegion.Rows.Count To 2 Step -1
Select Case Cells(lngZ, 1).Value
Case "A", "D", "M", "P", "Y"
Rows(lngZ).Delete
Case Else
Select Case Cells(lngZ, 3).Value
Case "A", "B", "N", "U", "Z"
Rows(lngZ).Delete
End Select
End Select
Next lngZ
End Sub
Gruß Uwe
[-] Folgende(r) 1 Benutzer sagt Danke an Kuwer für diesen Beitrag:
  • MichaLauterbach
Antwortento top
#4
Hallo


eventuell so?

Code:
Sub Löschen()
    Dim Last As Integer
    Dim i As Integer, Z1 As Integer
    Dim strNamen As String, strOrte As String
   
    Z1 = 2
    strOrte = "München; Berlin; Hier; Dort;" 'mit ; am Ende
    strNamen = "Müller; Jahn; Er; Ich;"
    '- - - -
   
    Last = Cells(Rows.Count, 1).End(xlUp).Row
   
    For i = Last To Z1 Step -1
        If (Cells(i, 1) <> "" And InStr(strNamen, Cells(i, 1) & ";") > 0) Or _
            (Cells(i, 3) <> "" And InStr(strOrte, Cells(i, 3) & ";") > 0) Then
           
                Rows(i).Delete
        End If
    Next
   
End Sub

LG UweD
[-] Folgende(r) 1 Benutzer sagt Danke an UweD für diesen Beitrag:
  • MichaLauterbach
Antwortento top
#5
Uwe und UweD, vielen Dank an euch. Funktioniert Super.

Nun hab ich noch 2 Fragen,

@Uwe  
Wie kann ich in deinem Code eine dritte Spalte checken wenn mal benötigt?

@Uwe und UweD
Ich würde auch gerne mit *Berlin* arbeiten, so das nicht exakt "Berlin" da stehen muss um gelöscht zu werden, sondern auch "Berlin Neuköln" oder "Berlin(Neuköln)" gelöscht wird. 

Das klappt aber mit * nicht.
Antwortento top
#6
Hallo,

mit 3 Spalten:
Sub TEST()
Dim lngZ As Long
For lngZ = Range("A1").CurrentRegion.Rows.Count To 2 Step -1
'Prüfung Spalte A
Select Case Cells(lngZ, 1).Value
Case "A", "D", "M", "P", "Y"
Rows(lngZ).Delete
Case Else
'Prüfung Spalte C
Select Case Cells(lngZ, 3).Value
Case "A", "B", "N", "U", "Z"
Rows(lngZ).Delete
Case Else
'Prüfung Spalte E
Select Case Cells(lngZ, 5).Value
Case "C", "G", "J", "L", "Q"
Rows(lngZ).Delete
End Select
End Select
End Select
Next lngZ
End Sub
Gruß Uwe
[-] Folgende(r) 1 Benutzer sagt Danke an Kuwer für diesen Beitrag:
  • MichaLauterbach
Antwortento top
#7
Vielen Dank!
Antwortento top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste