none
Duplikate finden und löschen RRS feed

  • Frage

  • Hallo Freunde der VBA Wahrheiten. Also bin hier ja nur Autodidakt mit Vorkenntnissen, aber ich finde VBA ist wirklich zum abgewöhnen. Dennoch, bin ja über die Jahre weitergekommen, meine Lern DB funktioniert ja. Don Karl und andere hatten mir ja weitergeholfen. Meine letzte "Verbesserung"  soll nun doppelte Einträge überprüfen

    Der Code läuft ja und findet auch doppelte Einträge die ich dann löschen kann. Allerdings stimmt der letzte Datensatz nicht. Zeigt immer die vorletzte DS Nummer an. Was mich stört ist zum Testen auf eine  Zeile goto Record bekomme ich einen Laufzeit Fehler,2499  wenn ich in der Zeile einen halt gesetzt habe. Also richtig Testen kann man so nicht. Wenn mir ein freundlicher Mensch,  zu dem Code einen guten Tipp geben möchte, Verbesserungen und Ratschlägewerden werden gerne angenomen. Hier dann der Code..

    Fername "Satz" ist der Record

    "Finnisch" der Name des Feldes den ich überprüfen möchte

    Private Sub Finnisch_DblClick(Cancel As Integer)

    'Suchen nach dopelter Eingabe

    Dim V1 As String        'Suchargument Nach Duplikat
    Dim S As Integer        'Satz Nummer
    Dim V2 As String        'Neuer Vergleich
        Dim db As Database   ' Codierung für den Loop Current DB
        Dim rs As Recordset  ' Codierung für den  Loop  TB1
        Dim f As Field       ' Feldname
        
        Set db = CurrentDb                  ' oder DatenPfad der DB
        Set rs = db.OpenRecordset("TB1")    ' F1 ist Name der Tabelle

    V1 = Finnisch           'Suchargument im Feld
     
       Do While rs.EOF = False             'loop bis EOF
       Set f = rs![Satz]                   ' Satz Nummer
     
    Schleife:
             S = Satz               'current Zeilen Nummer
      

      DoCmd.GoToRecord , , acNext     'nächste Zeile
       
       'MsgBox Zeile & f & "Satz Nummer"
           
           V2 = Finnisch           'V2 neuer Vergleich
     
         If V1 = V2 Then GoTo Ende        ' wenn gleich dann goto Ende
        If V1 <> V2 Then GoTo Schleife        ' wenn ungleich dann Schleife
     
      GoTo Schleife                                       ' Schleife bis gefunden
     
                 rs.MoveNext
         Loop                    ' do while EOF
                rs.Close
            
    Ende:  DoCmd.GoToRecord , , acNext     'nächste Zeile
     
    MsgBox ("Vergleich") & V1 & " und " & V2 & " DSatz " & S & " und " & " DSatz " & f
    End Sub

    Sonntag, 20. März 2022 11:00

Antworten

  • Hallo,

    Was ist der Grund für dein Vorgehen mit GoToRecord? Möchtest du genau den Ansatz lernen, oder ist es dir egal, Hauptsache die Doppelten werden gelöscht?

    Falls letzteres empfehle ich SQL. Voraussetzung ist, dass über alle Datensätze ein eindeutiger Schlüssel, z.B. ID (Autowert) existiert. Ich unterstelle nach deiner Beschreibung, dass [Satz] dieses Feld ist. Dann würde folgendes funktionieren:

    CurrentDb.Execute "DELETE FROM TB1 WHERE Finnisch IN "& _
      " ( SELECT TB1.[Finnisch] FROM TB1 "& _
      " WHERE TB1.[Finnisch] In "& _
      "   (SELECT [Finnisch] FROM [TB1] As Tmp "& _
      "    GROUP BY [Finnisch] HAVING Count(*)>1 )"& _
      "    ORDER BY TB1.[Finnisch]) "& _
      " AND Satz NOT IN "& _
      "   (SELECT MIN(Satz) FROM TB1 AS Tmp2 "& _
      "    WHERE Tmp2.Finnisch=TB1.Finnisch);", _
      dbFailOnError
    Gruss - Peter


    Mitglied im www.dbdev.org
    Access-FAQ: www.donkarl.com


    Montag, 21. März 2022 14:21
    Moderator

Alle Antworten

  • Hallo Juhoff99,

    Ich habe leider keine große Erfahrung mit Access VBA, aber vielleicht kann Dir diese Anleitung, die mithilfe eines Abfrageentwurfs die doppelten Datensätze im zu durchsuchenden Feld löscht, weiterhelfen:
    Delete duplicate records with a query

    Wenn Du dies jedoch mit VBA bewerkstelligen möchtest, hoffe ich, dass jemand, der sich mit Access VBA auskennt, sich in die Diskussion einschaltet.

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Montag, 21. März 2022 11:22
    Moderator
  • Hallo,

    Was ist der Grund für dein Vorgehen mit GoToRecord? Möchtest du genau den Ansatz lernen, oder ist es dir egal, Hauptsache die Doppelten werden gelöscht?

    Falls letzteres empfehle ich SQL. Voraussetzung ist, dass über alle Datensätze ein eindeutiger Schlüssel, z.B. ID (Autowert) existiert. Ich unterstelle nach deiner Beschreibung, dass [Satz] dieses Feld ist. Dann würde folgendes funktionieren:

    CurrentDb.Execute "DELETE FROM TB1 WHERE Finnisch IN "& _
      " ( SELECT TB1.[Finnisch] FROM TB1 "& _
      " WHERE TB1.[Finnisch] In "& _
      "   (SELECT [Finnisch] FROM [TB1] As Tmp "& _
      "    GROUP BY [Finnisch] HAVING Count(*)>1 )"& _
      "    ORDER BY TB1.[Finnisch]) "& _
      " AND Satz NOT IN "& _
      "   (SELECT MIN(Satz) FROM TB1 AS Tmp2 "& _
      "    WHERE Tmp2.Finnisch=TB1.Finnisch);", _
      dbFailOnError
    Gruss - Peter


    Mitglied im www.dbdev.org
    Access-FAQ: www.donkarl.com


    Montag, 21. März 2022 14:21
    Moderator
  • Zunächt möchte ich mich bei Peter Doeringer für seine Mühe bedanken, Das Problem habe ich nämlich aus dem Auge verloren. Ich kopiere mir den Lösungsvorschlag in meine VBA Muster Datei und testet es dann. Mein Problem ist dieser dumme VBA Editor, die einfachsten Dinge werden da zum Problem.. aktuell scheiter ich an einen simplen Shell Aufruf. Ich habe dazu einen neuen Thread eröffnet, vieleich schaust Du dort mal rein?

    MFG. J. H. (Wasser99)

    Sonntag, 29. Mai 2022 15:41