web-dev-qa-db-ja.com

VBAマクロでWord文書を開く/アクティブ化する

VB/VBAのエキスパートが助けてくれることを願っています。次の点を考慮してください。ユーザーがWord2003でドキュメントを開き、Normal.dot AutoOpenマクロ内で、現在のドキュメントを確認し、Webページ上のリンクをクリックして開いているかどうかを確認します。特定の他のアプリケーション固有の基準、ストリーミングされた「コピー」を閉じてソースドキュメントを開きます(ユーザーがアクセスできると想定できる共有ドライブにあります)。

Documents.Open origDoc
Documents(ActiveDocument.FullName).Close SaveChanges:=wdDoNotSaveChanges
Documents(origDoc).Activate

With ActiveDocument
    ''# Do work
End With

元のドキュメントがActivateであることを確認するには、ActiveDocumentを呼び出す必要があると思いましたが、.Activate呼び出しで4160 '不正なファイル名'エラーが発生します。 .Activateの呼び出しをコメントアウトすると、他のドキュメントが既に開かれている場合でも、ActiveDocumentがorigDocドキュメントに設定されているように見えます(ドキュメントコレクションの管理方法がよくわかりません)。 、および現在のActiveDocumentをプログラムで閉じた場合、Wordが次のActiveDocumentを決定する方法

それで、ドキュメントで.Openを呼び出すと、ドキュメントは明示的にActiveDocumentに設定されますか?また、すでにアクティブなドキュメントで.Activateを呼び出すとエラーが発生しますか?

私はこれに関する多くのドキュメントを実際に見つけることができなかったので、提案や洞察を事前に感謝します!

10
echoesofspring

簡単な答えはイエスです。コードを使用してドキュメントを開くと、そのドキュメントがアクティブなドキュメントになり、次の行で閉じて次の行でアクティブ化しようとしますが、ドキュメントが開いていないために失敗します。 VBAは一般的にこのように機能するようです。

ActiveDocumentに注意することは重要です。なぜなら、コード内または他の場所で、どのアクションがドキュメントを「アクティブ」にするかが常に自明であるとは限らないからです(証拠はありませんが、自動保存でも可能です)。 Documentsコレクションを介してドキュメントを参照する方がよいことに疑問がある場合は、ドキュメントが開いていない場合にもエラーが発生する可能性があり、ドキュメントが開いていることを確認するためにコレクションを反復処理する必要がある場合があります。実際、開いています。私はExcelVBAでこれによく遭遇しますが、WordVBAはその点で同じように機能しているようです。

また、VBAはアプリケーションオブジェクトのリリースについて不安定です。注意しないと、コード内で閉じるか終了するかに関係なく、タスクマネージャーで表示可能な複数のWINWORDプロセスが発生します。これを回避するために私が見つけたコードは、タスクマネージャーでENDPROCESSを選択するプロセスをシミュレートすることになります。それは機能しますが、より良い解決策があるはずです。

5
akw

発生する可能性のあるさまざまな問題があることに注意してください。

  1. 一度閉じた後でドキュメントを再度開きたい場合.... Word/Windowsはファイル名を「解放」せず、「ファイルビジー」メッセージが表示されます。 '一時的なコピーの作成'に関するメッセージ。この問題に対処するには、Office Open /のこの設計上の欠陥のために、Wordアプリケーションで開いたり操作したりする他のドキュメントの複数のバージョンを作成/保存して整理する精巧なシステムを開発する必要がありました。 Close/Saveメソッド。

  2. _.Open_メソッドでReadOnlyRecommendedプロパティをFalseに設定して使用する

  3. ドキュメントオブジェクト(上記のdocという名前)を参照すると、操作を試みる前にdocオブジェクトがまだ存在することを確認できない場合、重大なエラーが発生する可能性があります。 Wordは「オープンな」アプリケーションプラットフォームであることを常に忘れないでください。ユーザーは、過去1ミリ秒ほどであなたが期待していなかったことを実行できます。このアドバイスは、Wordで操作したい他のオブジェクトやプロパティにも当てはまります。

  4. ドキュメントまたはその他のオブジェクトがまだ存在し、コレクション内で削除または移動する前に有効であることを確認せずに、ドキュメントコレクション(またはその他)を操作する場合は、
    get 'stack overflow'エラー。特に、.item(1)で始まるコレクション内のオブジェクトを閉じたり削除したりしようとした場合。コレクション内のアイテムを最後のアイテムから削除する必要があります。また、コレクションのIDとポインターは、アイテムを.add/.remove /.closeするたびに変更されることに注意してください。

2
user2649016

ここにエラーがあります:

_Document(origDoc).Activate
_

ドキュメントである必要がありますs

はい、アクティブなドキュメントをアクティブ化できます。その場合は何も起こりません。

はい、開いたドキュメントがアクティブになります。よくわからない場合は、Documents.Open(origDoc).Activateを使用してください。

1
GSerg

ActiveDocumentオブジェクトは非常に信頼性が低いため、どうしても必要な場合を除いて、そもそも使用しないでください。推奨されるアプローチは次のとおりです。

Documents(ActiveDocument.FullName).Close SaveChanges:=wdDoNotSaveChanges

Dim doc as Document
Set doc = Documents.Open(origDoc)        
With doc
    'Do work
End With
1
guillermooo