Excel VBA - Daten aus externer Datei mit aktiver Datei vergleichen

jerry0110

Erfahrenes Mitglied
Hallo zusammen,

ich habe eine Datei wo Daten drin stehen. Diese soll mit einer externen Datei abgeglichen werden. Normal sind beide Datei gleich. Wenn aber in der externen Datei ein Wert zugekommen ist, dann soll er diese Wert in die aktuelle Datei übertragen werden. Wenn alles gleich ist, dann soll er nichts machen.

Habe hier gerade einen Blackout, wie ich das anstellen soll. Könnt mir jemand einen Ansatz geben?
 

Zvoni

Erfahrenes Mitglied
In Datenbank-Sprache wäre das ein Left Join mit der externen Datei als Master und der "internen" als Detail-Tabelle. Die Sätze, die du suchst wären die mit NULL in den Detail-Spalten

Mehrere Ansätze:
1) In-Memory-Recordset welches dann die Find-Methode verwendet Find-Methode (ADO) - SQL Server
2) 2 Arrays, welche du gegeneinander laufen lässt (klassischer Ansatz)

In beiden Fällen würde ich die externen Daten als Master nehmen, und die interne als Daten, nach welchen du suchst

a) Lade interne Datei in das 1) In-Memory-Recordset oder 2) ein Array
b) Lade externe Datei in ein Array (oder auch ein In-Memory-RS).
c) Laufe durch das externe Array, und nimm dein Vergleichskriterium als Kriterium für die Find-Methode des internen IMRS.
d) Falls er nichts findet --> Bingo, mach damit was du willst, falls er was findet, auch gut (nur dann auf jeden Fall wieder IMRS.MoveFirst nicht vergessen)
 

jerry0110

Erfahrenes Mitglied
In Datenbank-Sprache wäre das ein Left Join mit der externen Datei als Master und der "internen" als Detail-Tabelle. Die Sätze, die du suchst wären die mit NULL in den Detail-Spalten

Mehrere Ansätze:
1) In-Memory-Recordset welches dann die Find-Methode verwendet Find-Methode (ADO) - SQL Server
2) 2 Arrays, welche du gegeneinander laufen lässt (klassischer Ansatz)

In beiden Fällen würde ich die externen Daten als Master nehmen, und die interne als Daten, nach welchen du suchst

a) Lade interne Datei in das 1) In-Memory-Recordset oder 2) ein Array
b) Lade externe Datei in ein Array (oder auch ein In-Memory-RS).
c) Laufe durch das externe Array, und nimm dein Vergleichskriterium als Kriterium für die Find-Methode des internen IMRS.
d) Falls er nichts findet --> Bingo, mach damit was du willst, falls er was findet, auch gut (nur dann auf jeden Fall wieder IMRS.MoveFirst nicht vergessen)


Das bezieht sich aber auf SQL oder? Oder ist das zu Excel gleichbedeutend?

Also mein Ansatz ist ja, das ich einfach mit einer for-Schleife erstmal in der vorhandenen Datei die Spalte durchgehe. Dann möchte ich in der for-Schleife noch eine for-Schleife machen, die in der externe Datei in der Spalte nachguckt. Dann wenn sich beide Sachen matchen, dann nix ansonsten kopieren. Oder ist die Idee falsch?
 

Zvoni

Erfahrenes Mitglied
Nein, die Idee ist nicht falsch. Die Idee entspricht meinem Ansatz 2.
Mit Ansatz 1 wollt ich nur ein bischen angeben.... :p:p:p
Wobei dran denken: Umdrehen das ganze: Nimm deine externen Daten als Master, und such mit diesen Daten in deiner internen Datei. Nur dann kannst du Daten finden, welche in deiner internen Datei NICHT existieren.
(Interne Datei hat 100 Sätze, externe Datei hat 105 Sätze. Wenn du deine interne Datei nimmst und damit in der externen suchst, wirst du für alle 100 Sätze der internen Datei einen match in der externen finden, und die 5 überzähligen Sätze in der externen werden gar nicht identifiziert)
 

jerry0110

Erfahrenes Mitglied
Nein, die Idee ist nicht falsch. Die Idee entspricht meinem Ansatz 2.
Mit Ansatz 1 wollt ich nur ein bischen angeben.... :p:p:p
Wobei dran denken: Umdrehen das ganze: Nimm deine externen Daten als Master, und such mit diesen Daten in deiner internen Datei. Nur dann kannst du Daten finden, welche in deiner internen Datei NICHT existieren.
(Interne Datei hat 100 Sätze, externe Datei hat 105 Sätze. Wenn du deine interne Datei nimmst und damit in der externen suchst, wirst du für alle 100 Sätze der internen Datei einen match in der externen finden, und die 5 überzähligen Sätze in der externen werden gar nicht identifiziert)


Ok verstanden.

Wie greife ich auf die externe Datei zu :unsure:
Intern ist immer klein Problem. Wenn ich bei der externen Datei z. b. sage:

Visual Basic:
Dim source As Workbooks

Set source =  "C:\externeDatei\externeDatei.xlsx"

Dann muss ich ja korrekt ansetzten. Ich sag ja. BLACKOUT!! :(
 

Zvoni

Erfahrenes Mitglied
Errrr????
Visual Basic:
Dim Source As Workbook

Set Source=Workbooks.Open("C:\externeDatei\externeDatei.xlsx")
 

jerry0110

Erfahrenes Mitglied
Ich hab jetzt mal angefangen.
So wie es es verstanden habe, öffne ich die Externe Datei.
Dann frag ich ab, was die letzte Zeile der jeweiligen Dateien ist.
Und zur Prüfung msgbox'en.

Bekomme aber immer Typ Unverträglichkeit.

Visual Basic:
Sub test()

Dim last As Long, last2 As Long
Dim quelle As Worksheet
Dim ziel As Worksheet


Set quelle = Workbooks.Open("C:\Users\xxx\Desktop\Test2.xlsm")
Set ziel = ThisWorkbook.Worksheets("Tabelle1")


last = ziel.Cells(Rows.Count, 1).End(xlUp).Row + 1
last2 = quelle("Tabelle1").Cells(Rows.Count, 1).End(xlUp).Row + 1


For i = 1 To last
    For f = 1 To last2
        MsgBox quelle.Cells(i, 1)
        MsgBox ziel.Cells(f, 1)
    Next
Next

End Sub
 

jerry0110

Erfahrenes Mitglied
So im Grunde ist jetzt alles über den Haufen geworfen worden.
Ich kann jetzt eine Datei erstellen, wo ich alle Externen Daten in eine Excel Datei kopiere.
Wurde mir gerade mitgeteilt, dass alle Daten in eine Excel sein sollen.

Um so leichter :)
 

jerry0110

Erfahrenes Mitglied
Aber ich hab doch noch eine Frage:

Visual Basic:
Application.ScreenUpdating = False
Application.EnableEvents = False
Dim QWS As Worksheet, ZWS As Worksheet
Dim QWB As Workbook, ZWB As Workbook


Workbooks.Open "L:\Global\Übergabe Projekte\Quelle.xlsm""       ' Quelle, aus der die Tabelle41 kopiert werden soll"

Set QWB = Workbooks("Quelle.xlsm")
Set ZWB = ThisWorkbook                                                              ' Ziel, Workbook mit diesem Makro
Set QWS = QWB.Worksheets("Projekt-Übersicht")                                       ' Quelle
Set ZWS = ZWB.Worksheets("Projekt-Übersicht")                                       ' Ziel

    QWS.Cells.Copy ZWS.Cells(1, 1)                                                  ' Inhalt in Ziel-Tabelle einfügen
    Workbooks("Quelle.xlsm").Close

Application.EnableEvents = True

Wenn ich jetzt nur die Werte "Value" haben will, wo muss das Value hin?
Mein Ansatz war das ich nach ZWS.Cells(1, 1) ein Value stehen muss, damit nur das Value übertragen wird.
Dann kommt aber immer ein Fehler. Auch mit PasteSpecial aber auch das passt nirgends rein.
 

jerry0110

Erfahrenes Mitglied
Gelöst:
Habe ein With genommen

Visual Basic:
    With ZWS
        .Cells.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone
    End With