Datentransfer Excel-Access

Hallo zusammen,

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.

mfg
T. Wagner

Hallo!

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

End Sub

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]

mfg
Christian Tschoepke

Servus Jochen,

ja sowas geht auch in VBA. Hierfür würde ich Dir ADO empfehlen.
Hier ein Beispiel aus dem Internet:
http://www.exceltip.com/st/Import_data_from_Access_t…

Vergesse hierzu jedoch nicht, einen Verweis auf Microsoft ActiveX Data Objects X.X Library zu setzen.

DBFullName entspricht dem Namen Deiner Datenbank incl. der Pfad-Angaben. TableName ist der Tabellenname in Deiner Accessdatenbank

Mit diesen Angaben sollte es Dir möglich sein, den Code an Deine Bedürfnisse anzupassen.

LG Gerd

Hallo Ptonka,

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.

Viel Erfolg beim Ausprobieren!

Bei Access muss ich passen.

Gruß
AL

Hallo Jochen,
leider kann ich Dir diese Frage nicht beantworten, da ich mich in Access nicht gut auskenne.

MfG
Docam

Excelmappe anlegen, ein Button drauf, Code dazu:

Option Explicit


’ 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

Set lDB = DAO.OpenDatabase(„F:\Kunden\db3.mdb“) ’

Hi Ptonka

boah mit VBA kenn ich mich nicht aus… Sorry

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?

Sorry for delay. Ich denke, das hat sich erledigt.