Ich weiß, dass Excel kein Datenbankprogramm ist.
Ich habe NUR geschrieben, dass das WIE eine Datenbank gehandhabt wird.
Kleiner Unterschied, richtig?
Hast du mal nach Bernd Held geschaut?
Wenn nein, dann hier seine Lösung dazu:
echnik: Daten in Mappen aktualisieren, ohne diese zu öffnen
Beim ersten Beispiel geht es um das Thema, wie man mit Hilfe eines VBA-Makros Daten in eine Arbeitsmappe schreiben kann, ohne diese vorher öffnen zu müssen. Gerade bei großen Arbeitsmappen dauert der Öffnen- und der Speichervorgang schon gern einmal etwas länger. Daher der Ansatz über die Hintertüre von Excel an die Arbeitsmappen ranzukommen und die Daten direkt in eine Tabelle schreiben. Dazu wird die Windows-Bibliothek ADO und eine SQL-Anweisung benötigt.
Schauen wir uns dazu einmal die Ausgangssituation aus der folgenden Abbildung an.
Auf der linken Seite ist der Datenbestand der Datei zu sehen, in der das folgende Makro enthalten ist. Die zweite Datei auf der rechten Seite enthält lediglich die Nummern. Die fehlenden Bezeichnungen sollen über den Abgleich mit der Nummer aus der „linken Mappe“ in die „rechte Mappe“ gespielt werden. Dabei bleibt die Ziel-Mappe während des Makroablaufs geschlossen.
Damit dies überhaupt funktioniert muss aus Voraussetzung die Überschrift in der Quell- und Ziel-Mappe identisch sein!
Sub BeschreibungenAktualisierenOhneMappeZuOeffnen()
Dim con As ADODB.Connection
Dim rst As ADODB.Recordset
Dim strSQL As String
Dim strDatei As String
Dim strCon As String
Dim lngZeile As Long
Dim lngZeileMax As Long
Set con = New ADODB.Connection
Set rst = New ADODB.Recordset
strDatei = ThisWorkbook.Path & "\Artikel.xlsx"
strCon = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & strDatei & ";" & _
"Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
con.Open strCon
With Tabelle1
lngZeileMax = .Range("A" & Rows.Count).End(xlUp).Row
For lngZeile = 2 To lngZeileMax
strSQL = "UPDATE [Tabelle1$] SET [Beschreibung] = """ & _
.Cells(lngZeile, 2).Value & """ WHERE ArtNr = " & _
.Cells(lngZeile, 1).Value
rst.Open strSQL, con
Next lngZeile
End With
con.Close
Set rst = Nothing
Set con = Nothing
End Sub
'Quelle: *** VBA-Tanker ID10306 ***
Bevor das Makro gestartet wird, muss die Bibliothek „Microsoft ActiveX Data Objects 6.1 Library” in der Entwicklungsumgebung von Excel durch den Menübefehl Extras/Verweise eingebunden werden. Diese Bibliothek enthält alle Befehle, die eben notwendig sind, um über SQL-Befehle auf Dateien zuzugreifen. Gleich zu Beginn wird ein Verweis mittels der Variablen con auf diese Bibliothek gesetzt.
Im nächsten Schritt wird der Pfad- und Dateiname zur Ziel-Arbeitsmappe angegeben. Als Prämisse für dieses Makro befindet sich diese Mappe im gleichen Verzeichnis wie auch die Quell-Arbeitsmappe.
Danach wird der Connection-String zusammengesetzt und dabei der Namen der Zieldatei übergeben. Über eine For Next – Schleife wird dann in der Tabelle1 Zeile für Zeile in der Quelle-Arbeitsmappe verarbeitet. Innerhalb der Schleife kommt die SQL-Anweisung UPDATE zum Einsatz, die über die ArtNr die Beschreibung in die Ziel-Arbeitsmappe in Tabelle1 schreibt. Hier ist darauf zu achten, dass die Eckigen Klammern um den Tabellenamen sowie das Dollar-Zeichen am Ende des Tabellennamen zu setzen ist.
Zu jeder ArtNr, die Excel finden kann wird nun die dazugehörige Bezeichnung geschrieben. Im Prinzip haben wir hier einen SVERWEIS über SQL nachgebaut, der um ein Vielfaches schneller ist.
Hinweis: Zum Testen können auch beide Mappen zuvor geöffnet werden. Auch in diesem Fall funktioniert das Makro einwandfrei.