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
|