5

データをスプレッドシートに入れ、Word からそれぞれのセルにリンクすることで、3 つの異なる Word ドキュメント間で特定の情報 (名前、日付、番号など) を自動的に更新しようとしています。スプレッドシートには、スプレッドシートの一部を内部的に自動更新するマクロが含まれています。

Word ドキュメントのリンクを更新することを除いて、すべて正常に動作しています。Word でリンクを右クリックして [リンクの更新] オプションを選択してリンクを更新しようとすると、スプレッドシートのマクロ警告ダイアログが表示され、マクロを有効にするかどうかを尋ねられます。これは一度だけではなく、更新プロセスに 20 秒ほどかかります (私には異常に長いようです)。したがって、リンクの更新は機能しますが、「マクロのアクティブ化」ボタンを数十回クリックする意思がある場合に限ります。

VBA を使用して Word からドキュメント内のすべてのフィールドを自動更新しようとしましたが、同じ問題が発生し、マクロ ダイアログが 30 分間絶えず表示されます。そのための私のコードは次のとおりです。

Sub UpdateFields()
    ActiveDocument.Fields.Update
End Sub

また、Word ドキュメントをスプレッドシートから直接更新しようとしましたが、Excel が VBA 経由で Word ドキュメントを開こうとすると、プログラムの実行が停止し、次のエラーが表示されるため、どちらも機能しません。

「Excel は、別のアプリケーションが OLE アクションを完了するのを待っています。」

[OK] をクリックして待機しても、数秒後にエラー メッセージが再び表示されるため、問題は解決しません。エラー メッセージを停止するには、Excel プロセスを手動で強制終了するしかありません。

これが私のExcelマクロコードです:

Sub LoopThroughFiles()
    Path = Application.ActiveWorkbook.Path
    Dim WordFile As String
    WordFile = Dir(Path & "\*.doc")
    Do While Len(WordFile) > 0
        Run Update(Path & "\" & WordFile)
        WordFile = Dir
    Loop
End Sub

Function Update(Filepath As String)

    Dim WordDoc As Word.Document
    Set WordApplication = CreateObject("Word.Application")
    Set WordDoc = WordApplication.Documents.Open(Filepath) 'This produces the error

    ActiveDocument.Fields.Update

End Function

フォルダー内のファイルは 3 つのドキュメントとスプレッドシートのみであり、プログラムは問題なくファイルを見つけることに注意してください。

私はオンラインで解決策を検索しましたが、誰かが VBA で行うことはかなり一般的であるように思われるため、実際には何も見つかりませんでした。繰り返しになりますが、私は VBA の経験がほとんどないため、ポイントを完全に見逃している可能性があり、私が気付いていない非常に簡単な解決策があります。

4

1 に答える 1

3

ドキュメントにリンクが含まれているため、サイレントエラーであるエラーが表示されると思います。リンクを更新するために「はい」または「いいえ」と言うのを待っている開いているダイアログがあります。

リンクの自動更新を無効にすることで、このダイアログを非表示にすることができます ( WordApplication.Options.UpdateLinksAtOpen = False)。

Function Update(Filepath As String)
    Dim WordApplication As Word.Application
    Dim WordDoc As Word.Document
    Dim updateLinks As Boolean

    Set WordApplication = CreateObject("Word.Application")
        updateLinks = WordApplication.Options.UpdateLinksAtOpen 'capture the original value
        WordApplication.Options.UpdateLinksAtOpen = False      'temporarily disable

    Set WordDoc = WordApplication.Documents.Open(Filepath)
        WordDoc.Fields.Update
        'MsgBox "Links updated in " & WordDoc.Name
        '## Save and Close the Document
        WordDoc.Save
        WordDoc.Close

    '## reset the previous value and Quit the Word Application
    WordApplication.Options.UpdateLinksAtOpen = updateLinks             '
    WordApplication.Quit

End Function

また、ドキュメントを保存して閉じ、関数内の単語アプリケーションを終了することを忘れないでください。

私はこの他の変更を行いました:

関数では、ActiveDocumentは Excel のオブジェクトではないため、修飾する必要があります。そうしないと、その行でもエラーがスローされます。を参照するのではなく、既に割り当てられている をWordApplication.ActiveDocument参照するだけです。WordDoc

于 2013-08-28T14:56:08.813 に答える