In Zeile 3 Zelleninhalte überprüfen und ggf. Löschen

  • Excel

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    In Zeile 3 Zelleninhalte überprüfen und ggf. Löschen

    Liebe Community

    ich bin neu in VBA und kenne mich noch nicht so gut aus mit Excel Makros.

    Ich möchte folgendes in meinem Excel machen:
    Es gibt 5 Spalten, über 2000 Zeilen(rows) und viele Einträge.

    Ich möchte nun das er jede Zeile(Row) Markiert und 3 von den 5 Spalten Überprüft ob der angegebene wert auf alle 3 Zellen zutrifft - wenn Ja löschen wenn Nein nächste Zeile.

    Ich hab mir da natürlich schon Gedanken gemacht und mich auch schon etwas "gespielt" allerdings kein Zufriedenstellendes Ergebnis erzielt.

    Mit For each Row in Range wollte ich starten und dann soll er in jeder Zeile überprüfen ob Zelle C, D und F den im Code festgehalten wert entspricht.
    Wenn der Inhalt stimmt soll er die ganze Zeile (Row) löschen, sollte nur einer der drei Zellen nicht übereinstimmen soll er die nächste Zeile überprüfen.

    Beispiel
    Er soll alle Zeilen überprüfen
    Wenn Zelle C1 = 01.01.2013, D1 = 01.01.2013 und F1 = abcdef dann Löschen else nächte Zeile(Row)

    Ich habe aber ehrlich gesagt null Ahnung wie ich das Codetechnisch verpacke.

    Bitte um eure Unterstützung.
    Nothing to see :whistling:
    probier mal das hier:

    Visual Basic-Quellcode

    1. Dim i As Integer
    2. Sub Makro1()
    3. '
    4. ' Makro1 Makro
    5. '
    6. i = 1
    7. For i = 1 To 50 Step 1
    8. If ActiveSheet.Range("a" & i).Value <> "" And ActiveSheet.Range("B" & i).Value <> "" And ActiveSheet.Range("C" & i).Value <> "" Then
    9. If ActiveSheet.Range("a" & i).Value = 5 And ActiveSheet.Range("b" & i).Value = 3 And ActiveSheet.Range("C" & i).Value = 6 Then
    10. ActiveSheet.Rows(i).Delete
    11. End If
    12. End If
    13. Next
    14. vbResult = MsgBox("alles klar", vbOKOnly)
    15. End Sub


    ist mal en beispiel mit zahlen, aber kannst auch jedes andere format für die zellinhalte nehmen.
    wenn du genau weisst, wie viele zeilen in deinem sheet mit daten gefüllt sind, solltest du die for-schleife begrenzen sonst könnte es sein, dass sich das ganze in die unendlichkeit verliert.

    wenn innerhalb deiner daten keine einzige zeile leer ist, kannst das auch als abbruchbedingung nutzen und machst dann statt for-next einfach

    Visual Basic-Quellcode

    1. i=1
    2. Do
    3. ' Hier deine Zeilen löschen
    4. i=i+1
    5. Loop Until ActiveSheet.Range("A"&i).value="" Or ActiveSheet("B"&i).value="" Or ActiveSheet.Range("C"&i).value=""

    Visual Basic-Quellcode

    1. For r = Cells(Rows.Count).End(xlUp).Row To 1 Step -1 'rückwärts, da bei Delete die Zeilen neu nummeriert werden
    2. If Cells(r,2).Value = DateSerial(2013,1,1) And Cells(r,3).Value="abcde" And Cells(r,4).Value = 12345 Then Rows(r).Delete Shift:=xlUp
    3. Next
    Das Ganze in den Code-Bereich des Worksheet packen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @affrop:

    Vielen lieben Dank! :D
    Funktioniert beides!

    Aber ein Problem hab ich, es sind wie gesagt knapp 2000 Einträge in der Tabelle, er löscht mir aber immer nur eine kleine Hand voll, wie kann ich das ändern? :)

    @petaod:
    Muss ich noch ausprobieren - vielen dank. :)
    Nothing to see :whistling:
    es werden nur die zeilen gelöscht, wo alle bedingungen der if-konstruktionen erfüllt sind.
    wenn von deinen 2000 datensätzen alle drei bedingungen nur bei 5 datensätzen erfüllt sind, löscht er halt nur 5.
    oder es sind so viele löschvorgänge, dass die zeilenneunummereierung sich überschlägt und der aktuelle wert von i dann schon größer ist, als die aktuelle zeilenzahl.
    dann musste die for-schleife en bissl abändern und von unten anfangen. etwa so:

    Visual Basic-Quellcode

    1. Dim i As Integer
    2. Sub Makro1()
    3. '
    4. ' Makro1 Makro
    5. '
    6. i = 2000
    7. Do
    8. If ActiveSheet.Range("a" & i).Value <> "" And ActiveSheet.Range("B" & i).Value <> "" And ActiveSheet.Range("C" & i).Value <> "" Then
    9. If ActiveSheet.Range("a" & i).Value = 5 And ActiveSheet.Range("b" & i).Value = 3 And ActiveSheet.Range("C" & i).Value = 6 Then
    10. ActiveSheet.Rows(i).Delete
    11. End If
    12. End If
    13. i=i-1
    14. Loop Until i=0
    15. vbResult = MsgBox("alles klar", vbOKOnly)
    16. End Sub


    oder halt

    Visual Basic-Quellcode

    1. For i=2000 to 1 step -1
    2. 'Zeilen löschen
    3. next


    suchs dir aus ob du lieber ne for-next-schleife oder ne do-loop-schleife haben willst.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „affrop“ ()

    @affrop:
    Es ist gefährlich, mit ActiveSheet zu arbeiten, da diese Methode darauf angewiesen ist, dass der Benutzer zufällig gerade das richtige Sheet aktiviert hat.
    Wenn der Benutzer während dem Programmablauf zufällig im Workbook rumklickt, fliegt der Code auf die Schnauze.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    @petaod:
    stimmt natürlich. besser ists statt ActiveSheet zu schreiben Worksheets("Tabelle1").
    mir gings aber bei dem code die verdeutlichung der schleife, da hab ich einfach mal unterstellt, dass er nicht im workbook rumklicken wird solange er aufs ergebnis der schleife wartet
    Wenn sich der Code, wie hier, auf ein ganz bestimmtes Worksheet bezieht, würde ich ihn wirklich als Methode an dieses Sheet binden und in dem entsprechenden Codebereich des Sheets unterbringen.
    In dem Fall kannst du dir sämtliche Verweise auf das Worksheet sparen, da sich alles zunächst auf Me (das Worksheet selbst) bezieht.

    In einem Modul bringe ich üblicherweise nur allgemeingültigen Code (meist irgendwelche Funktionen) unter.

    Prinzipiell kann man die Worksheets und Workbooks als Objekte im objektorientierten Sinn betrachten, die sich hervorragend durch Methoden und Properties erweitern lassen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --