nach erfolglosen Recherchen in Newsgroups, Knowledgebase
(deutsch, englisch), usw. suche ich nun hier nach Hilfe.
Das Problem:
Meistens läuft das VBA-Programm fehlerlos durch, aber
in ca 10% der Fälle tritt folgender Fehler auf:
Laufzeit-Fehler '1004'
Die Methode 'RefreshTable' für das Objekt 'PivotTable'
ist fehlgeschlagen.
Im Debugger wird die Zeile mit folgendem Code markiert:
.worksheets("MeineDaten").PivotTables(1).RefreshTable
Warum klappt es manchmal nicht, obwohl das Programm an
mehreren Tagen vorher ohne Fehler und mit korrektem
Ergebnis durchgelaufen ist?
Was muß ich ändern?
Der Programmkontext:
Das VBA-Programm öffnet aus einer Access.mdb heraus eine
Excel-Arbeitsmappe. Das Excel-Blatt "MeineDaten" enthält
eine einzelne Pivottabelle, die Daten stammen aus einer
Tabelle in der Access.mdb.
Manuell aktualisiere ich die Pivottabelle, indem ich den
Cursor in ihren Bereich setze und die Schaltfläche mit
dem roten Ausrufezeichen drücke.
In der Statuszeile erscheinen nacheinander die Meldungen
- Verbinde zur Datenquelle
- Liest Daten: der Datensatzzähler läuft hoch
- Berechnet PivotTabelle, Aktualisiert Felder
Per VBA aktualisiere ich die PivotTabelle
aus Access heraus mit
Dim objExcel As Object
Set objExcel = CreateObject("Excel.Application")
With objExcel
.Visible = True
.ScreenUpdating = True
.Workbooks.Open strZielPfadPivotBerichteXls
.Worksheets("Info").Activate
' Die Pivottabelle kennt ihre Datenquelle.
' Refreshtable löst die Aktualisierung aus.
' Excel-Tabelle aktualisieren aus Access-Tabelle "Name"
.Worksheets("MeineDaten").PivotTables(1).RefreshTable
usw.
Die Meldungen in der Statuszeile erfolgen in gleicher
Weise, wie unter "manuell" beschrieben. Es scheint
also alles ok zu sein.
Das Programm läuft einmal pro Tag, ca. 1 bis 2 Wochen
lang klappt alles fehlerfrei, und dann tritt wieder
obiger Fehler auf. Am Programm wurden jedoch keinerlei
Änderungen vorgenommen.
Meine bisherige Recherche:
In der Microsoft-Knowledgebase fand ich keine Hinweise,
weder in der deutschen, noch in der englischen.
Hinweis: die englische Fehlermeldung lautet
Run-time error '1004':
RefreshTable method of Pivot Table class failed
In microsoft.public.excel.programming wurde geraten,
die PivotTabelle vor Ausführung von refreshtable zu
selektieren, andere wieder erklärten dies für unnötig,
da sie im Programm ja eindeutig benannt wird. Geholfen
hat es jedenfalls nicht.
Jemand anders riet als workaround
workbooks(nr).RefreshAll
zu benutzen.
Das habe ich noch nicht ausprobiert, es geht auch an
meiner Intention vorbei und erklärt schon garnicht
das wechselvolle Verhalten des VBA-Programms.
Vielen Dank im Voraus für Lösungen, Links, Literatur, ...
Jürgen Ruff
---"Jürgen Ruff" <juerge...@tks-cs.thyssenkrupp.com> schrieb ...
> [...]
> Meistens läuft das VBA-Programm fehlerlos durch, aber
> in ca 10% der Fälle tritt folgender Fehler auf:
>
> Laufzeit-Fehler '1004'
> Die Methode 'RefreshTable' für das Objekt 'PivotTable'
> ist fehlgeschlagen.
>
> Im Debugger wird die Zeile mit folgendem Code markiert:
> .worksheets("MeineDaten").PivotTables(1).RefreshTable
>
> Warum klappt es manchmal nicht, obwohl das Programm an
> mehreren Tagen vorher ohne Fehler und mit korrektem
> Ergebnis durchgelaufen ist?
> Was muß ich ändern?
> [...]
Ich gehe mal davon aus, dass der Zugriff auf die Daten während dieser
"Störungen" nicht auf irgendeine Art und Weise (z. B. exklusiver
Zugriff; "lahmes" Netzwerk) gesperrt ist. Dann könnte es IMHO auch ein
Problem der *Asynchronität* sein.
Bin dann etwas ratlos, aber folgende drei Lösungsansätze (evtl. auch
kombiniert) könnten dir evtl. behilflich sein:
(1)
' statt RefreshTable folgende Anweisung verwenden (könnte aber sein,
dass diese erst mit einer neueren Excel-Version funktioniert):
.worksheets("MeineDaten").PivotTables(1).PivotCache.Refresh
(2)
Es könnte sinnvoll sein, dem Betriebssystem vor dem Aktualisieren eine
kurze Verschnaufpause zu geben:
'---snip---
DoEvents
' .... Refresh
'---snip---
(3)
Evtl. hilft dir auch die Eigenschaft BackgroundQuery, die standardmäßig
aber ohnehin auf False stehen sollte:
'---snip---
.worksheets("MeineDaten").PivotTables(1).PivotCache.BackgroundQuery =
False
'---snip---
--
In der Hoffnung damit geholfen zu haben, verbleibe ich mit einem leisen
Servus aus Wien,
-Robert Gelbmann-
---
MVP für Excel
Excel-FAQ's: http://www.roehrenbacher.at/erc/faq/
--
----+----1----+----2----+----3----+----4----+----5----+----6----+----7
> Ich gehe mal davon aus, dass der Zugriff auf die Daten während dieser
> "Störungen" nicht auf irgendeine Art und Weise (z. B. exklusiver
> Zugriff;
Das kann ich sicherstellen
"lahmes" Netzwerk)
Das Netz läuft recht stabil, aber kurze "Hänger" sind ev.
nicht auszuschließen. Muß ich mal genauer beobachten.
> Bin dann etwas ratlos,
Ich fühle mich schwach getröstet ;-)
> aber folgende drei Lösungsansätze (evtl. auch
> kombiniert) könnten dir evtl. behilflich sein:
>
> (1)
> ' statt RefreshTable folgende Anweisung verwenden (könnte aber sein,
> dass diese erst mit einer neueren Excel-Version funktioniert):
> .worksheets("MeineDaten").PivotTables(1).PivotCache.Refresh
Die Hilfe von Excel97 kennt den Begriff.
Werde ich mal probieren.
> (2)
> Es könnte sinnvoll sein, dem Betriebssystem vor dem Aktualisieren eine
> kurze Verschnaufpause zu geben:
>
> '---snip---
> DoEvents
> ' .... Refresh
> '---snip---
Ok. Das kann wohl nie schaden.
> (3)
> Evtl. hilft dir auch die Eigenschaft BackgroundQuery, die standardmäßig
> aber ohnehin auf False stehen sollte:
> '---snip---
> .worksheets("MeineDaten").PivotTables(1).PivotCache.BackgroundQuery =
> False
Was dieser Parameter bedeutet, habe ich mich schon häufiger gefragt.
Er war mir in den Hilfetexten aber bisher nur in Zusammenhang
mit Datenimport in Tabellenblätter aufgefallen, nicht in
Pivottabellen. Deshalb, und weil ich Ihn nicht verstehe, habe
ich damit noch nicht experimentiert.
> In der Hoffnung damit geholfen zu haben, verbleibe ich mit einem leisen
Nun, immerhin habe ich einb paar neue Ansatzpunkte.
Bei Ausprobieren der möglichen Kombinationen der 3 Punkte
wird sich natürlich über Wochen hinziehen.
>
> Servus aus Wien,
> -Robert Gelbmann-
Ein schönes Wochenende wünscht
Jürgen