Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.04.2024 20:05:21
28.04.2024 18:33:31
28.04.2024 18:25:12
Anzeige
Archiv - Navigation
1932to1936
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA keine Duplikate exportieren

VBA keine Duplikate exportieren
01.06.2023 16:13:58
Sabrina

Hallo an Alle,

aus meiner Quell-Datei exportiere ich ALLE Daten in die Zieldatei. Funktioniert mit dem vorhandenen Code.

Nun muss ich aber das Exportieren bzw. Einfügen einschränken. Ist in der Zieldatei die lfd. Nr. (Spalte A und eindeutig) vorhanden, dann soll nicht noch einmal aus der Quelle exportiert werden.

Würde mir jemand den Code dahingehend ändern? Würde mich natürlich freuen und bedanke mich schon jetzt für eure Unterstützung.

Quell-Datei:
https://www.herber.de/bbs/user/159412.xlsm

Ziel-Datei:
https://www.herber.de/bbs/user/159413.xlsx

VG
Sabrina

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA keine Duplikate exportieren
01.06.2023 19:11:47
ralf_b
da du immer eine ganzen Bereich kopierst. reicht doch sicher die Prüfung ob die erste lfdNr in der Quelle mit der ersten lfdNr im Ziel übereinstimmt, oder?

Sub EXPORT() 'in eine 2. Datei zum späteren IMPORT

    Dim wb As Workbook
    Dim wbQ As Workbook
    
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False 'Damit nicht die Meldung erscheint, Datei ist bereits geöffnet ...
    Application.Calculation = xlCalculationManual 'automat.Berechnung ausschalten

    On Error GoTo Abbruch
    
    Set wbQ = ThisWorkbook 'Workbooks("AM_Quelle.xlsm")
    
    If vbYes = MsgBox("Daten exportieren?", vbQuestion + vbYesNo, "A C H T U N G!!!") Then

        m = 1
        For i = 1 To l + 2  'ab Zeile 2 werden die Daten eingelesen
            m = m + 1
        Next i
        
        
        If Not IsWorkbookOpen("AM_Ziel.xlsx") Then
           Set wb = Workbooks.Open(Filename:="C:\AM_Ziel.xlsx")
        Else
           Set wb = Workbooks("AM_Ziel.xlsx")
        End If
         
        If wb.Range("A2").Value = wbQ.Range("A2").Value Then
            MsgBox "Abbruch: Daten bereits im Ziel vorhanden.", vbOKOnly + vbInformation, "Warnung"
        Else
           Application.CutCopyMode = False
           wbQ.Range("A2:D200").Copy
    
           'Windows("AM_Ziel.xlsx").Activate
           With wb
               .Range("A2").PasteSpecial Paste:=xlPasteValues, _
                                         Operation:=xlNone, _
                                         SkipBlanks:=False, _
                                         Transpose:=False
               Application.CutCopyMode = False
               wb.Save
               wb.Close
           End With
           
           wbQ.Activate  'Windows("AM_Quelle.xlsm").Activate
           Range("A2").Select
        End If
    End If

Abbruch:

    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    Application.Calculation = xlCalculationAutomatic 'automat.Berechnung einschalten

End Sub
wofür soll dies sein?
m = 1
        For i = 1 To l + 2  'ab Zeile 2 werden die Daten eingelesen
            m = m + 1
        Next i


Anzeige
AW: VBA keine Duplikate exportieren
01.06.2023 19:40:15
Sabrina
Hallo Ralf,

zuerst einmal vielen Dank für deine Lösung. Allerdings erhalte ich einen Debugger Laufzeitfehler 438 bei
If wb.Range("A2").Value = wbQ.Range("A2").Value Then

Die lfd. Nummern sind nicht sortiert.

Wofür das m = 1 ist, weiß ich nicht, habe den Code so übernommen, ich kommentiere ihn mal aus und schaue, was passiert :-)

Freue mich über einen weiteren Lösungsvorschlag. Danke Ralf.

VG
Sabrina


AW: VBA keine Duplikate exportieren
01.06.2023 19:58:15
JoWE
Hallo Ralf,
sorry fürs Einmischen.
Es wird wb und wbq als Workbook dimensioniert.
Dann aber ohne Nennung eines Worksheets/Sheets
der Inhalt eines Range-Objektes abgefragt.
Kann das denn so funktionieren?
Gruß
Jochen


Anzeige
AW: VBA keine Duplikate exportieren
01.06.2023 23:36:07
ralf_b
nein, kann es offenbar nicht, Ich war da wohl zu oberflächlich.
Ungetestet.
@Fragestellerin
versuch mal das.


Sub EXPORT() 'in eine 2. Datei zum späteren IMPORT

    Dim wb As Workbook
    Dim wbQ As Workbook
    Dim sht As Worksheet
    Dim shtQ As Worksheet
    
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False 'Damit nicht die Meldung erscheint, Datei ist bereits geöffnet ...
    Application.Calculation = xlCalculationManual 'automat.Berechnung ausschalten

    On Error GoTo Abbruch
    
    Set wbQ = ThisWorkbook 'Workbooks("AM_Quelle.xlsm")
    Set shtQ = wbQ.Worksheets("TB_Quelle")
    
    If vbYes = MsgBox("Daten exportieren?", vbQuestion + vbYesNo, "A C H T U N G!!!") Then
       
        If Not IsWorkbookOpen("AM_Ziel.xlsx") Then
           Set wb = Workbooks.Open(Filename:="C:\AM_Ziel.xlsx")
        Else
           Set wb = Workbooks("AM_Ziel.xlsx")
          
        End If
        Set sht = wb.Worksheets("TB_Ziel")
        
        If shtQ.Range("A2").Value = sht.Range("A2").Value Then
            MsgBox "Abbruch: Daten bereits im Ziel vorhanden.", vbOKOnly + vbInformation, "Warnung"
        Else
           Application.CutCopyMode = False
           shtQ.Range("A2:D200").Copy
             
               sht.Range("A2").PasteSpecial Paste:=xlPasteValues, _
                                         Operation:=xlNone, _
                                         SkipBlanks:=False, _
                                         Transpose:=False
               Application.CutCopyMode = False
              wb .Save
              wb.Close
           
           wbQ.Activate
           Application.Goto shtQ.Range("A2"), True
        End If
    End If

Abbruch:

    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    Application.Calculation = xlCalculationAutomatic 'automat.Berechnung einschalten

End Sub



Anzeige
AW: VBA keine Duplikate exportieren
01.06.2023 23:54:24
Sabrina
Hallo Jochen,
funktioniert leider nicht.

Ist die Zieldatei leer, dann wird korrekt übertragen.

Sind aber Datensätze vorhanden, kommt die Meldung: "Daten bereits im Ziel vorhanden" - sind sie aber nicht und die Zieldatei wird nicht wieder geschlossen.

Danke für deine Unterstützung
VG
Sabrina


AW: VBA keine Duplikate exportieren
02.06.2023 07:02:20
ralf_b
Ich bin zwar nicht Jochen, aber hier noch ein letzter Versuch.
Was die Vorgaben angeht, habe ich mich daran gehalten. D.h. es wird der gesamte angegebene Bereich kopiert. Daher reicht die Prüfung ob die erste lfdNr schon vorhanden ist. Falls du das anders haben möchtest, muß das auch mitgeteilt werden.
Es wäre toll wenn du Gegenfragen auch mal beantwortest.
Der Code ist diesmal getestet und bei mir funktioniert er.

Sub EXPORT() 'in eine 2. Datei zum späteren IMPORT

    Dim wb As Workbook, wbQ As Workbook
    Dim sht As Worksheet, shtQ As Worksheet
    
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False 'Damit nicht die Meldung erscheint, Datei ist bereits geöffnet ...
    Application.Calculation = xlCalculationManual 'automat.Berechnung ausschalten

    On Error GoTo Abbruch
    
    Set wbQ = ThisWorkbook 'Workbooks("AM_Quelle.xlsm")
    Set shtQ = wbQ.Worksheets("TB_Quelle")
    
    If vbYes = MsgBox("Daten exportieren?", vbQuestion + vbYesNo, "A C H T U N G!!!") Then
       
        If Not IsWorkbookOpen("AM_Ziel.xlsx") Then
           Set wb = Workbooks.Open(Filename:="C:\AM_Ziel.xlsx")
        Else
           Set wb = Workbooks("AM_Ziel.xlsx")
        End If
        Set sht = wb.Worksheets("TB_Ziel")
        
        If shtQ.Range("A2").Value = sht.Range("A2").Value Then
            MsgBox "Abbruch: Daten bereits im Ziel vorhanden.", vbOKOnly + vbInformation, "Warnung"
            wb.Close False
        Else
           Application.CutCopyMode = False
           shtQ.Range("A2:D200").Copy
             
           sht.Range("A2").PasteSpecial Paste:=xlPasteValues, _
                                         Operation:=xlNone, _
                                         SkipBlanks:=False, _
                                         Transpose:=False
           Application.CutCopyMode = False
           wb.Save
           wb.Close
           wbQ.Activate
           Application.Goto shtQ.Range("A1"), True
           MsgBox "Daten wurden exportiert"
        End If
    End If

Abbruch:

    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    Application.Calculation = xlCalculationAutomatic 'automat.Berechnung einschalten
    If Err Then MsgBox "Fehler: " & Err.Number & " ist aufgetreten."
End Sub


Anzeige
AW: VBA keine Duplikate exportieren
02.06.2023 10:43:21
Sabrina
Guten Morgen Ralf, sorry für den falsche Ansprechnamen,
mir ist nicht bewusst, dass ich keine Fragen beantworte. Die lfd. Nummern sind zwar nicht sortiert, aber für deinen Code habe ich diese sortiért.
Aber leider funktioniert er noch immer nicht. Es erscheint die Meldung: "Daten bereits vorhanden" und danach "Fehlercode 9". Da wir beide mit den gleichen Dateien arbeiten,verstehe ich es nicht. Danke dir für deine Mühe.

Guten Morgen Ulf,
dein Code funktioniert soweit gut, wenn bereits 2 Datensätze in der Ziel-Tabelle vorhanden sind.
Ist die Ziel-Tabelle leer, erscheint die Meldung: "Es wurden keine Zeilen exportiert"
Befindet sich nur 1 Datensatz in der Zieltabelle, wird dieser noch einmal aus der Quelle eingefügt (doppelt)
Erst wenn sich 2 Datensätze im Ziel befinden, wird korrekt eingefügt.
Würdest du bitte noch einmal drüber schauen bitte? Dankeschön.

VG
Sabrina


Anzeige
AW: VBA keine Duplikate exportieren
02.06.2023 02:38:52
Ulf

Option Explicit

Const conZielDatei  As String = "AM_Ziel.xlsx"

Function IsWorkbookOpen(strWB As String) As Boolean
   On Error Resume Next
   IsWorkbookOpen = Not Workbooks(strWB) Is Nothing
End Function

Public Sub EXPORT()
    On Local Error GoTo Abbruch
    'Workbooks
    Dim wbZiel As Workbook
    Dim wbQuelle As Workbook
    'Worksheets
    Dim wksQuelle As Worksheet
    Dim wksZiel As Worksheet
    'Quell-und/oder Zielpfad
    Dim strPfad As String
    'Die Kollektion unserer neuen Daten, nimmt Ranges auf
    'Array ginge auch
    Dim col As New Collection
    'Zeilen in Quelle und Ziel
    Dim lngAnzahlQuelle As Long
    Dim lngAnzahlZiel As Long
    'Zählerschleife
    Dim lngZählerQuelle As Long
    Dim lngZählerZiel As Long
    'Quell-und Zielbereich
    Dim rgQuelle As Range
    Dim rgZiel As Range
    Dim mbrWeiter As VBA.VbMsgBoxResult
    'True bei Fund sonst false
    Dim bGefunden As Boolean
    'Die Anzahl der zu Übertragenden
    Dim lngÜbertragen As Long
    'Index aus Spalte 1
    Dim lngNr As Long
    'Bereich in den übernommen wird
    Dim rgNeu As Range
    'Schleifenzähler der zu übernehmenden Daten
    Dim lngZähler As Long
    'Spalte aus Kollektion
    Dim lngSpalte As Long
    'Anzahl der Spalten
    Dim lngSpalten As Long
    Set wbQuelle = ThisWorkbook
    'Hier im Original, bei mir im gleichen Ordner wie Quelle
    'strPfad = "C:\"
    'Auskommentieren vor Start und ggf obige Zeile aktivieren !
    strPfad = wbQuelle.Path & "\"
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Application.Calculation = xlCalculationManual
    mbrWeiter = MsgBox("Daten exportieren?", vbQuestion + vbOKCancel, "A C H T U N G!!!")
    If mbrWeiter > vbOK Then
        Exit Sub
    End If
    If Not IsWorkbookOpen(conZielDatei) Then
        Set wbZiel = Workbooks.Open(Filename:=strPfad & conZielDatei)
    Else
        Set wbZiel = Workbooks(conZielDatei)
    End If
    Set wksQuelle = wbQuelle.Worksheets("TB_Quelle")
    lngAnzahlQuelle = wksQuelle.UsedRange.Rows.Count - 1
    Set rgQuelle = wksQuelle.Range("A2:D" & CStr(lngAnzahlQuelle))
    Set wksZiel = wbZiel.Worksheets(1)
    lngAnzahlZiel = wksZiel.UsedRange.Rows.Count - 1
    Set rgZiel = wksZiel.Range("A2:D" & CStr(lngAnzahlZiel))
    For lngZählerQuelle = 1 To lngAnzahlQuelle
        bGefunden = False
        lngNr = rgQuelle.Cells(lngZählerQuelle, 1).Value
        For lngZählerZiel = 1 To lngAnzahlZiel
            If rgZiel.Cells(lngZählerZiel, 1).Value = lngNr Then
                bGefunden = True
                Exit For
            End If
        Next lngZählerZiel
        If Not bGefunden Then
            Dim rgBereich As Range
            Set rgBereich = rgQuelle.Range("A" & CStr(lngZählerQuelle) & ":D" & CStr(lngZählerQuelle))
            col.Add rgBereich
            Set rgBereich = Nothing
            lngÜbertragen = lngÜbertragen + 1
        End If
    Next lngZählerQuelle
    For lngZähler = 1 To lngÜbertragen
        Set rgNeu = wksZiel.Range("A" & CStr(lngAnzahlZiel + 1 + lngZähler) & ":D" & CStr(lngAnzahlZiel + 1 + lngZähler))
        For lngSpalten = 1 To rgNeu.Columns.Count
            rgNeu.Cells(1, lngSpalten).Value = col.Item(lngZähler).Cells(1, lngSpalten).Value
        Next
    Next lngZähler
Beenden:
    Set rgNeu = Nothing
    Set col = Nothing
    Set rgQuelle = Nothing
    Set rgZiel = Nothing
    Set wksQuelle = Nothing
    Set wksZiel = Nothing
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    Application.Calculation = xlCalculationAutomatic 'automat.Berechnung einschalten
    If lngÜbertragen = 0 Then
        MsgBox "Es wurden keine Zeilen exportiert", vbInformation + vbOKOnly, "Export"
    Else
        MsgBox "Es wurden " & CStr(lngÜbertragen) & " Zeilen exportiert", vbInformation + vbOKOnly, "Export"
    End If
    Exit Sub
Abbruch:
    Resume Beenden
End Sub


Anzeige
an Ulf
02.06.2023 10:47:20
Sabrina
Hallo Ulf,
sorry, habe die Antwort zu deinem Code unter den Beitrag von Ralf_b geschrieben.

VG
Sabrina


AW: an Ulf
02.06.2023 11:47:26
Ulf

Option Explicit

Const conZielDatei  As String = "AM_Ziel.xlsx"

Function IsWorkbookOpen(strWB As String) As Boolean
   On Error Resume Next
   IsWorkbookOpen = Not Workbooks(strWB) Is Nothing
End Function

Public Sub EXPORT()
    On Local Error GoTo Abbruch
    'Workbooks
    Dim wbZiel As Workbook
    Dim wbQuelle As Workbook
    'Worksheets
    Dim wksQuelle As Worksheet
    Dim wksZiel As Worksheet
    'Quell-und/oder Zielpfad
    Dim strPfad As String
    'Die Kollektion unserer neuen Daten, nimmt Ranges auf
    'Array ginge auch
    Dim col As New Collection
    'Zeilen in Quelle und Ziel
    Dim lngAnzahlQuelle As Long
    Dim lngAnzahlZiel As Long
    'Zählerschleife
    Dim lngZählerQuelle As Long
    Dim lngZählerZiel As Long
    'Quell-und Zielbereich
    Dim rgQuelle As Range
    Dim rgZiel As Range
    Dim mbrWeiter As VBA.VbMsgBoxResult
    'True bei Fund sonst false
    Dim bGefunden As Boolean
    'Die Anzahl der zu Übertragenden
    Dim lngÜbertragen As Long
    'Index aus Spalte 1
    Dim lngNr As Long
    'Bereich in den übernommen wird
    Dim rgNeu As Range
    'Schleifenzähler der zu übernehmenden Daten
    Dim lngZähler As Long
    'Spalte aus Kollektion
    Dim lngSpalte As Long
    'Anzahl der Spalten
    Dim lngSpalten As Long
    Set wbQuelle = ThisWorkbook
    'Hier im Original, bei mir im gleichen Ordner wie Quelle
    'strPfad = "C:\"
    'Auskommentieren vor Start und ggf obige Zeile aktivieren !
    strPfad = wbQuelle.Path & "\"
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Application.Calculation = xlCalculationManual
    mbrWeiter = MsgBox("Daten exportieren?", vbQuestion + vbOKCancel, "A C H T U N G!!!")
    If mbrWeiter > vbOK Then
        Exit Sub
    End If
    If Not IsWorkbookOpen(conZielDatei) Then
        Set wbZiel = Workbooks.Open(Filename:=strPfad & conZielDatei)
    Else
        Set wbZiel = Workbooks(conZielDatei)
    End If
    Set wksQuelle = wbQuelle.Worksheets("TB_Quelle")
    lngAnzahlQuelle = wksQuelle.UsedRange.Rows.Count - 1
    Set rgQuelle = wksQuelle.Range("A2:D" & CStr(lngAnzahlQuelle))
    Set wksZiel = wbZiel.Worksheets(1)
    lngAnzahlZiel = wksZiel.UsedRange.Rows.Count - 1
    If lngAnzahlZiel = 0 Then
        Set rgZiel = wksZiel.Range("A2:D2")
    Else
        Set rgZiel = wksZiel.Range("A2:D" & CStr(lngAnzahlZiel + 1))
    End If
    For lngZählerQuelle = 1 To lngAnzahlQuelle
        bGefunden = False
        lngNr = rgQuelle.Cells(lngZählerQuelle, 1).Value
        For lngZählerZiel = 1 To lngAnzahlZiel
            If rgZiel.Cells(lngZählerZiel, 1).Value = lngNr Then
                bGefunden = True
                Exit For
            End If
        Next lngZählerZiel
        If Not bGefunden Then
            Dim rgBereich As Range
            Set rgBereich = rgQuelle.Range("A" & CStr(lngZählerQuelle) & ":D" & CStr(lngZählerQuelle))
            col.Add rgBereich
            Set rgBereich = Nothing
            lngÜbertragen = lngÜbertragen + 1
        End If
    Next lngZählerQuelle
    For lngZähler = 1 To lngÜbertragen
        Set rgNeu = wksZiel.Range("A" & CStr(lngAnzahlZiel + 1 + lngZähler) & ":D" & CStr(lngAnzahlZiel + 1 + lngZähler))
        For lngSpalten = 1 To rgNeu.Columns.Count
            rgNeu.Cells(1, lngSpalten).Value = col.Item(lngZähler).Cells(1, lngSpalten).Value
        Next
    Next lngZähler
Beenden:
    Set rgNeu = Nothing
    Set col = Nothing
    Set rgQuelle = Nothing
    Set rgZiel = Nothing
    Set wksQuelle = Nothing
    Set wksZiel = Nothing
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    Application.Calculation = xlCalculationAutomatic 'automat.Berechnung einschalten
    If lngÜbertragen = 0 Then
        MsgBox "Es wurden keine Zeilen exportiert", vbInformation + vbOKOnly, "Export"
    Else
        MsgBox "Es wurden " & CStr(lngÜbertragen) & " Zeilen exportiert", vbInformation + vbOKOnly, "Export"
    End If
    Exit Sub
Abbruch:
    Resume Next
End Sub
So nochmal in schön, gutes Beta-Testing:-)
Gruß Ulf


Anzeige
AW: an Ulf
02.06.2023 12:41:01
Sabrina
Hallo Ulf,
noch mal in schön ... passt super. Vielen herzlichen Dank.
Später werde ich es für die "Echt-Datei" mal umsetzen, denke aber, das kriege ich hin.

Danke euch und habt ein schönes Wochenende.
VG
Sabrina


AW: an Ulf
02.06.2023 13:10:55
Ulf
Hallo Sabrina
den Fehlerteil, d.h.

Abbruch:
    Resume Next
sollte man etwas ändern ggf.

Abbruch:
    'bspw
    'Msgbox "FehlerNr: " &  err.number & vbcrlf & err.Description, vbCritical+vbOKOnly,"Fehler"
    Resume Beenden
Ansonsten gl + dito
Grüße Ulf


Anzeige
AW: an Ulf
02.06.2023 16:13:10
Sabrina
Hallo Ulf,
dein Änderungsvorschlag ergibt: "Nix nadda niente" :-) Dein Code funktioniert dann wohl einwandfrei. Perfekt.

Am Wochenende setze ich das auf die Original-Datei um, sollte ich auf ein Problem stoßen, kann ich dich noch einmal anschreiben?

Vielen Dank.
VG
Sabrina

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige