2009-04-01 97 views
9

VB/VBAのエキスパートが私を助けてくれることを願っています。 ユーザーがWord 2003で文書を開き、Normal.dot AutoOpenマクロ内で現在の文書を確認し、Webページ上のリンクをクリックして文書を開いた場合は、他の特定のアプリケーション固有の文書基準は、(我々は、ユーザーがアクセス権を持っていると仮定することができ、共有ドライブ上にある)ソースドキュメントをストリーミング「コピー」を閉じて、開きます。VBAマクロでWord文書を開く/アクティブ化する

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ドキュメントに設定されているように見えます(ドキュメントコレクションの管理方法はよくわからず、Wordで次に決定するものはActiveDocumentです)。現在のActiveDocumentをプログラム的に閉じる場合)

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

私はこれについて多くの文書を見つけることができませんでしたので、事前の感想と洞察力に感謝します!

Document(origDoc).Activate 

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

+0

おそらく、コードのActiveDocumentとしてドキュメントのストリーミングコピーを処理していると思われます。そのドキュメントオブジェクトをコードの先頭にある変数に割り当て、残りのコードで変数を使用するほうがずっと良いでしょう。他の人が指摘しているように、2行目のコードで間違ったバージョンのドキュメントを閉じる可能性があります。また、元のドキュメントオブジェクトを開くときに変数に割り当てることも賢明です。 – robartsd

答えて

1

あなたはここでエラーを持っています。

はい、アクティブなドキュメントをアクティブにすることができます。その後は何も起こりません。

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

+0

オタクを見つけてくれてありがとう、残念なことにそれは実際のコードではなく私のポストでしかなかった。開いているドキュメントをアクティブにすることが許可されている場合、どうすれば.Activateコールで4160エラーが発生しますか? – echoesofspring

+0

origDocには正確に何が入っていますか? – GSerg

1

非常に信頼性が低いため、絶対に必要でない限り、先にActiveDocumentオブジェクトを使用しないでください。遭遇することができ、さまざまな問題があることに注意してください

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

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

私は明らかにここに何かを紛失しています。あなたは 'ActiveDocument'を使わないと言っていますが、コードサンプルでそれを使用していますか? – Sabuncu

-1

:好ましいアプローチはこのことでしょう

  1. あなたが一度それを 閉じた後に再オープンした文書にしたい場合は... ..Word/Windowsのは、NOT 「リリース」ファイル名をして、あなたは「 一時コピーを作成」「ファイル忙しい」というメッセージ、またはメッセージをおよそ得ます。 この問題に対処するには、作成/保存の精巧なシステムを開発しなければなりませんでした。 Wordアプリケーションで開く/操作する他のドキュメントの複数のバージョンを整理する Officeのこの設計上の瑕疵のためOpen/Close/Save方法。あなたはdocオブジェクトがまだ存在していること を保証していない場合

  2. は 重大なエラーを引き起こす可能性があり、ドキュメントオブジェクトを参照 .Open方法

  3. (上記の名前DOC)とFalseに設定ReadOnlyRecommendedプロパティを使用しますあなたがそれを試して操作する前に。いつも覚えておいてください。 Wordは「オープンな」アプリケーションプラットフォームです。ユーザーは、 を数えていないものを最後のミリ秒程度で実行できます。このアドバイスは、 がWordで操作したい他のオブジェクトまたはプロパティに対しても適用されます。 なし

  4. あなたはDocumentsコレクション(またはその他)を操作する場合は、文書またはその他のオブジェクトがコレクション内にそれを削除するか、移動する前に、まだそこと 有効であることを保証することがあり
    は「スタックオーバーフロー」を取得しますエラー。とりあえず、 コレクションを閉じる/削除する場合は、.item(1)で始まります。 は、コレクション内のアイテムを最後のアイテムから削除する必要があります。 .add/.remove/.closeアイテムを削除するときは、コレクションIDおよびポインタが変更されることを覚えておいてください。 を覚えておいてください。

4

簡単な答えははいです。コードを使用して文書を開くと、その文書をアクティブ文書にして、次の行で閉じて、次にアクティブにしようとすると、文書が開いていないために失敗します。 VBAは一般的にこのように動作するようです。

ActiveDocumentに注意することが重要です。なぜなら、コードやその他のアクションによってドキュメントが「アクティブ」になるのは自明ではないからです(私は証拠はありませんが、オートセーブでさえ可能かもしれません)。ドキュメントコレクションを介してドキュメントを参照したほうがよい場合は間違いありませんが、ドキュメントが開いていなくてもエラーが発生する可能性があります。また、ドキュメントを確実に確認するためにコレクションを反復処理する必要があります。実際には、開いている。私はVBAを活用してこれに多くを取り入れ、Word VBAはその点で同じように機能するようです。

また、VBAはアプリケーションオブジェクトを解放するほど薄いです。注意しないと、コード内で閉じるか終了するかにかかわらず、タスクマネージャで表示可能な複数のWINWORDプロセスが終了します。これを回避するために見つけたコードは、タスクマネージャーでEND PROCESSを選択するプロセスをシミュレートすることになります。それは動作しますが、より良い解決策が必要です。

+0

VBA?フレキー?なぜ私はそのような告発を聞いたことがない! – franklin

関連する問題