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

Forumthread: VBA: Zeile in anderem Blatt finden und löschen

VBA: Zeile in anderem Blatt finden und löschen
18.11.2019 23:45:54
Lukas
Hallo liebe Community,
ich habe eine Excel-Datei mit zwei Tabellenblättern. Die (vereinfachte) Ausgangssitutation ist folgende:
Tabellenblatt 1 ("Input"):
Datum, Vorname, Name, Thema
Tabellenblatt 2 ("Output"):
Datum, Vorname, Name, Thema, Status
Ziel:
Wenn in einer beliebigen Zeile in Spalte D im Tabellenblatt 2 ("Output") der Status "xy" ausgewählt wurde, durchsuche Tabellenblatt 1 ("Input") nach den vier Kriterien (Datum, Vorname, Name, Thema) und lösche die betroffene Zeile im Tabellenblatt 1 ("Input"). Das kann gerne auch mit einer Hilfsspalte passieren, z.B. mit einer ID basierend auf den vier Kriterien bzw. einer einfachen Verkettung der vier Kriterien (z.B. "18.11.2019-Max-Mustermann-Wohnung-xy").
Wie kann ich das als VBA umsetzen?
Vielen Dank für Eure Hilfe!
Anzeige

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA: Zeile in anderem Blatt finden und löschen
19.11.2019 00:14:20
Rob
Hallo Lukas,
so z.B.:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim wsInput As Worksheet
Set wsInput = Sheets("Input")
If Not Intersect(Target, Columns(5)) Is Nothing Then
wsInput.Cells.Rows(Target.Cells.Row).Delete
End If
End Sub

Anzeige
AW: VBA: Zeile in anderem Blatt finden und löschen
19.11.2019 00:16:13
Rob
Hallo Lukas,
folgenden Code direkt in Tabelle2(Output) einfügen:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim wsInput As Worksheet
Set wsInput = Sheets("Input")
If Not Intersect(Target, Columns(5)) Is Nothing Then
wsInput.Cells.Rows(Target.Cells.Row).Delete
End If
End Sub

Anzeige
AW: VBA: Zeile in anderem Blatt finden und löschen
19.11.2019 00:19:19
Rob
Du musst allerdings beide Tabellen vorher nach ID absteigend sortieren. Ich gehe mal jetzt davon aus, dass beiden Tabellen identisch sind. Andernfalls müsste man das Makro noch anpassen.
AW: VBA: Zeile in anderem Blatt finden und löschen
19.11.2019 10:11:51
Daniel
Naja spätesten nach der ersten Ausführung des Makros sind die Listen nicht mehr gleich und ab der zweiten musst schon explizit suchen.
Gruß Daniel
Anzeige
AW: VBA: Zeile in anderem Blatt finden und löschen
19.11.2019 10:58:20
Lukas
Rob, vielen Dank für deine schnelle Antwort und den Vorschlag! Daniel hat allerdings recht: Die Listen sind nicht exakt identisch.
Grundsätzlich gilt: Einträge, die im Input gelöscht werden, werden nicht in den Output übernommen (fliegen also bei der nächsten Aktualisierung raus - dafür hab ich bereits einen Makro). Allerdings arbeite ich ausschließlich im Output, weshalb ich von dort aus gerne Sachen im Input löschen möchte. Wenn ich etwas nur im Output lösche, taucht es bei der nächsten Aktualisierung wieder auf, weil es nach wie vor im Input vorhanden ist.
Ich habe also drei Möglichkeiten:
1. Manuell: ID im Input suchen und Zeile dort löschen (das will ich vermeiden)
2. VBA: ID im Input suchen und Zeile dort löschen
3. VBA: ID im Input suchen und Zeile dort löschen, zusätzlich Zeile im Output löschen (alternativ den VBA aus Lösung Nr. 2 einfach zweimal laufen lassen)
Zudem ist die Spaltenaufteilung nicht die gleiche. Im Input sind deutlich mehr Spalten vorhanden, welche ich nicht alle in den Output übernehme.
Anzeige
AW: VBA: Zeile in anderem Blatt finden und löschen
19.11.2019 11:26:33
Daniel
Wenn die Listen nicht allzulang sind, könntest du mit ZählenWenns in einer Hilfsspalte prüfen, ob der Eintrag aus Tabelle 1 auch in Tabelle 2 vorhanden ist.
Gruß Daniel
AW: VBA: Zeile in anderem Blatt finden und löschen
19.11.2019 11:43:17
Rob
Hallo Lukas,
ja richtig, war nicht ganz zu Ende gedacht...ich passe das nochmal an.
Grüße, Rob
AW: VBA: Zeile in anderem Blatt finden und löschen
19.11.2019 14:42:42
Rob
Doch bischen mehr Code wie ich dachte aber damit sollte es funktionieren:

Option Explicit
Dim lastColumn As Integer, lastRow As Integer
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim wsInput As Worksheet, wsOutput As Worksheet
Dim findText As Range
Set wsInput = Sheets("Input")
Set wsOutput = Sheets("Output")
If Not Intersect(Target, Columns(5)) Is Nothing Then
'Funktion aufrufen um ID zu erstellen -> Verkettung der Spalten
Call ConcatenateRows(wsInput)
Call ConcatenateRows(wsOutput)
'ID in Arbeitsblatt 'Input' suchen und Zeile löschen
lastColumn = wsInput.Cells(1, Columns.Count).End(xlToLeft).Column
Set findText = wsInput.Columns(lastColumn).Find(Target.Offset(0, 1))
wsInput.Rows(findText.Row).Delete
'Ausgewählte Zeile in Arbeitsblatt 'Output' löschen
Rows(Target.Row).Delete
End If
'Abschließend die IDs wieder löschen
wsInput.Columns(lastColumn).Clear
lastColumn = wsOutput.Cells(1, Columns.Count).End(xlToLeft).Column
wsOutput.Columns(lastColumn).Clear
End Sub
Private Sub ConcatenateRows(ws As Worksheet)
Dim r As Range, concatRange As Range
With ws
lastColumn = .Cells(1, .Columns.Count).End(xlToLeft).Column + 1
lastRow = .Cells(.Rows.Count, 5).End(xlUp).Row
Set concatRange = .Range(.Cells(1, lastColumn), .Cells(lastRow, lastColumn))
End With
For Each r In concatRange
r = Application.WorksheetFunction.Concat(r, r.Offset(0, -5), r.Offset(0, -4), r.Offset( _
0, -3))
Next r
End Sub

Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Zeilen in Excel mit VBA finden und löschen


Schritt-für-Schritt-Anleitung

Um Zeilen in einem Excel-Arbeitsblatt mit VBA zu finden und zu löschen, folge diesen Schritten:

  1. Öffne den VBA-Editor: Drücke ALT + F11, um den Visual Basic for Applications (VBA) Editor zu öffnen.

  2. Füge ein neues Modul hinzu: Klicke mit der rechten Maustaste auf "VBAProject (deineDatei.xlsx)" und wähle Einfügen > Modul.

  3. Kopiere den folgenden Code in das Modul:

    Option Explicit
    Dim lastColumn As Integer, lastRow As Integer
    
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
       Dim wsInput As Worksheet, wsOutput As Worksheet
       Dim findText As Range
       Set wsInput = Sheets("Input")
       Set wsOutput = Sheets("Output")
    
       If Not Intersect(Target, Columns(5)) Is Nothing Then
           ' Funktion aufrufen um ID zu erstellen
           Call ConcatenateRows(wsInput)
           Call ConcatenateRows(wsOutput)
    
           ' ID in Arbeitsblatt 'Input' suchen und Zeile löschen
           lastColumn = wsInput.Cells(1, Columns.Count).End(xlToLeft).Column
           Set findText = wsInput.Columns(lastColumn).Find(Target.Offset(0, 1))
           wsInput.Rows(findText.Row).Delete
    
           ' Ausgewählte Zeile in Arbeitsblatt 'Output' löschen
           Rows(Target.Row).Delete
       End If
    
       ' IDs wieder löschen
       wsInput.Columns(lastColumn).Clear
       lastColumn = wsOutput.Cells(1, Columns.Count).End(xlToLeft).Column
       wsOutput.Columns(lastColumn).Clear
    End Sub
    
    Private Sub ConcatenateRows(ws As Worksheet)
       Dim r As Range, concatRange As Range
       With ws
           lastColumn = .Cells(1, .Columns.Count).End(xlToLeft).Column + 1
           lastRow = .Cells(.Rows.Count, 5).End(xlUp).Row
           Set concatRange = .Range(.Cells(1, lastColumn), .Cells(lastRow, lastColumn))
       End With
       For Each r In concatRange
           r = Application.WorksheetFunction.Concat(r, r.Offset(0, -5), r.Offset(0, -4), r.Offset(0, -3))
       Next r
    End Sub
  4. Speichere die Änderungen und schließe den VBA-Editor.

  5. Teste das Makro, indem du eine Zelle in der fünften Spalte des "Output"-Blattes auswählst. Das Makro wird automatisch die entsprechende Zeile im "Input"-Blatt suchen und löschen.


Häufige Fehler und Lösungen

  • Fehler: "Objektvariable oder With-Blockvariable nicht gesetzt"
    Lösung: Stelle sicher, dass die Blattnamen "Input" und "Output" genau übereinstimmen.

  • Fehler: Zeile kann nicht gelöscht werden
    Lösung: Überprüfe, ob die Zeile, die gelöscht werden soll, existiert und nicht bereits gelöscht wurde.

  • Makro funktioniert nicht
    Lösung: Stelle sicher, dass die Makros in deiner Excel-Datei aktiviert sind.


Alternative Methoden

Falls du kein VBA verwenden möchtest, kannst du auch die Funktion ZählenWenns in einer Hilfsspalte nutzen, um festzustellen, ob ein Eintrag im "Input"-Blatt vorhanden ist. Die Formel könnte so aussehen:

=ZÄHLENWENN(Input!A:A; A2) + ZÄHLENWENN(Input!B:B; B2) + ZÄHLENWENN(Input!C:C; C2) + ZÄHLENWENN(Input!D:D; D2)

Diese Formel gibt an, wie oft die Kombination aus Datum, Vorname, Name und Thema im "Input"-Blatt vorkommt.


Praktische Beispiele

Angenommen, du hast folgende Daten in "Input":

Datum Vorname Name Thema
18.11.2019 Max Mustermann Wohnung
19.11.2019 Anna Müller Auto

Und in "Output":

Datum Vorname Name Thema Status
18.11.2019 Max Mustermann Wohnung xy

Wenn du in der Spalte "Status" von "Output" den Wert "xy" auswählst, wird die entsprechende Zeile in "Input" gelöscht.


Tipps für Profis

  • Verwendung von Option Explicit: Dies zwingt dich, alle Variablen zu deklarieren, was Fehler reduziert und die Lesbarkeit erhöht.

  • Fehlerbehandlung: Integriere Error-Handling in deinen Code, um unerwartete Fehler zu vermeiden. Du kannst On Error Resume Next verwenden, um den Code fortzusetzen, auch wenn ein Fehler auftritt.

  • Optimierung: Deaktiviere die Bildschirmaktualisierung (Application.ScreenUpdating = False) während der Ausführung des Makros, um die Performance zu verbessern.


FAQ: Häufige Fragen

1. Wie lösche ich eine Zeile in Excel manuell?
Um eine Zeile manuell zu löschen, klicke mit der rechten Maustaste auf die Zeilennummer und wähle "Zeile löschen".

2. Funktioniert das Makro in allen Excel-Versionen?
Das Makro sollte in Excel 2010 und neueren Versionen funktionieren, da es grundlegende VBA-Funktionen verwendet.

3. Kann ich das Makro anpassen, um mehrere Zeilen zu löschen?
Ja, du kannst die Logik im Makro erweitern, um mehrere Zeilen basierend auf bestimmten Kriterien zu löschen.

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