Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1344to1348
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA Code soll aus Access heraus aktualisiert

VBA Code soll aus Access heraus aktualisiert
27.01.2014 17:14:11
Wos
Hallo zusammen,
folgender VBA Code läuft bei drücken eines Buttons bei mir in Access ab:
Sub kup_Q()
Dim Stelle As Integer
Dim NL As String
Dim txt As String
Dim pfad As String
Dim admsp As String
Dim myApp As New Excel.Application
Dim anzahl As Integer
Dim dbs As Database
Dim rst As Recordset
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("SELECT betriebsstätten.Niederlassung FROM betriebsstätten GROUP BY  _
_
betriebsstätten.Niederlassung")
rst.MoveFirst
myApp.DisplayAlerts = False
DoCmd.SetWarnings False
Do While Not rst.EOF
Stelle = rst.Fields(0)
'txt = rst.Fields(1)
Forms!Formular1!NL = Stelle
NL = Forms!Formular1!NL
DoCmd.RunMacro ("m_Q_kup")
pfad = "K:\Tiefbau2\Kundenpyramiden\Export Q"
Workbooks.Open FileName:=pfad & "\Kundenpyramide_STH_ProfessionalX_Vorlage.xlsm"
Workbooks.Open FileName:=pfad & "\Datenbasis Q_KUP akt.xlsx"
'Datenbasis akt. einfügen
Windows("Datenbasis Q_KUP akt.xlsx").Activate
Sheets("t_Q_KUP_aktPer").Select
Columns("A:S").Select
Selection.Copy
Windows("Kundenpyramide_STH_ProfessionalX_Vorlage.xlsm").Activate
Sheets("Database_akt").Select
Columns("A:S").Select
ActiveSheet.Paste
Sheets("Pivot_Analyser_akt").Select
Range("C8").Select
ActiveSheet.PivotTables("PivotTable1").PivotCache.Refresh
Windows("Datenbasis Q_KUP akt.xlsx").Activate
ActiveWindow.Close
'Datenbasis VPer einfügen
Workbooks.Open FileName:=pfad & "\Datenbasis Q_KUP V.xlsx"
Windows("Datenbasis Q_KUP V.xlsx").Activate
Sheets("t_Q_KUP_VPer").Select
Columns("A:S").Select
Selection.Copy
Windows("Kundenpyramide_STH_ProfessionalX_Vorlage.xlsm").Activate
Sheets("Database_V").Select
Columns("A:S").Select
ActiveSheet.Paste
Sheets("Pivot_Analyser_VJ").Select
Range("C8").Select
ActiveSheet.PivotTables("PivotTable2").PivotCache.Refresh
Windows("Datenbasis Q_KUP V.xlsx").Activate
ActiveWindow.Close
Sheets("Kundenumsatzsegmente").Select
Range("E10").Select
ActiveSheet.PivotTables("PivotTable1").PivotCache.Refresh
Range("AG10").Select
ActiveSheet.PivotTables("PivotTable3").PivotCache.Refresh
ActiveWorkbook.SaveAs FileName:=pfad & "\" & NL & "KUP_Q.xls"
ActiveWorkbook.Close
Workbooks.Close
rst.MoveNext
Loop
DoCmd.SetWarnings True
MsgBox ("Fertig!")
End Sub

Bei folgender Anweisung bleibt der Code stehen:
ActiveSheet.PivotTables("PivotTable1").PivotCache.Refresh

Fehlermeldung ist:
Laufzeitfehler 1004:
Die PivotTables-Eigenschaft des Worksheet-Objektes kann nicht zugeordnet werden.

Da sich noch mehr Pivotbezogene Zeilen im Code befinden befürchte ich denselben Fehler.
Dabei habe ich die Aktualisierung der Pivottabellen mit dem Makro-Rekorder in Excel aufgezeichnet und übernommen.
Liegt dies daran, dass ich den Code von Access aus ausführe?
Wenn ja gibt es einen Weg dies zu umgehen. (z.B. die Aktualisierung der Pivots vor dem schließen der Datei durch Access in einem Code innerhalb der Excel-Datei selbst zu verankern?)
Oder bin ich wiedermal ganz auf dem Holz weg.
Für Hilfe wäre ich sehr dankbar.
Beste Grüße
Thias

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Code soll aus Access heraus aktualisiert
28.01.2014 10:17:41
Luschi
Hallo Thias,
beim Steuern von Excel-Objekten (Arbeitsmappen/Tabellen/Pivottabellen usw.) innerhaln von Access muß mit Objektvariablen gearbeitet werden, ansonsten verrent sich Access-Vba ganz schnell einmal.
Nur mal ein 1. Beispiel:
Dim wb_Kunden As Excel.Workbook, wb_Daten As Excel.Workbook
Set wb_Kunden = Excel.Workbooks.Open(FileName:=pfad & "\Kundenpyramide_STH_ProfessionalX_Vorlage.xlsm")
Set wb_Daten = Excel.Workbooks.Open(FileName:=pfad & "\Datenbasis Q_KUP V.xlsx")
Jetzt kennt Access diese beiden geöffneten Arbeitsmappen als Excel-Objekte und kann sie richtig zuordnen. Genauso muß man es mit den Tabellen dieser Arbeitsmappen machen.
Wenn Du 1 gezipptes Demoprojekt hier bereitstellst, helfe ich Dir dabei.
Gruß von Luschi
aus klein-Paris

Anzeige
AW: VBA Code soll aus Access heraus aktualisiert
28.01.2014 10:53:43
Wos
Hallo Luschi,
vielen Dank für den Hinweis. Das klingt doch schon sehr schlüssig.
Ich werde dies einmal ausprobieren bzw. eine Demoversion erstellen. Dazu komme ich aber sicher erst am Wochenende.
Bis dahin alles gute in Klein-Paris :-)
Beste Grüße
Thias

AW: VBA Code soll aus Access heraus aktualisiert
28.01.2014 15:10:09
Wos
Ok ich habe den Code jetzt leicht angepasst...
der Fehler bleibt derselbe...dann sehe ich mal zu, dass ich die Tage ein Demoprojekt erstelle.
Hier der überarbeitete Code:
Sub kup_Q()
Dim Stelle As Integer
Dim NL As String
Dim txt As String
Dim pfad As String
Dim admsp As String
Dim myApp As New Excel.Application
Dim anzahl As Integer
Dim dbs As Database
Dim rst As Recordset
Dim wb_Vorlage As Excel.Workbook
Dim wb_VPer As Excel.Workbook
Dim wb_aktPer As Excel.Workbook
'recordset aufzeichnen Niederlassungen
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("SELECT betriebsstätten.Niederlassung FROM betriebsstätten GROUP BY  _
betriebsstätten.Niederlassung")
rst.MoveFirst
myApp.DisplayAlerts = False
DoCmd.SetWarnings False
'Schleifenbeginn mit Niederlassung aus recordset
Do While Not rst.EOF
Stelle = rst.Fields(0)
Forms!Formular1!NL = Stelle
NL = Forms!Formular1!NL
'Access Makro ausführen
DoCmd.RunMacro ("m_Q_kup")
'Excelfiles öffnen
pfad = "K:\Tiefbau2\Kundenpyramiden\Export Q"
Set wb_Vorlage = Excel.Workbooks.Open(FileName:=pfad & "\ _
Kundenpyramide_STH_ProfessionalX_Vorlage.xlsm")
Set wb_aktPer = Excel.Workbooks.Open(FileName:=pfad & "\Datenbasis Q_KUP akt.xlsx")
Set wb_VPer = Excel.Workbooks.Open(FileName:=pfad & "\Datenbasis Q_KUP V.xlsx")
'aktuelle Periode einfügen
Windows("Datenbasis Q_KUP akt.xlsx").Activate
Sheets("t_Q_KUP_aktPer").Select
Columns("A:S").Select
Selection.Copy
Windows("Kundenpyramide_STH_ProfessionalX_Vorlage.xlsm").Activate
Sheets("Database_akt").Select
Columns("A:S").Select
ActiveSheet.Paste
'Pivot aktuelle Periode aktuallisieren
Sheets("Pivot_Analyser_akt").Select
Range("C8").Select
ActiveSheet.PivotTables("PivotTable1").PivotCache.Refresh
Windows("Datenbasis Q_KUP akt.xlsx").Activate
ActiveWorkbook.Close
'Vorperiode einfügen
Windows("Datenbasis Q_KUP V.xlsx").Activate
Sheets("t_Q_KUP_VPer").Select
Columns("A:S").Select
Selection.Copy
Windows("Kundenpyramide_STH_ProfessionalX_Vorlage.xlsm").Activate
Sheets("Database_V").Select
Columns("A:S").Select
ActiveSheet.Paste
'Pivot alte Periode aktuallisieren
Sheets("Pivot_Analyser_VJ").Select
Range("C8").Select
ActiveSheet.PivotTables("PivotTable2").PivotCache.Refresh
Windows("Datenbasis Q_KUP V.xlsx").Activate
ActiveWorkbook.Close
'Hauptpivot aktualisieren
Windows("Kundenpyramide_STH_ProfessionalX_Vorlage.xlsm").Activate
Sheets("Kundenumsatzsegmente").Select
Range("E10").Select
ActiveSheet.PivotTables("PivotTable1").PivotCache.Refresh
Range("AG10").Select
ActiveSheet.PivotTables("PivotTable3").PivotCache.Refresh
ActiveWorkbook.SaveAs FileName:=pfad & "\" & NL & "KUP_Q.xlsm"
ActiveWorkbook.Close
rst.MoveNext
Loop
DoCmd.SetWarnings True
MsgBox ("Fertig!")
End Sub

Anzeige
AW: VBA Code soll aus Access heraus aktualisiert
28.01.2014 18:47:01
Luschi
Hallo Thias,
was nützt die Definition eine Variablen wie:
Set wb_aktPer = Excel.Workbooks.Open(FileName:=pfad & "\Datenbasis Q_KUP akt.xlsx")
wenn man anschließend diese Variable nie wieder benutzt und ich folgenden Vba-Code sehe:
Windows("Datenbasis Q_KUP akt.xlsx").Activate
Das paßt hinten & vorne nicht. Aber auch die Access-Objekte sind ungenau definiert:
Dim dbs As Database
Dim rst As Recordset
Da es in Access 2 Datenzugriffsmethoden gibt (DAO & ADODB), muß man schon suber deklarieren, von welchem Typ diese Variablen sind und die richtigen Vba-Verweise setzen!
Gruß von Luschi
aus klein-Paris

Anzeige
AW: VBA Code soll aus Access heraus aktualisiert
29.01.2014 17:30:20
Wos
Hallo Luschi,
du hast natürlich mit allem recht...aber was bleibt mir übrig als stümperhaft zu probieren. Zeit VBA mal von Grund auf zu erlernen bleibt mir bisher keine. Also schlag ich mich mit dem Recorder rum und versuche dann die Zeilen zu interpretieren...das mit der Variblendefinition und nicht-Verwendung war natürlich idiotisch..aber ich will es halt versuchen :-)
Zumal ich diesen Ablauf: Verschiedene Niederlassungen über ein Formular in Access durchlaufen, Daten in eine Excel-File exportieren, dort Pivot aktualisieren und unter neuen Namen abspeichern nächste Niederlassung für so einige Berichte brauchen könnte.
Genug des Geschwätzes ich werde das schon mit der Zeit alles lernen. Aber versuchen wir doch zuerst dieses Problem zu lösen.
Ich habe dir mal was hochgeladen!
Link: https://www.herber.de/bbs/user/89023.zip
Die Access-Datenbank und die drei Excel-Files werden für den Ablauf benötigt.
In Access gibt es den hier gepostete Code im Modul 2. Dieser führt unter anderem das Makro m_Q_kup aus.
Das Makro arbeitet dann mit all den Tabellen und Abfragen sowie dem Formular (als müsste ich dir das erklären :-) ). Der VBA Code ist nur dafür gedacht, dass das Ganze je Niederlassung erfolgt, wofür ich das Recordset benötige. (ohne die Pivottabellen hat der Code übrigens gut funktioniert).
1. VBA greift sich also die erste Niederlassung trägt sie ins Formular ein und führt das Makro aus. 2. Darauf hin werden die beiden Excel-Tabellen "Datenbasis X" exportiert.
3. Die Daten dieser Tabellen kommen dann in die beiden unterschiedlichen Arbeitsblätter der Excel-Datei "Kundenpyramide".
4. Sodann müssen in zwei weiteren Arbeitsblättern, sowie dem Arbeitblatt "Kundenumsatzsegmente" die Pivottabellen aktualisiert werden.
5. Dann soll die Datei "Kundenpyramide" unter einem eindeutigen Namen (der Niederlassung) abgespeichert werden.
6. Jetzt sollte VBA sich die nächste Niederlassung greifen und bei 1. anfangen, bis alle Niederlassungen durch sind
Im besten Fall bekommt man es noch hin im letzten Schritt alle Niederlassungen aufeinmal in die Datenbasisdateien zu exportieren (Die Datenmenge ist allerdings immens und übersteigt glaube ich den maximalen Zeilenexport um ein Vielfaches) und dann eine "Gesamt Kundenpyramide" zu erstellen. Dafür müsste dann im Formular unter Niederlassung wohl "nichts" eingetragen werden, was ich aber mit dem Recordset bisher nicht realisieren konnte. Vielleicht könnte man ja die Einzeldatenexporte zusätzlich seperat ablegen und dann nach einander in die "Gesamtpyramide" einfügen.
So hoffe die Datenbank reicht aus, damit du mir helfen kannst. Musste alles rauslöschen, damit ich das hier überhaupt hochgeladen bekomme. Ich weiß auch nicht ob das Makro ohne die Daten überhaupt funktioniert.
Freue mich auf deine Rückmeldung!
Thias
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige