mark47
Goto Top

Kopieren mit 2 Dateien aktivieren

Hallo, komme mal wieder mit einer Frage. Ich möchte Werte aus einer Datei/Tabelle in eine neue Tabelle kopieren. Ich wähle in den Spalte C und D die zugehörigkeiten zu den einzelnen Datensätzen in der neuen Datei aus. Mein Problem ist dabei, das der Inhalt erfasst, aber nicht in die neue Datei kopiert wird sonder in der Quelldatei im Anschluss an bereits bestehende Werte angefügt wird. Meine Vermutung ist, dass der Fehler im folgenden Codeabschnitt ist.
        ' Wenn eine Übereinstimmung gefunden wurde, kopiere die Daten aus Spalte A  
        If matchFound Then
            wsTarget.Cells(lastRowTarget, 1).Value = wsSource.Cells(i, 1).Value
            Debug.Print "Kopiert Wert: " & wsSource.Cells(i, 1).Value & " nach Zeile: " & lastRowTarget & " in Zieldatei"  
            lastRowTarget = lastRowTarget + 1
        End If

Und hier mein zusammengetragener Code. (Wahrscheinlich laienhaft aufgebaut). Kann mir trotz allem jemand hier weiter helfen?
Sub CopyDataWithCondition2()
    Dim wbSource As Workbook
    Dim wbTarget As Workbook
    Dim wsSource As Worksheet
    Dim wsTarget As Worksheet
    Dim lastRowSource As Long
    Dim lastRowTarget As Long
    Dim i As Long
    Dim j As Long
    Dim matchFound As Boolean

    ' Pfade zu den Dateien (Anpassen der Pfade notwendig)  
    Dim sourceFilePath As String
    Dim targetFilePath As String
    sourceFilePath = "C:\Users\Besitzer\Desktop\Vergleich1.xlsm"  
    targetFilePath = "C:\Users\Besitzer\Desktop\Vergleich2.xlsx"  

    On Error GoTo ErrHandler

    ' Öffne die Quelldatei  
    Set wbSource = Workbooks.Open(sourceFilePath)
    If wbSource Is Nothing Then
        MsgBox "Fehler beim Öffnen der Quelldatei.", vbCritical  
        Exit Sub
    End If
    Set wsSource = wbSource.Sheets("Tabelle1") ' Anpassen des Blattnamens falls notwendig  
    If wsSource Is Nothing Then
        MsgBox "Fehler beim Öffnen des Arbeitsblatts in der Quelldatei.", vbCritical  
        Exit Sub
    End If

    ' Öffne die Zieldatei  
    Set wbTarget = Workbooks.Open(targetFilePath)
    If wbTarget Is Nothing Then
        MsgBox "Fehler beim Öffnen der Zieldatei.", vbCritical  
        Exit Sub
    End If
    Set wsTarget = wbTarget.Sheets("Tabelle1") ' Anpassen des Blattnamens falls notwendig  
    If wsTarget Is Nothing Then
        MsgBox "Fehler beim Öffnen des Arbeitsblatts in der Zieldatei.", vbCritical  
        Exit Sub
    End If

    ' Letzte belegte Zeile in der Quelldatei in Spalte A  
    lastRowSource = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row  
    Debug.Print "Letzte Zeile in der Quelldatei: " & lastRowSource  

    ' Letzte belegte Zeile in der Zieldatei in Spalte A  
    lastRowTarget = wsTarget.Cells(wsTarget.Rows.Count, "A").End(xlUp).Row + 1  
    Debug.Print "Nächste freie Zeile in der Zieldatei: " & lastRowTarget  

    ' Durchlaufen der Zeilen in der Quelldatei  
    For i = 2 To lastRowSource ' Starten bei Zeile 2, falls Zeile 1 Überschriften enthält  
        matchFound = False
        ' Durchlaufen der Zeilen in der Zieldatei, um Übereinstimmung in Spalte C und D zu finden  
        For j = 2 To wsTarget.Cells(wsTarget.Rows.Count, "A").End(xlUp).Row ' Starten bei Zeile 2, falls Zeile 1 Überschriften enthält  
            If wsSource.Cells(i, 3).Value = wsTarget.Cells(j, 3).Value And wsSource.Cells(i, 4).Value = wsTarget.Cells(j, 4).Value Then
                matchFound = True
                Exit For
            End If
        Next j

        ' Wenn eine Übereinstimmung gefunden wurde, kopiere die Daten aus Spalte A  
        If matchFound Then
            wsTarget.Cells(lastRowTarget, 1).Value = wsSource.Cells(i, 1).Value
            Debug.Print "Kopiert Wert: " & wsSource.Cells(i, 1).Value & " nach Zeile: " & lastRowTarget & " in Zieldatei"  
            lastRowTarget = lastRowTarget + 1
        End If
    Next i

    ' Bestätigungsmeldung anzeigen  
    MsgBox "Daten erfolgreich kopiert.", vbInformation  

    ' Schließen der Arbeitsmappen  
'    wbSource.Close SaveChanges:=False  
'    wbTarget.Close SaveChanges:=True  

    Exit Sub

ErrHandler:
    MsgBox "Fehler: " & Err.Description, vbCritical  
    On Error Resume Next
    If Not wbSource Is Nothing Then wbSource.Close SaveChanges:=False
    If Not wbTarget Is Nothing Then wbTarget.Close SaveChanges:=False
End Sub

Content-ID: 3257924701

Url: https://administrator.de/contentid/3257924701

Ausgedruckt am: 22.11.2024 um 09:11 Uhr

DivideByZero
DivideByZero 01.08.2024 um 20:29:14 Uhr
Goto Top
Moin,

das klingt unlogisch, und nach dem obigen Code sollte das, auf den ersten Blick, auch nicht passieren. Aber wahrscheinlich werden da die Quell- und Zielobjekt nicht, wie beabsichtigt, belegt. Was sagt denn Dein Debug.print?

Und versuche doch einfach mal, ohne irgendwelche Vergleiche, in der Schleife an der passenden Stelle einfach einen festen Wert in die Zieltabelle zu schreiben, variablenunabhängig, damit Du siehst, ob das in Deiner Umgebung funktioniert.

Gruß

DivideByZero
mark47
mark47 02.08.2024 um 19:56:13 Uhr
Goto Top
Das ist das Ergebnis aus der Direktübersicht. Es geschieht aber nicht. Es wird in die Quelldatei geschrieben.

Letzte Zeile in der Quelldatei: 11
Nächste freie Zeile in der Zieldatei: 12
Kopiert Wert: 44444 nach Zeile: 12 in Zieldatei
Kopiert Wert: 44444 nach Zeile: 13 in Zieldatei
Kopiert Wert: 44556 nach Zeile: 14 in Zieldatei
Kopiert Wert: 8892 nach Zeile: 15 in Zieldatei
Kopiert Wert: 21435 nach Zeile: 16 in Zieldatei
Kopiert Wert: 21435 nach Zeile: 17 in Zieldatei
Kopiert Wert: 11890 nach Zeile: 18 in Zieldatei
Kopiert Wert: 22334 nach Zeile: 19 in Zieldatei
Kopiert Wert: 69699 nach Zeile: 20 in Zieldatei
Kopiert Wert: 99022 nach Zeile: 21 in Zieldatei
DivideByZero
DivideByZero 04.08.2024 um 17:26:54 Uhr
Goto Top
Moin,

versuche mal:

Und versuche doch einfach mal, ohne irgendwelche Vergleiche, in der Schleife an der passenden Stelle einfach einen festen Wert in die Zieltabelle zu schreiben, variablenunabhängig, damit Du siehst, ob das in Deiner Umgebung funktioniert.

Alternativ:

in Zeile 64 die Abfrage umkehren:

 If matchFound = False Then

Dann kopiert er ja in jedem Fall.

Bei einem Test hier mit Beispieldaten alles kein Problem, es wird in die Zieltabelle kopiert. Möglicherweise hast Du da schreibgeschützte Dateien geöffnet, oder solche, die gerade im Zugriff sind, oder wa sauch immer.

Gruß

DivideByZero

P.S.: Bei der Art, wie Du das aufgebaut hast, sollte das Makro in einer 3. Datei sein (z.B. makro.xlsm), aus der heraus die beiden anderen geöffnet werden.
mark47
mark47 04.08.2024 um 19:23:09 Uhr
Goto Top
Danke, habe deinen Rat befolgt und aus einer 3ten Datei (.xlsm) den Kopiervorgang gestartet, das hat hingehauen. Der Code beginnt allerdings mit der Zeile 3 seinen Kopiervorgang, und ignoriert die Zeile 2, Zeile 1 sind die Überschriften.
DivideByZero
DivideByZero 04.08.2024 um 20:12:19 Uhr
Goto Top
Habe den Test schon wieder gelöscht, kann daher nicht nachschauen.
Teste einfach mal mit wenig, nicht immer mit viel.
Also in beiden Tabellen nur 2 Einträge, Zeile1=Überschrift, Zeile2=Daten
mark47
mark47 05.08.2024 um 10:43:49 Uhr
Goto Top
Vielen vielen Dank, habe die Lösung beim genauen Hinsehen entdeckt. Gruß Mark

        ' Durchlaufen der Zeilen in der Zieldatei, um Übereinstimmung in Spalte C und F zu finden.  
        ' Spalten müssen eindeutige Unterscheidungsmerkmale haben, doppelte Werte werden ansonsten als ein Wert erkannt.  
        For j = 2 To lastRowTarget - 1 ' Starten bei Zeile 2, falls Zeile 1 Überschriften enthält  
            If wsSource.Cells(i, 3).Value = wsTarget.Cells(j, 3).Value And wsSource.Cells(i, 6).Value = wsTarget.Cells(j, 6).Value Then
                matchFound = True
                Exit For
            End If
        Next j