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