Tipp zum Beschleunigen der Word-Fernsteuerung
PicsGmbH
Gesendet: 16.11.12 10:16
Betreff: Tipp zum Beschleunigen der Word-Fernsteuerung


Hier ein paar Erkenntnisse zur Automatisierung von Word aus Access.

Problemstellung:
Ich erstelle aus Access sehr viele Word-Dokumente, teilweise mehrere Seiten lang mit komplexer Formatierung und vielen Textmarken, insgesamt so an die 200.000 im Jahr
Seit der Umstellung von Office 2000 auf Office 2010 ist das ganze im den Faktor 3 langsamer.

Deshalb habe ich mich auf die Suche gemacht wie man das optimieren kann, hier ein paar Tipps:


Hier mein Beispiel-Code, die Ausgangsbasis meines Tests:


01: Dim oWord As Object, i As Long
02: ' Verbindung öffnen
03:
Set oWord = CreateObject("Word.Application"
04:
05: oWord.Visible = True
06: oWord.Activate
07: ' neues Dokument erstellen
08: oWord.Documents.Add NewTemplate:=False
09: ' und jetzt den Text übertragen
10: For i = 1 To 500
11: oWord.selection.TypeText Text:="Beispieltext für Word ..." & vbCrLf
12: Next i
13: ' Trennen
14: Set oWord = Nothing

 

 Dieses Beispiel war die Ausgangsbasis und brauchte ungeführ 4000ms in Office 2010/64bit

Im Prinzip gleichen Code im Word direkt ausführen 210ms
Ändern von Late Binding auf Early Binding (Word.Application statt Object) brachte keinen Unterschied
Die meiste Performance bringt das ausblenden von Word während der Ausführung, dazu Zeile 5 auf false, Zeile 6 auskommentiert und 5+6 dann vor 14
Laufzeit nur mehr 1000ms statt 4000ms

Der große Nachteil dieser Variante ist, dass bei einem Fehler das Word im Hintergrund stirbt und irgendwann viele Prozesse da sind.
Alternative wäre "oWord.ScreenUpdating = False" statt "Visible=False", aber das bringt nicht ganz so viel, waren etwa 2000ms bei mir
Rechtschreibung und Gramatik ausschalten (oWord.Options.CheckGrammarAsYouType usw) bringen gar nichts

Im Vergleich dazu das ganze in einer VM mit 32bit-Office:
bei aktiviertem Word 9000ms (also der Bildschirmtreiber ist hier eindeutig langsamer), bei ausgeblendetem Word 1100ms (also kaum langsamer)
auf einem Terminalserver sieht es leider ganz schlimm aus, da braucht aktivieres Word 12s und inaktives Word 6s
 

Im Vergleich dazu das gleiche in einer VM mit Office 2000:
Aktiviertes Word: 1300ms
Inaktives Word: 1100ms

Das zeigt eigentlich sehr schön, dass war die Steuerung von Word nicht wirklich langsamer geworden ist, sondern nur das Screenrefresh hier 3x so lange dauert

Ergebnis: eigentlich hilft nur ein Ausblenden des Word, und ein möglichst sauberes aktivieren im Fehlerhandling.
Bzw. probiere ich in der Praxis eh vor dem createObject ein getObject und hole damit die Leichen in den Vordergrund
 


Top of the page Bottom of the page