Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Zeilen löschen nach Ergebnis mit SVERWEIS

Forumthread: Zeilen löschen nach Ergebnis mit SVERWEIS

Zeilen löschen nach Ergebnis mit SVERWEIS
Stefan
Hallo zusammen
Ich habe eine Liste, bei welcher nach Ergebnis (="e") mit SVERWEIS oder INDEX/VERGLEICH Zeilen gelöscht werden müssen:
WENN SVERWEIS(VERKETTEN(LINKS(A22;6);"00");$A$4:$J$1000;10;0) = e dann Zeile löschen
oder besser
WENN INDEX(J:J;VERGLEICH(VERKETTEN(LINKS(A22;6);"00");A:A;0)) = e dann Zeile löschen
Mit dem bestehenden Makro werden alle Zeilen mit einem "e" in Spalte J gelöscht:
Sub Erledigte_Projekte_löschen()
Dim Frage As Double
Dim WshShell
Dim i As Long
Frage = MsgBox("Sollen die erledigten Projekte mit (e) wirklich gelöscht werden?" & Chr(13) & _
"Der Vorgang kann nicht mehr rückgängig gemacht werden!", 33, "Frage")
If Frage = vbCancel Then
Exit Sub
Else
Application.ScreenUpdating = False
Set WshShell = CreateObject("WScript.Shell")
WshShell.popup "Die erledigten Projekte werden gelöscht...", 2, "Erledigte Projekte löschen"
For i = Cells(Rows.Count, 10).End(xlUp).Row To 1 Step -1
If Cells(i, 10) = "e" Then Rows(i).Delete
Application.ScreenUpdating = True
Next
End If
End Sub

Die Zeilen dürfen aber nur gelöscht werden, wenn das Hauptprojekt mit den letzten beiden Ziffern "00" in Spalte A enthält und in Spalte J ein "e" gesetzt ist.
Wie kann die Bedingung in das Makro integriert werden?
Gruss
Stefan
Muster-Datei: https://www.herber.de/bbs/user/71099.xls
Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Zeilen löschen nach Ergebnis mit SVERWEIS
17.08.2010 12:06:36
Matthias
Hallo
Nicht getestet.
bitte an einer Kopie probieren.
If Cells(i, 10) = "e" And Right(Cells(i, 1), 2) = "00" Then Rows(i).Delete
Gruß Matthias
Nö :-P
17.08.2010 12:25:01
Klaus
Hallo Matthias,
damit erwischt du aber nicht die "00" des Hauptprojekts! Bin ich auch zunächst drüber gestolpert, aber Stefan hat die Formel fürs Hauptprojekt freundlicherweise in der Frage gleich mitgeliefert.
Grüße,
Klaus M.vdT.
Anzeige
AW: Zeilen löschen nach Ergebnis mit SVERWEIS
17.08.2010 12:23:34
Klaus
Moin Stefan,
Spalte L (die ist ja leer) habe ich mal als Hilfsspalte mißbraucht. Dafür den Popup auskommentiert, dank Hilfsspalte können die Zeilen ohne For-Next schleife gelöscht werden und das geht rasend schnell.
Option Explicit
Sub Erledigte_Projekte_löschen()
Dim Frage As Double
Dim WshShell
Dim i As Long
Frage = MsgBox("Sollen die erledigten Projekte mit (e) wirklich gelöscht werden?" & Chr(13) & _
"Der Vorgang kann nicht mehr rückgängig gemacht werden!", 33, "Frage")
If Frage = vbCancel Then
Exit Sub
Else
Application.ScreenUpdating = False
'Set WshShell = CreateObject("WScript.Shell")
'WshShell.popup "Die erledigten Projekte werden gelöscht...", 1, "Erledigte Projekte löschen"
With Sheets("Allgemeine Projekte")
.Range("L4:L" & .Range("A4").End(xlDown).Row).FormulaR1C1 = _
"=IF(INDEX(C[-2],MATCH(CONCATENATE(LEFT(RC[-11],6),""00""),C[-11],0))=""e"",1/0,"""")"
.Columns("L:L").SpecialCells(xlCellTypeFormulas, 16).EntireRow.Delete shift:=xlUp
.Columns("L:L").ClearContents
End With
Application.ScreenUpdating = True
End If
End Sub

Anzeige
AW: Zeilen löschen nach Ergebnis mit SVERWEIS
17.08.2010 15:00:44
Stefan
Hallo Klaus
Vielen Dank für deinen raschen Vorschlag. Der Code läuft nur fehlerfrei, wenn er entsprechende Bedingungen findet, ansonsten wird ein Laufzeitfehler "1004" erzeugt. Kann dieser Fehler vermieden werden?
Noch eine Frage: Ist diese Prozedur grundsätzlich nur mit Formel in eine freie Spalte einfügen und danach löschen möglich (gemäss deinem Beispiel) oder gibt es dazu noch einen anderen Weg?
Gruss
Stefan
Anzeige
Fehlerbehandlung
17.08.2010 15:13:07
Klaus
Hallo Stefan,
ich würd den Fehler jetzt mit einem "On Error Resume Next" am Anfang ausbügeln, aber das ist nicht der richtige Weg. Die Fehlerbehandlung müsste per IF-Schleife um die Zeile
.Columns("L:L").SpecialCells(xlCellTypeFormulas, 16).EntireRow.Delete shift:=xlUp
herum gebastelt werden, aber da steh ich grad auf dem Schauch ...
Um in VBA Zeilen zu löschen, kannst du:
1) jede einzelne per FOR-NEXT abfragen und einzeln löschen. Einfach zu programmieren, aber leider sehr langsam.
2) jede einzelne per FOR-NEXT abfragen und einer Union(Range) hinzufügen. Am ende alle betroffenen Zeilen auf einen Schlag lösen. Schneller als 1, etwas unübersichtlicher.
3) Den super-schnellen Workaround mit der Hilfsspalte nehmen. Der Trick ist, dass die WENN-Formel bei erfüllten Bedingungen #DIV0! ergibt (da sie versucht, 1 durch null zu rechnen). Gelöscht werden alle Zeilen, in denen #DIV0! steht. Da die Zeilen im Arbeitsblatt selbst (per Formel) zusammengesucht werden und alle Fehlerhaften Zellen auf einen Schlag markiert werden können, ist diese Variante rasend schnell.
Ausserdem hast du die Formellösung bereits selbst gegeben und ich musste nicht mehr nachdenken :-)
Wenn du auf die Hilfsspalte verzichten willst / musst, wähle Variante 1 oder 2 und frage die Bedingungen in VBA ab. Wie das geht weiss ich aber nicht, ich bin selbst eher der Formelmensch.
Schlimmstenfalls verschieb die Hilfsspalte nach Z oder sogar nach IV ....
Grüße,
Klaus M.vdT.
Anzeige
AW: Fehlerbehandlung
17.08.2010 16:34:06
Stefan
Hallo Klaus
Ich weiss leider nicht wie man das mit der For-Next-Schlaufe bewältigen kann.
Vielleicht weiss ja jemand, wie man das auf diese Weise lösen kann.
Gruss
Stefan
;
Anzeige
Anzeige

Infobox / Tutorial

Zeilen löschen nach Ergebnis mit SVERWEIS


Schritt-für-Schritt-Anleitung

Um Zeilen in Excel zu löschen, wenn ein bestimmtes Ergebnis mit SVERWEIS oder INDEX/VERGLEICH gefunden wird, befolge diese Schritte:

  1. Öffne den VBA-Editor:

    • Drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Erstelle ein neues Modul:

    • Klicke mit der rechten Maustaste auf "VBAProject (deine Arbeitsmappe)" und wähle "Einfügen" > "Modul".
  3. Füge den folgenden Code ein:

    Sub Erledigte_Projekte_löschen()
       Dim Frage As Double
       Dim i As Long
       Frage = MsgBox("Sollen die erledigten Projekte mit (e) wirklich gelöscht werden?" & vbCrLf & _
                      "Der Vorgang kann nicht mehr rückgängig gemacht werden!", 33, "Frage")
       If Frage = vbCancel Then
           Exit Sub
       Else
           Application.ScreenUpdating = False
           For i = Cells(Rows.Count, 10).End(xlUp).Row To 1 Step -1
               If Cells(i, 10) = "e" And Right(Cells(i, 1), 2) = "00" Then
                   Rows(i).Delete
               End If
           Next i
           Application.ScreenUpdating = True
       End If
    End Sub
  4. Schließe den VBA-Editor und gehe zurück zu Excel.

  5. Führe das Makro aus:

    • Drücke ALT + F8, wähle "Erledigte_Projekte_löschen" und klicke auf "Ausführen".

Häufige Fehler und Lösungen

  • Laufzeitfehler 1004:

    • Dieser Fehler tritt auf, wenn das Makro versucht, Zeilen zu löschen, die nicht vorhanden sind. Stelle sicher, dass die Bedingungen im Code korrekt sind. Verwende On Error Resume Next, um diesen Fehler zu umgehen, aber sei vorsichtig, da dies andere Fehler maskieren kann.
  • Zeilen werden nicht gelöscht:

    • Überprüfe, ob die Bedingungen in der IF-Anweisung wie gewünscht formuliert sind. Du kannst die Logik auch anpassen, um sicherzustellen, dass die richtigen Zeilen identifiziert werden.

Alternative Methoden

  1. Hilfsspalte verwenden:

    • Du kannst eine Hilfsspalte (z.B. Spalte L) einfügen, um die Bedingungen zu prüfen und dann alle markierten Zeilen auf einmal zu löschen.
      With Sheets("Allgemeine Projekte")
      .Range("L4:L" & .Range("A4").End(xlDown).Row).FormulaR1C1 = _
      "=IF(INDEX(C[-2],MATCH(CONCATENATE(LEFT(RC[-11],6),""00""),C[-11],0))=""e"",1/0,"""")"
      .Columns("L:L").SpecialCells(xlCellTypeFormulas, 16).EntireRow.Delete shift:=xlUp
      .Columns("L:L").ClearContents
      End With
  2. Verwendung von UNION:

    • Eine andere Möglichkeit besteht darin, mehrere Zeilen in einer UNION-Operation zu speichern und sie dann auf einmal zu löschen, was die Leistung verbessert.

Praktische Beispiele

Angenommen, du hast folgende Daten in Spalte A und J:

A J
123456 e
123460 x
123460 e
123450 e
123460 x

Wenn du das Makro ausführst, werden die Zeilen gelöscht, in denen die letzten beiden Ziffern "00" sind und in Spalte J ein "e" steht.


Tipps für Profis

  • Optimierung des Codes:

    • Vermeide Application.ScreenUpdating mehrmals im Code. Setze es einmal am Anfang und am Ende des Codes.
  • Fehlerbehandlung:

    • Implementiere eine umfassende Fehlerbehandlung, um unerwartete Probleme zu vermeiden. Verwende On Error GoTo für spezifische Fehlerbehandlungen.

FAQ: Häufige Fragen

1. Kann ich das Makro für andere Bedingungen anpassen?
Ja, du kannst die Bedingungen in der IF-Anweisung anpassen, um verschiedene Kriterien für das Löschen von Zeilen zu definieren.

2. Ist es möglich, das Löschen rückgängig zu machen?
Nein, einmal gelöschte Zeilen können nicht zurückgeholt werden, daher solltest du sicherstellen, dass du eine Sicherung deiner Daten hast, bevor du das Makro ausführst.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige