Zeilen nach wert löschen
#1
Hallo liebe Gemeine.

Ich habe eine Liste mit unterschiedlichen Nummern in TB1 Spalte J

Dann habe ich TB2 und TB3.

Es sollen alle Zeilen in TB2 gelöscht werden, die den Wert in Spalte H aus  TB1 Spalte J haben.

und

Es sollen alle Zeilen in TB3 gelöscht werden, die den Wert in Spalte I aus  TB1 Spalte J haben.

Hiermit kann ich ja nur einen wert angeben
Code:
Sub ZeilenLoeschenNachWert()

  Dim SuchWert As Variant, i As Long, letzteZeile As Long
  Dim Suchbereich As Range

  'Definiere den Suchwert
  SuchWert = InputBox("Bitte geben Sie den zu suchenden Wert ein:")

  'Überprüfen, ob ein Wert eingegeben wurde
  If SuchWert = "" Then
    MsgBox "Kein Wert eingegeben. Der Vorgang wird abgebrochen.", vbCritical
    Exit Sub
  End If
 
'** Ermittlung der letzten Zeile in Spalte A
letzteZeile = ThisWorkbook.Sheets("Fertiggestellte Mengen Chemie").Cells(Rows.Count, 1).End(xlUp).Rows.Row


'** Durchlauf aller Zeilen
For i = letzteZeile To 2 Step -1 'Zählung rückwärts bis Zeile 2
'Abfragen, ob in der ersten Spalte der Buchstabe "x" steht
    If ThisWorkbook.Sheets("Fertiggestellte Mengen Chemie").Cells(i, 8).Value = SuchWert Then
        ThisWorkbook.Sheets("Fertiggestellte Mengen Chemie").Rows(i).Delete Shift:=xlUp
    End If
Next i

MsgBox "Zeilen mit dem Wert '" & SuchWert & "' wurden gelöscht.", vbInformation

End Sub

Danke für eure Unterstützung
Antworten Top
#2
Für Fragestellungen ohne Mustermappe und Musterlösung empfehle ich dir die KI zu befragen.
Antworten Top
#3
Zitat:... die den Wert in Spalte H aus  TB1 Spalte J haben

Bitte versuche, dein Problem so zu formulieren, dass es auch andere nachvollziehen können.

Knobbi38

PS: 
Eine kleines Beispiel wäre auch nicht schlecht, denn keiner möchte deine Tabellen nachbauen.
Antworten Top
#4
Ich habe mehrere unterschiedliche Nummern im TB1 Spalte J stehen

In TB2 können die Nummern in Spalte H vorkommen.
Kommen diese vor, soll die Zeile gelöscht werden

In TB3  können die Nummern in Spalte I vorkommen.
Kommen diese vor, soll die Zeile gelöscht werden
Antworten Top
#5
Hi,

also gut, da du ja auf Beschreibungen anstatt Beispielen bestehst, hier eine Beschreibung des Makros:

Mache eine Schleife über alle relevanten Zeilen von TB1 Spalte J.
Nimm den Wert der Zelle und merke ihn dir.
Mach eine innere Schleife über alle relevanten Zeilen von TB2 Spalte H. Aber von unten nach oben.
Vergleiche den Wert der aktuellen Zelle mit dem gemerkten Wert.
Ist der gleich, dann lösche die ganze Zeile
Nach Abschluss dieser inneren Schleifen, machst du noch eine innere Schleife, diesmal über Spalte I von TB3. Wieder von unten nach oben und wieder mit dem Löschen der Zeile, falls die Werte gleich sind.
Nach dem Ende dieser Schleifen machst du den nächsten Schritt der äußeren Schleife.

Natürlich könnte man das alles noch wesentlich effizienter machen - z.B. durch Merken der Zeilen und diese dann in einem Rutsch löschen. Oder durch Filtern des Blattes oder ... Kommt halt drauf an, wie umfangreich deine Daten sind.
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top
#6
Hi
Zeilen löschen mit Bedingung macht man als VBA-Anfänger am besten so:

1. füge am Ende der Tabelle eine Formel ein, welche alle Zeilen, die gelöscht werden sollen mit 0 kennzeichnet und die die stehen bleiben müssen mit der aktuellen Zeilennummer
2. in die Überschriftenzeile dieser Zeile kommt die 0

jetzt solltest du erstmal die Liste durchgehen und prüfen, ob wunschgemäß markiert wird.
Wenn nein, musst du die Formel noch korrigieren. Wenn alles passt, dann kommt:

3. Wende jetzt auf die ganze Tabelle die Menüfunktion DATEN - DATENTOOLS - DUPLIKATE EINFERNEN an, mit der neuen Spalte als Kriterium und der Option "Keine Überschrift"

die Formel wäre dann für diese (für Zeile 2)
PHP-Code:
=Wenn(ZählenWenns(TB1!J:J;H2);0;Zeile()) 


für das Tabellenblatt TB3 must du dann lediglich aus der H2 ein I2 machen.

so kann man das einfach und elegant ohne Makro machen und daher ist auch sinnvoll, diesen Weg im Makro nachzubauen, da muss man dann keine Schleifen programmieren:

hier mal für TB2:
Code:
With Sheets("TB2").Usedrange
    With .Columns(.columns.Count + 1)
        .FormulaR1C1 = "=IF(CountIfs('TB1'!C9,RC8),0,Row())"
        .Cells(1, 1).Value = 0
        .EntireRow.RevomeDuplicates .Column, xlno
        .ClearContents
    end with
End With
für TB3 passt du dann lediglich den Sheetnamen an und machst in der Formel aus dem RC8 ein RC9
(in VBA ist es günstiger, die englischen formeln mit Z1S1-Addressierngsart zu nehmen, nicht die übliche A1-Addressierung)

das ist einfach und sehr schnell
außerdem kannst du ,wenn du den Code ersmal nur bis zum einfügen der Formel laufen lässt, diese noch im Tabellenblatt kontrollieren und ggf noch korrigieren, in der Regel sogar bei im Einzelstep laufenden Makro.

Gruß Daniel
Antworten Top
#7
So, neuer Versuch.

Code:
Code:
Sub DeleteRowsBasedOnColumn()

  Dim LastRow As Long, i As Long, j As Long, k As Long
  Dim FindValue As Variant


  ' Letzte belegte Zeile ermitteln
  LastRow = ThisWorkbook.Sheets("AV_Ware").Cells(Rows.Count, "A").End(xlUp).Row
  LastRow2 = ThisWorkbook.Sheets("Lieferscheine_mit_Chargennummer").Cells(Rows.Count, "A").End(xlUp).Row
  LastRow3 = ThisWorkbook.Sheets("Fertiggestellte_Mengen_Chemie").Cells(Rows.Count, "A").End(xlUp).Row

  ' Schleife durch alle Zeilen in Spalte J
  For i = LastRow To 2 Step -1
    ' Wert aus Spalte J holen
    FindValue = ThisWorkbook.Sheets("AV_Ware").Cells(i, 10).Value

    ' Überprüfen, ob der Wert in Spalte I vorhanden ist
    For j = LastRow2 To 1 Step -1
      If ThisWorkbook.Sheets("Lieferscheine_mit_Chargennummer").Cells(j, 9).Value = FindValue Then
        ' Zeile löschen
        ThisWorkbook.Sheets("Lieferscheine_mit_Chargennummer").Rows(j).Delete
        ' Schleife für Spalte I beenden
        Exit For
      End If
    Next j
   
   
    ' Überprüfen, ob der Wert in Spalte H vorhanden ist
    For k = LastRow3 To 1 Step -1
      If ThisWorkbook.Sheets("Fertiggestellte_Mengen_Chemie").Cells(k, 8).Value = FindValue Then
        ' Zeile löschen
        ThisWorkbook.Sheets("Fertiggestellte_Mengen_Chemie").Rows(k).Delete
        ' Schleife für Spalte H beenden
        Exit For
      End If
    Next k
   
  Next i
 
  MsgBox "Löschen abgeschlossen!"

End Sub


Nun das noch bestehende Problem:

Stehen die Werte einzeln werden diese gelöscht, stehen die Werte direkt untereinander werden sie nicht gelöscht

AV_Ware-Werte           Fertiggestellte_Mengen_Chemie           Lieferscheine_mit_Chargennummer
1                               1 -wird nicht gelöscht                                1 -wird nicht gelöscht
2                               2 -wird nicht gelöscht                                2 -wird nicht gelöscht
3                               3 -wird nicht gelöscht                                3 -wird nicht gelöscht
4                               4 -wird nicht gelöscht                                4 -wird nicht gelöscht
5                               5 -wird nicht gelöscht                                5 -wird nicht gelöscht
                                 111                                                        111
                                 222                                                        222
                                 1 -wird gelöscht                                        1 -wird gelöscht
                                 333                                                        333
                                 2 -wird gelöscht                                        2 -wird gelöscht
Antworten Top
#8
Hi,

du hast ja meinen Vorschlag recht schön umgesetzt. Nur eine Kleinigkeit hast du ergänzt, und die macht das beschriebene Problem. Lass einfach das "Exit For" weg. Ich habe nirgends beschrieben, dass du die Schleife vorzeitig abbrechen sollst.

PS: Du kannst LastRow2 und LastRow3 auch mit jedem Durchlauf der äußeren Schleife neu berechnen. Das spart dir dann einige Vergleiche, da deine List ja schon kürzer ist. Musst du aber nicht machen, denn die Vergleiche selbst kosten nicht viel Zeit.
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top
#9
Hi

so wie du es zeigst, kommen die Nummern mehrfach in der Liste vor.
da du die Schleife nach dem Löschen abbrichst (Exit For), wird immer nur das erste Vorkommen gelöscht und die weiteren bleiben stehen.
lass das Exit For mal weg.

btw, hast du dir meinen Ansatz mal angeschaut?
ich lösche Zeilen nur noch so, weil's einfacher zu programmieren ist und in der Regel auch schneller geht.


Gruß Daniel
Antworten Top
#10
Hi,

da kann ich Daniel nur zustimmen...
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top


Gehe zu:


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