Excel VBA - Daten aus externer Datei mit aktiver Datei vergleichen


jerry0110

Erfahrenes Mitglied
#1
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
#2
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
#3
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
#4
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
#5
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!! :(
 

jerry0110

Erfahrenes Mitglied
#7
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
#8
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
#9
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.
 
#11
Der With ist nicht notwendig.
Der Unterschied ist .Cells(1,1) und jetzt der .Cells.PasteSpecial
Visual Basic:
ZWS.Cells.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone
 

jerry0110

Erfahrenes Mitglied
#12
Jetzt sehe ich auch was ich falsch gemacht habe.
Ich hatte ZWS.Cells.PasteSpecial schon geschrieben und danach sofort xlPasteValues geschrieben. Da fehlte natürlich das Paste:=