2009-05-06 16 views
0

Ich entschuldige mich im Voraus für die Newbie Frage - die meisten meiner VBA-Erfahrung ist in Excel oder Word zu Excel. In diesem Fall gehe ich von Excel zu Word. Ich versuche, einige Daten aus einigen Word-Formularen zu erfassen und in einer Excel-Datei zu speichern.Excel VBA zum Öffnen mehrerer Word-Dateien in einer Schleife

Gerade jetzt, mein Code funktioniert für das erste Dokument in dem Ordner, aber nach, dass er die Schläuche nach oben mit einem Automatisierungsfehler „der Server eine Ausnahme ausgelöst hat“ (Goo!)

Hier ist mein Code:

Dim objWordApp As Object 

strCurFileName = Dir(strFilePath) 

Set objWordApp = CreateObject("word.application") 
objWordApp.Visible = True 

Do While strCurFileName <> "" 

    objWordApp.documents.Open strFilePath & strCurFileName 
    objWordApp.activedocument.Unprotect password:="testcode" 

    {EXCEL PROCESSING HERE} 

    strCurFileName = Dir 
    objWordApp.activedocument.Close 0 

Loop 

objWordApp.Quit 
Set objWordApp = Nothing 

Ich stelle fest, dass der Code funktioniert, wenn ich die App beenden und das Objekt = nichts innerhalb der Schleife festlegen. Aber so, wie es jetzt ist, bombardiert es die zweite Datei im Ordner in der Zeile "objWordApp.documents.Open strFilePath & strCurFileName".

Kann ich Word-Dokumente in einer Schleife öffnen und schließen, ohne das Objekt immer wieder neu erstellen zu müssen? Es ist wirklich langsam, wenn ich es so mache.


Danke für die Hilfe - ich mag Ihren Weg viel besser. Leider bekomme ich das gleiche Ergebnis. Das Programm stirbt das zweite Mal durch die Schleife auf der Linie, die lautet:

Set objWordDoc = objWordApp.Documents.Open(objFile.Path) 

Der Fehler, die ich bekommen ist:

Laufzeitfehler -2147417851 (80010105) Automation Error der Server hat eine Ausnahme.

Ich habe versucht, Ihren Code auf normalen Word-Dokumenten (nicht diejenigen, die ich verarbeite) und es hat gut funktioniert. Die Dokumente, die ich ausführe, haben Formularfelder und Makros - nicht sicher, ob das einen Unterschied macht. Ich habe die Makrosicherheit in Word auf "niedrig" und "sehr hoch" festgelegt, um sicherzustellen, dass die anderen Makros nicht stören.

Ich kann es einfach nicht herausfinden, warum es für das erste Dokument funktioniert und dann nicht das nächste. Ich habe sogar den ersten Arzt geklont, aber das machte keinen Unterschied.


Immer noch kein Glück. Das Einzige, was ich zur Arbeit bringen kann, ist, wenn ich die Objekte komplett lösche und sie jedes Mal neu erstelle, wenn ich eine Datei öffnen möchte.

Set objFolder = FSO.GetFolder(strFilePath) 

For Each objFile In objFolder.Files 

    Set objWordApp = CreateObject("word.application") 
    objWordApp.Visible = True 

    If Right(objFile.Name, 4) = ".doc" Then 
     Set objWordDoc = objWordApp.documents.Open(Filename:=objFile.Path, ConfirmConversions:=False, _ 
      ReadOnly:=True, AddToRecentFiles:=False, PasswordDocument:="", _ 
      PasswordTemplate:="", Revert:=False, WritePasswordDocument:="", _ 
      WritePasswordTemplate:="", Format:=wdOpenFormatAuto) 

     [Process DOC] 

     objWordDoc.Close 0, 1 
    End If 

    Set objWordDoc = Nothing 
    objWordApp.Quit 
    Set objWordApp = Nothing 

Next 

Ich bin mir nicht sicher, warum das funktioniert und warum es nicht anders geht. Wenn ich diesen Weg gehen muss, kann ich - es scheint nur sehr langsam und ineffizient. Ist das eine schlechte Idee?

+0

Was meinst du mit "Bomben"? irgendeine Fehlermeldung? – shahkalpesh

Antwort

1

Ich habe das Verzeichnis in ein FileSystemObject geändert (gehe zu Tools \ References und füge Microsoft Scripting Runtime hinzu) und konnte mehrere Dateien erfolgreich öffnen. Wenn Sie Probleme haben, beschreiben Sie bitte den Fehler, den Sie im Debugger sehen. Wenn Sie in Unterverzeichnisse rekurven müssen, müssen Sie dies ebenfalls neu gestalten.

Private mobjWordApp As Word.Application 

Sub Test() 
    ProcessDirectory "PathName" 
End Sub 

Property Get WordApp() As Word.Application 
    If mobjWordApp Is Nothing Then 
    Set mobjWordApp = CreateObject("Word.Application") 
    mobjWordApp.Visible = True 
    End If 
    Set WordApp = mobjWordApp 
End Property 

Sub CloseWordApp() 
    If Not (mobjWordApp Is Nothing) Then 
    On Error Resume Next 
    mobjWordApp.Quit 
    Set mobjWordApp = Nothing 
    End If 
End Sub 

Function GetWordDocument(FileName As String) As Word.Document 
    On Error Resume Next 
    Set GetWordDocument = WordApp.Documents.Open(FileName) 
    If Err.Number = &H80010105 Then 
     CloseWordApp 
     On Error GoTo 0 
     Set GetWordDocument = WordApp.Documents.Open(FileName) 
    End If 
End Function 

Sub ProcessDirectory(PathName As String) 
    Dim fso As New FileSystemObject 
    Dim objFile As File 
    Dim objFolder As Folder 
    Dim objWordDoc As Object 

    On Error Goto Err_Handler 

    Set objFolder = fso.GetFolder(PathName) 
    For Each objFile In objFolder.Files 
    If StrComp(Right(objFile.Name, 4), ".doc", vbTextCompare) = 0 Then 
     Set objWordDoc = GetWordDocument(objFile.Path) 
     ' objWordDoc.Unprotect Password:="testcode" ' Need to check if it has Password? 
     ProcessDocument objWordDoc 
     objWordDoc.Close 0, 1 
     Set objWordDoc = Nothing 
    End If 
    Next 

Exit_Handler: 
    CloseWordApp 
    Exit Sub 

Err_Handler: 
    MsgBox "Error " & Err.Number & ": " & Err.Description 
    Resume Exit_Handler 
    'Resume Next ' or as above 
End Sub 

Sub ProcessDocument(objWordDoc As Document) 
    '{EXCEL PROCESSING HERE}' 
End Sub 

EDIT: Ich habe einige Fehlerbehandlung und ein wenig Refactoring hinzugefügt, obwohl es durchaus ein bisschen mehr Refactoring ist, was getan werden könnte.

Die Dokumente, die Sie öffnen, müssen etwas Besonderes sein.Sie könnten unter Verwendung verschiedene Parameter versuchen, die Dokumente zu öffnen, wie zB:

Set objWordDoc = objWordApp.Documents.Open(_ 
    FileName:=objFile.Path, ReadOnly:=True) 

Unter Umständen müssen Sie Microsoft Word als Referenz hinzuzufügen, und wenn Sie sich dann, dass die Word-Konstanten (wdDoNotSaveChanges usw.) beginnen. Sehen Sie sich die Hilfe zu Documents an. Öffnen und testen Sie verschiedene Parameter.

Verwenden Sie auch die "Set Next Statement" aus dem Kontextmenü während des Debuggens und vielleicht überspringen Sie das erste Dokument und öffnen Sie das zweite Dokument direkt und sehen, ob es Probleme gibt.

EDIT: Ich habe den Code zum Schließen und erneutes Öffnen von Word geändert, wenn Sie den Automatisierungsfehler erhalten, den Sie beschrieben haben. Möglicherweise müssen Sie die Fehlernummern anpassen oder Word bei einem Fehler einfach schließen (wenn Err.Nummer <> 0 Then ...).

Auch hier muss etwas Besonderes an Ihren Dokumenten sein (Makros, Schutz, usw.), weil dieser Code auf den Testfällen funktioniert, die ich ausprobiert habe. Haben Sie versucht, die Dokumente in Word in der gleichen Reihenfolge wie das Skript manuell zu öffnen, Informationen ähnlich Ihrem Prozessskript zu aktualisieren und dann die Dokumente zu schließen, um zu sehen, ob Word etwas seltsam macht?

Schließen der Word.Application wird nichts schaden, aber es wird offensichtlich deutlich langsamer.

Verwandte Themen