簡體   English   中英

Excel VBA在循環中打開多個Word文件

[英]Excel VBA to Open Multiple Word files in a loop

對於新手問題,我事先表示歉意-我的大多數VBA經驗都來自Excel或Word to Excel。 在這種情況下,我將從Excel轉到Word。 我正在嘗試從某些Word表單中捕獲一些數據並將其存儲在Excel文件中。

現在,我的代碼適用於該文件夾中的第一個文檔,但是此后,它出現了自動化錯誤“服務器引發了異常”(糟糕!)。

這是我的代碼:

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

我注意到,如果我退出應用程序並在循環內設置object = none,則代碼可以正常工作。 但是現在,它在“ objWordApp.documents.Open strFilePath&strCurFileName”行的文件夾中的第二個文件上被炸毀。

我可以循環打開和關閉Word文檔而不必一遍又一遍地創建對象嗎? 當我那樣做的時候真的很慢。


感謝您的幫助-我喜歡您的方式。 不幸的是,我得到了相同的結果。 該程序第二次死於循環,該循環的內容為:

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

我得到的錯誤是:

運行時錯誤-2147417851(80010105)自動化錯誤服務器引發了異常。

我在常規的word文檔(不是我正在處理的文檔)上嘗試了您的代碼,並且工作正常。 我正在運行的文檔具有表單字段和宏-不確定是否有所不同。 我已將Word中的宏安全性設置為“低”和“非常高”,以確保其他宏不會干擾。

我只是想不通為什么它適用於第一個文檔,而不適用於下一個文檔。 我什至克隆了第一個文檔,但沒什么區別。


不過還是沒有運氣。 我唯一可以使用的方法是,如果我每次要打開文件時都完全擦除對象並重新創建它們。

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

我不知道為什么行得通,為什么不行。 如果我必須走這條路線,我可以-看來確實很慢而且效率很低。 這是一個壞主意嗎?

我將Dir更改為FileSystemObject(轉到Tools \\ References並添加Microsoft Scripting Runtime),並且能夠成功打開多個文件。 如果遇到問題,請描述在調試器中看到的錯誤。 另外,如果您需要遞歸到子目錄,則需要對其進行重構。

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

編輯:我添加了一些錯誤處理和一些重構,盡管還有很多重構可以完成。

您要打開的文檔必須有一些特別之處。 您可以嘗試使用不同的參數來打開文檔,例如:

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

您可能需要添加Microsoft Word作為參考,如果這樣做,則開始使用Word常量(wdDoNotSaveChanges等)。 查看有關文檔的幫助。打開並測試不同的參數。

另外,在調試過程中使用上下文菜單中的“設置下一條語句”,並且可以跳過第一個文檔並直接打開第二個文檔,看看是否有問題。

編輯:如果您遇到描述的自動化錯誤,我已更改代碼以關閉並重新打開Word。 您可能必須調整錯誤編號,或僅在出現任何錯誤時關閉Word(如果Err.Number <> 0然后...)。

同樣,您的文檔必須有一些特殊之處(宏,保護等),因為此代碼適用於我嘗試過的測試用例。 您是否嘗試過按照與腳本相同的順序在Word中手動打開文檔,更新與流程腳本類似的信息,然后關閉文檔以查看Word是否有任何奇怪之處?

關閉Word.Application不會造成任何傷害,但是顯然會明顯變慢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM