2009-05-06 12 views
0

初心者の質問については事前にお詫び申し上げます.VBAの経験の大部分はExcelまたはWord to Excelにあります。この場合、私はExcelからWordに行きます。私はいくつかのWordフォームからデータを取り込み、それをExcelファイルに保存しようとしています。 (!グー)Excel VBAでループ内の複数のWordファイルを開く

今、私のコードは、フォルダ内の最初のドキュメントのために動作しますが、その後、それがオートメーションエラーでアップホース「のサーバーが例外を投げた」

ここでは私のコードです:

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 

私は、アプリケーションを終了し、ループ内でオブジェクト=何も設定しないとコードが正常に動作することに気付きました。しかし、今のように、それは "objWordApp.documents.Open strFilePath & strCurFileName"行のフォルダ内の2番目のファイルに爆発します。

オブジェクトを何度も作成しなくても、ループでWord文書を開いたり閉じたりできますか?私がそうすると、それは本当に遅いです。


私はあなたのやり方がはるかに良いです。残念ながら、私は同じ結果を得ます。

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

を私が手にエラーがある:

ファイル名を指定して実行時エラー-2147417851(80010105) オートメーションエラー サーバが投げたプログラムは、読み込みライン上のループを介して第2の時間を死にます例外。

私はあなたのコードを(私が処理しているものではなく)普通のワード文書で試してみましたが、うまくいきました。私が実行しているドキュメントには、フォームフィールドとマクロがあります。違いがあるかどうかはわかりません。 Wordのマクロセキュリティを「低」と「非常に高い」の両方に設定して、他のマクロが干渉しないようにしました。

私はそれがなぜ最初のdocのために働くのか理解できないのです。私は最初の文書をクローン化しましたが、違いはありませんでした。


まだ運がありませんが、私が働くことができる唯一のことは、オブジェクトを完全に拭き取り、ファイルを開くたびにそれらを再作成することです。

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 

それが動作する理由は、私はわからないんだけど、なぜそれが他の方法では動作しません。私がこの道を進む必要があるならば、私はできます - それはちょうど本当に遅く、非効率的です。これは悪い考えですか?

+0

「爆弾」とはどういう意味ですか?エラーメッセージ? – shahkalpesh

答えて

1

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 

編集:私はいくつかのエラー処理と少しリファクタリングを追加しましたが、実行できるリファクタリングはかなりあります。

開こうとしている書類には特別なものが必要です。あなたはその後、Wordの定数(wdDoNotSaveChanges、など)を使用して開始しないと場合

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

あなたがリファレンスとしてMicrosoft Wordを追加する必要があり、そして:あなたのような、文書を開くための異なるパラメータを使用してみてください。 Documents.Openのヘルプをチェックし、さまざまなパラメータをテストします。

また、デバッグ中にコンテキストメニューから「次の文の設定」を使用し、多分最初の文書をスキップして、直接、第2の文書を開いて、問題があるかどうかを確認します。

EDIT:あなたが説明したオートメーションエラーを取得する場合、私はWordを閉じて再度開くために、コードを変更しました。エラー番号を調整するか、エラーが発生したときにWordを終了する必要があります(Err.Number <> 0 Then ...)。このコードは、私が試してみましたテストケースで動作しますので、

ここでも、何かがあなたの文書(マクロ、保護、など)に関する特別でなければなりません。手動でWordで文書を開くときに、スクリプトと同じ順序で情報を更新し、プロセススクリプトに似た情報を更新してから、文書を閉じてWordに異常がないかどうかを確認しましたか?

Word.Applicationを閉じると何も問題はありませんが、明らかに大幅に遅くなります。

関連する問題