Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA在循环中打开多个Word文件_Vba_Excel_Ms Word - Fatal编程技术网

Excel VBA在循环中打开多个Word文件

Excel VBA在循环中打开多个Word文件,vba,excel,ms-word,Vba,Excel,Ms Word,对于这个新手问题,我提前表示歉意——我的大部分VBA经验都是在Excel或Word to Excel中。在本例中,我将从Excel转换为Word。我试图从一些Word表单中捕获一些数据,并将其存储在Excel文件中 现在,我的代码适用于文件夹中的第一个文档,但在那之后,它出现了一个自动化错误“服务器抛出了一个异常”(goo!) 这是我的密码: Dim objWordApp As Object strCurFileName = Dir(strFilePath) Set objWordApp =

对于这个新手问题,我提前表示歉意——我的大部分VBA经验都是在Excel或Word to Excel中。在本例中,我将从Excel转换为Word。我试图从一些Word表单中捕获一些数据,并将其存储在Excel文件中

现在,我的代码适用于文件夹中的第一个文档,但在那之后,它出现了一个自动化错误“服务器抛出了一个异常”(goo!)

这是我的密码:

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
我得到的错误是:

运行时错误-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

我不知道为什么这样做有效,为什么不起作用。如果我必须走这条路,我可以——它看起来真的很慢,效率很低。这是个坏主意吗?

我将目录更改为FileSystemObject(转到工具\引用并添加Microsoft脚本运行时),并且能够成功打开多个文件。如果您遇到问题,请描述在调试器中看到的错误。此外,如果需要递归到子目录中,则需要对其进行重构

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等)。查看文档帮助。打开并测试不同的参数

另外,在调试期间使用上下文菜单中的“Set Next Statement”(设置下一个语句),可以跳过第一个文档,直接打开第二个文档,查看是否存在问题

编辑:我已经更改了代码,如果出现您描述的自动化错误,请关闭并重新打开Word。您可能需要调整错误号,或者在出现任何错误时关闭Word(如果错误号为0,则…)

同样,您的文档(宏、保护等)必须有一些特别之处,因为这段代码适用于我尝试过的测试用例。您是否尝试过以与脚本相同的顺序在Word中手动打开文档,更新与流程脚本类似的信息,然后关闭文档以查看Word是否有任何异常行为

关闭这个词。应用程序不会造成任何伤害,但它显然会大大减慢速度。

你说的“爆炸”是什么意思?有错误信息吗?
Set objWordDoc = objWordApp.Documents.Open( _
  FileName:=objFile.Path, ReadOnly:=True)