4.7k Aufrufe
Gefragt in Datenbanken von hans_83 Einsteiger_in (71 Punkte)
Hallo zusammen,

mein Problem: Ich habe eine Datenbank um Kundendaten zu verwalten. In den jeweiligen Datensatz (Kunde) sollen jährich nur einzelne Werte aus der zum Kunden gehörenden Excel-Tabelle übernommen werden. Die Mappe ist standardisiert.

Ich hab eine Routine mit GetObject, die mir per Click die entsprechende Arbeitsmappe öffnet, aber nun komm ich nicht weiter. Wie komme ich in der geöffneten Mappe in das entsprechende Arbeitsblatt und die richtige Zelle, um den Wert auszulesen und an eine Variable zu übergeben?

By the way,warum meldet mein Access einen Fehler, wenn ich z.B. eine Objektvariable definieren will: Dim objExcel As excel.Application,auch bei excel.workbookund excel.worksheet (Access 2002 SP3)?

Hier bitte ich um euere Hilfe. Kennt jemand eine Fundstelle mit Beispielcode?
Grüße
Hans

5 Antworten

0 Punkte
Beantwortet von
Hallo!

Die von Dir angeführte Routine kenne ich leider nicht.
Aber als Alternative würde ich vorschlagen, öffne die Tabelle in Acces und die Excel-Arbeitsmappe und das dementsprechende Tabellenblatt, kopiere die einzufügende Zelle in Excel und füge den Inhalt in das betreffende Feld in der Tabelle ein.
Das einzige worauf zu achten ist, dass der Felddatentyp mit den Dateien übereinstimmt.

mfg.

Paul1
0 Punkte
Beantwortet von hans_83 Einsteiger_in (71 Punkte)
Hallo Paul,

daran werde nicht ich arbeiten, sondern Mitarbeiterinnen eines Schreibbüros. Die Tabelle wird gar nicht sichtbar sein, sondern nur ein Formular.

Wenn ich schon per Code die Excelmappe aufmachen kann, werd ich doch, so Bill Gates es will, fünf Daten auslesen und in Access wieder einlesen können, das muss doch machbar sein ...

Ich probiers mal weiter, trotzdem DANKE

Viele Grüße
Hans
0 Punkte
Beantwortet von
Hallo Hans!

In Excel und Acces arbeite ich derzeit noch mit den Standardfunktionen (die ich natürlich auch nicht alle kenne), jedoch logische Abläufe interessieren mich besonders, obwohl mich spezielle Bezeichnungen die ich noch nie gehört habe wie z.B.GetObjekt etc. etwas verunsichern.

Erst vor einiger Zeit habe ich begonnen mich für VBA zu interessieren und bin froh, dass es mir mittlerweile gelingt, ein Makro in Excel funktionsfähig einzufügen (erklärt von Karin hier im Forum).

Dass die von mir angeführte Alternative für Deine angestrebte Lösung unbrauchbar ist, kann ich verstehen.

Nicht zuletzt um auch selbst was dazu zu lernen, habe ich ein wenig im Internet recherchiert und 2 Links gefunden, die Dir eventuell weiterhelfen könnten:

Microsoft 1

Microsoft 2

Sollte es Dir nichts bringen, betrachte es als Fleißaufgabe von mir

mfg.

Paul1
0 Punkte
Beantwortet von marie Experte (2k Punkte)
By the way,warum meldet mein Access einen Fehler, wenn ich z.B. eine Objektvariable definieren will: Dim objExcel As excel.Application,auch bei excel.workbookund excel.worksheet (Access 2002 SP3)?


Vermutlich hast Du keinen Verweis gesetzt. Der Verweis für Excel muss so lauten:

Microsoft Excel xx.0 Object Library

Das xx bezeichnet die Officeversion, wobei 9 für Office 2000 bis 12 für Office 2007 gilt.

@Hans: er will doch die Daten importieren, wenn ich das richtig verstanden habe?

Wie komme ich in der geöffneten Mappe in das entsprechende Arbeitsblatt und die richtige Zelle, um den Wert auszulesen und an eine Variable zu übergeben?
Das können wir Dir aber jetzt auch nicht beantworten, wenn Du nicht etwas genauer erklärst wo die Daten stehen und woran man sich orientieren kann. Musst Du ganze Spalten importieren? dann erstellst Du eine Importspezifikation, die importiert Dir exakt die Daten, die Du möchtest. Heißt die Mappe immer gleich? Also ein wenig genauer musst Du schon sagen woran man sich orientieren kann.

Gruß marie
0 Punkte
Beantwortet von hans_83 Einsteiger_in (71 Punkte)
Hallo Marie, hallo Paul,

@Paul: danke für deine Fleißaufgabe! Den in M2 angegebenen Code sub getexcel hab ich meiner db in etwas veränderter Form eingesetzt, um die zum Datensatz gehörende Excel-Mappe zu öffnen, funktioniert auch.

@Marie: pro Datensatz Kunde in der db existiert immer eine Excel-Arbeitsmappe mit entsprechendem Dateinamen (ca. 90 Arbeitsblätter). Jede Mappe ist exakt gleich und gestattet die buchhalterische Verwaltung des Kunden für 9 Jahre, wobei die 'Lebensdauer' der Mappe + db-datensatz für jeden Kunden individuell ist.
Jährlich müssen nun standardisierte Berichte verfasst werden, in denen u.a. einzelne Excel-Daten des Kunden an eine weitere Instanz berichtet werden. Diese Berichte erstelle ich über die db, da viele weitere Daten aus der db notwendig sind.
Mein Problem war, nach dem Öffnen der Excel-Datei mit getExcel (s.o.) in das richtige Jahresblatt zu kommen und aus einigen Zellen die Daten auszulesen und in ein db-Formular wieder einzutragen. Die in div. Foren, Büchern usw. angegebenen Beispiele waren meist in Richtung Ac --> Ex, oder haben bei mir Fehler angezeigt. Mein Access-VBA-Wissen ist eher oberflächlich, und für derartige Problemstellungen muss ich mich erst langsam herantasten und viel ausprobieren. Nach drei Tagen mit try and error hab ich's aber endlich geschafft - danke übrigens für den Verweis-Tipp!!! Das sind so Sachen, die mir halt nicht automatisch einfallen.
Mein Code lautet nun:


Option Compare Database

Declare Function FindWindow Lib "user32" Alias _
"FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As Long) As Long

Declare Function SendMessage Lib "user32" Alias _
"SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long


Sub GetExcel()

Dim XLApp As Object
Dim ExcelLiefNicht As Boolean
Dim Jahr_Blatt As String
Dim Blatt1, Blatt2 As Integer

Verz = Forms!ZV_Haupt1!ZV_Haupt_UF_Daten.Form!ZV_Speicherort
Dat_Name = Forms!ZV_Haupt1!ZV_Haupt_UF_Daten.Form!ZV_Bez_Excel
datei = Verz & Dat_Name
Jahr_Blatt = InputBox("Dieser Bericht entspricht" & Chr$(13) & _
"in der Buchhaltung dem Jahr (Ziffer 1 - 7) oder" & Chr$(13) & _
"der 1. Schlussabrechnung (= S1)," & Chr$(13) & _
"der 2. Schlussabrechnung (= S2)?", "Datenübernahme aus der Buchhaltung")

Select Case Jahr_Blatt 'hier lege ich das Arbeitsblatt nach Jahr fest
Case 1
Blatt1 = 12
Blatt2 = 13
Case 2
Blatt1 = 19
Blatt2 = 20
Case 3
Blatt1 = 26
Blatt2 = 27
Case 4
Blatt1 = 33
Blatt2 = 34
Case 5
Blatt1 = 40
Blatt2 = 41
Case 6
Blatt1 = 47
Blatt2 = 48
Case 7
Blatt1 = 54
Blatt2 = 55
Case "S1"
Blatt1 = 65
Blatt2 = 66
Case "S2"
Blatt1 = 70
Blatt2 = 71

Case Else
msg = MsgBox("Es sind nur Werte von 1 bis 7 sowie S1, S2 zulässig!", vbCritical, "Fehler")
End Select


On Error Resume Next
Set XLApp = GetObject(, "Excel.Application")
If Err.Number <> 0 Then ExcelLiefNicht = True
Err.Clear

DetectExcel

Set XLApp = GetObject(datei)

XLApp.Application.Visible = True
XLApp.Parent.Windows(1).Visible = True

' Dateiverarbeitung.
betrag_lfd_ausgaben = XLApp.sheets(Blatt1).Cells(10, 9).Value
Forms!ZV_Haupt1!ZV_Abrechnungen_UF.Form!A_Lfd_Ausgaben = betrag_lfd_ausgaben
' der Länge wegen gekürzt


If ExcelLiefNicht = True Then
XLApp.Application.Quit
Else
XLApp.Parent.Windows(1).Visible = False
XLApp.Application.Visible = False
End If

Set XLApp = Nothing ' Verweis auf Anwendung und Tabelle freigeben.
End Sub

Sub DetectExcel()
Const WM_USER = 1024
Dim hWnd As Long
hWnd = FindWindow("XLMAIN", 0)
If hWnd = 0 Then
Exit Sub
Else
SendMessage hWnd, WM_USER + 18, 0, 0
End If
End Sub


Was ich lange nicht gefunden hab war das:
XLApp.sheets(Blatt1).Cells(10, 9).Value - hier hab ich anfangs zu kompliziert gedacht und ge-DIM-t und ge-SET-tet wie wahnsinnig.

Nun jetzt hab ich's! Danke für eure Mühe und eure Zeit!
Viele Grüße
Hans
...