ich gebe in Excel (2003) einen Wert in A1 ein und dieser Wert soll in einer Access-Tabelle (Tabelle1) in Spalte 1 (Nummer) gefunden werden und dann der entsprechende Wert aus Spalte 2 (Material) in Excel in die Zelle B1 geschrieben werden.
Lässt sich das realisieren und falls ja, wie sähe die VBA-Syntax dazu aus?
Danke im Voraus,
Jochen
Das ist ein wenig Abstrakt um eine knappe Anwort zu geben.
Hier fängt es schon an welche Aceess Version und Format vorliegt, ob beide Programme laufen oder nur Daten einer MDB abgefragt werden sollen, … .
Als grundsätzliche Idee mal: Anlegen einer Abfrage über „Daten - Aus anderer Quelle - MSQuerry - MS Access Database“
Wenn man damit die Abfrage einmal händisch ausführt und es aufzeichnet, hat man schon mal einen Weg.
Füge nachfolgenden Code in deine Exceldatei ein und starte es manuell oder verknüpfe es mit einem Button!
Du musst zuvor noch im VBA-Editor unter EXTRAS - VERWEISE den Verweis „Microsoft DAO 3.6 Object Library“ aktivieren!
Sub ImportWert()
Dim objDB As DAO.Database
Dim objRS As DAO.Recordset
Dim strSql As String
Dim lngError As Long
On Error Resume Next
Set objDB = OpenDatabase(ActiveWorkbook.Path & „“ & „Quelle.mdb“) 'Pfad zur Accessdatei mit den Daten
On Error GoTo 0
If objDB Is Nothing Then
lngError = 1
GoTo abort
End If
strSql = „“
'Suchbegriff, der in der Datenbank gesucht wird
strsuch = Range(„A1“).Text
'sql Befehl wird generiert
strSql = „SELECT Tabelle1.[Nummer], Tabelle1.[Material] FROM Tabelle1 WHERE (((Tabelle1.[Nummer])=“ & „“"" & strsuch & „“"" & „));“
On Error Resume Next
Set objRS = objDB.OpenRecordset(strSql, dbOpenDynaset)
lngError = 3
mer = Err.Number
mer1 = Err.Description
On Error GoTo abort
objRS.MoveLast
lngGes = objRS.RecordCount
objRS.MoveFirst
If objRS Is Nothing Then
lngError = 2
GoTo abort
End If
Range(„B1“) = objRS.Fields(1).Value
Ende:
objRS.Close
objDB.Close
If lngGes > 1 Then
strSatz = Chr(10) & „(Hinweis: Es wurden " & lngGes & " Datensätze gefunden und der erste wurde übernommen!)“
Else
strSatz = „“
End If
MsgBox „Zu der gesuchten Nummer '“ & strsuch & „’ wurde das Material '“ & Range(„B1“) & „’ gefunden!“ & strSatz
Exit Sub
abort:
Select Case lngError
Case 1
MsgBox „Datei mit der Datenbank wurde nicht gefunden!“, vbCritical, „Aborted“
Case 2, 3
MsgBox „Datensatz wurde nicht gefunden!“, vbCritical, „Aborted“
objDB.Close
End Select
Also, man kann Excel-dateien mit Access verknüpfen. Die Tabellen werden dann in Access 1:1 angezeigt. Im Access kann man eine Abfrage machen, in der z.B. zwei Tabbelen miteinander verglichen werden, und ein Wert in die Tabbele geschrieben wird, wenn z.B. der Code identisch ist. das funktioniert ähnlich wie der „sverweis“-befehl in Excel.
Um konkrete Hilfestellung geben zu können, müßtest Du mir eine entsprechende Exceldatei schicken und mir genau erklären was wohin geschrieben werden soll. Wenn Du das möchtest, schicke mir die datei auf : [email protected]
leider ist der Code nicht ganz so einfach. Zuerst würde ich im VBA-Projekt (in Excel) den Verweis auf die (z.B.) Microsoft DAO 3.6 Object Library setzen, damit man einfacher auf Access-Objekte zugreifen kann.
Danach kann man z.B. Datenbankobjekte und Datensatzobjekte anlegen und bearbeiten. Die Parameter der Funktionen musst Du am besten aus der Hilfe ablesen, da hier Angaben zu Deiner Datenbank gemacht werden müssen.
Dim db As Database
Dim rcDaten As Recordset
Set db = DBEngine.Workspaces(0).OpenDatabase()
Set rcDaten = db.OpenRecordset()
Anschließend kann man mit rcDaten in einer Schleife arbeiten:
rcDaten.MoveFirst
Do while not eof(rcDaten)
If rcDaten!Nummer = Sheet(„Tabelle1“).Range(„A1“).Value Then Sheet(„Tabelle1“).Range(„B1“).Value = rcDaten!Material
Loop
Am besten, mann arbeitet beim Vergleich noch mit UCase(), damit man ggf. Groß- und Kleinschreibung ignoriert.
Bei manchen Versionen (Excel, Access, DAO) müssen ggf. noch Steuerzeichen entfernt werden, man nutze am Besten den Debugger und schaut sich die Vergleichswerte einmal an, wenn das Programm keine Übereinstimmung findet, man aber vom menschlichen Datenvergleich eine Übereinstimmung erwarten würde.
Evtl. Muss man auch mit einer äußeren Schleife für einen Zeilenzähler arbeiten, denn ein Programm macht ja bekanntlich nur Sinn, wenn man mehr als einen Wert vergleichen möchte, also z.B. Werte aus A1, A2, A3, …, A150, A151 usw. also mehreren Zeilen eine Zuordnung des entsprechenden Materials.
’
’ dies ist VBA in Excel !
’
Private Sub CommandButton1_Click()
’
’ unter Extras / Verweise… ein Verweis auf „Microsoft DAO 3.6 Object Library“ setzen
’
Dim lDB As DAO.Database
Dim lRS As DAO.Recordset
Dim liNummer As Long
Dim lsMaterial As String
Dim lsSQL As String
Hmmm … muss das wirklich mit VBA und echtem Schreiben geschehen? Oder ist eine Alternative die Verknüpfung der Access-Tabelle als externe Datenquelle in Excel und dann ein schlichter SVERWEIS?