Beitrag aus SmartTools Access Weekly
Bestimmte Zelle in Excel-Tabelle per VBA auslesen
Access 365 2019 2016 2013 2010 2007
FRAGE Ich stehe immer wieder vor der Aufgabe, aus Access heraus Werte, aus einer Excel-Tabelle auslesen zu müssen. Der Aufbau der Tabellen ist bekannt, so dass ich ganz gezielt auf bestimmte Zellen zugreifen kann. Wie lässt sich diese Aufgabe am einfachsten per VBA realisieren? Am hilfreichsten wäre eine Funktion, der ich flexibel die Zeilen- und Spaltennummer der gewünschten Zelle übergeben könnte.
Diverse Anfragen
ANTWORT Dazu binden Sie zunächst die Excel-Tabelle als verknüpfte Tabelle in Access ein:
- Klicken Sie auf dem Register "Externe Daten" in der Gruppe "Importieren" auf das Symbol Excel.
- Lokalisieren Sie über Durchsuchen die Excel-Arbeitsmappe mit der Tabelle, die die Bestelldaten enthält.
- Aktivieren Sie die Option Erstellen Sie eine Verknüpfung zur Datenquelle, indem Sie eine verknüpfte Tabelle erstellen.
- Klicken Sie auf Ok, folgen Sie den weiteren Anweisungen des Import-Assistenten und nehmen Sie die notwendigen Einstellungen vor. Als Namen für die verknüpfte Tabelle geben Sie beispielsweise "Bestelldaten aus Excel" ein.
- Klicken Sie nach Abschluss der Einbindung auf Ok.
Im Datenbankfenster bzw. im Navigationsbereich finden Sie nun ein Symbol einer Excel-Tabelle mit einem kleinen schwarzen/blauen Pfeil davor. Um auf ein bestimmtes Feld einer bestimmten Zeile dieser Tabelle zuzugreifen, setzen Sie in der VBA-Entwicklungsumgebung eine Referenz auf DAO und kopieren folgende Funktion in ein neues oder ein vorhandenes Modul:
Function ExcelFeld(strTabName As String, _
lngSpalte As Long) _
lngZeile As Long, _
As Variant
Dim db As DAO.Database
Dim rs As DAO.Recordset
On Error Resume Next
Set db = CurrentDb()
Set rs = db.OpenRecordset(strTabName, _
dbOpenDynaset)
rs.AbsolutePosition = lngZeile
ExcelFeld = rs.Fields(lngSpalte - 1)
rs.Close
Set rs = Nothing
Set db = Nothing
End Function
Die Funktion öffnet die mit "strTabName" angegebene Tabelle als Recordset, positioniert diesen über "AbsolutePosition" auf den der gewünschten Zeile (lngZeile) entsprechenden Datensatz und liest daraus den Inhalt der Spalte (lngSpalte) über die Fields-Auflistung auf. Diese wird von "0..n" indexiert, so dass von der Spaltennummer "1" abzuziehen ist.
In Ihren VBA-Routinen können Sie mit der folgenden Anweisung zum Beispiel den Inhalt der 3. Spalte aus der 7. Zeile auslesen (Zelle C7):
Dim strWarengruppe As String
strWarenGruppe = ExcelFeld("Bestelldaten aus Excel", 3, 7)