現象
Automation を使用して Microsoft Wordを制御する Microsoft Visual Basic コードを実行すると、次のいずれかのエラー メッセージ
が表示されることがあります。
エラー メッセージ 1
実行時エラー '-2147023174' (800706ba)
オートメーション エラー
エラー メッセージ 2
実行時エラー '462': リモート サーバー コンピューターが存在しないか、使用できません
原因
Visual Basic では、Word オブジェクト変数で修飾せずに、Word オブジェクト、メソッド、またはプロパティを呼び出すコード行が原因で、Wordへの参照が確立されました。 Visual Basic では、プログラムを終了するまでこの参照はリリースされません。 この誤った参照は、コードが複数回実行されるときにオートメーション コードに干渉します。
解決方法
Word オブジェクト、メソッド、またはプロパティの各呼び出しが適切なオブジェクト変数で修飾されるようにコードを変更します。
状態
この動作は仕様です。
詳細情報
Wordを自動化するには、通常、Word Application オブジェクトまたは Document オブジェクトを参照するオブジェクト変数を確立します。 その後、他のオブジェクト変数を設定して、Word オブジェクト モデルの Selection、Range、またはその他のオブジェクトを参照できます。 Word オブジェクト、メソッド、またはプロパティを使用するコードを記述する場合は、常に呼び出しの前に適切なオブジェクト変数を指定する必要があります。 そうしない場合、Visual Basic では非表示のグローバル変数参照が使用され、現在実行中のインスタンスに設定されます。 Wordがシャットダウンされている場合、または宣言されたオブジェクト変数が解放された場合、非表示のグローバル変数は無効な (破棄された) オブジェクトを参照するようになりました。 オートメーション コードを再度実行すると、この非表示オブジェクト変数の呼び出しは前述のエラーで失敗します。
次の手順では、この問題を再現する方法と修正方法を示します。
現象の再現手順
-
Visual Basic で新しい Standard EXE プロジェクトを開始します。 Form1 は既定で作成されます。
-
[プロジェクト] メニューの [参照] をクリックし、次のいずれかのオプションをクリックします。
-
Office Word 2007 の場合は、[Microsoft Word 12.0 オブジェクト ライブラリ] をクリックします
-
Word 2003 の場合は、[Microsoft Word 11.0 オブジェクト ライブラリ] をクリックします
-
Word 2003 の場合は、[Microsoft Word 10.0 オブジェクト ライブラリ] をクリックします
-
Word 2000 の場合は、[Microsoft Word 9.0 オブジェクト ライブラリ] をクリックします。
-
Word 97 の場合は、[Microsoft Word 8.0 オブジェクト ライブラリ] をクリックします。
-
-
Form1 に CommandButton を配置します。
-
次のコードを Form1 のコード ウィンドウにコピーします。
Option Explicit Private Sub Command1_Click() Dim oWord As Word.Application Dim oDoc As Word.Document Dim oRange as Word.Range Set oWord = CreateObject("Word.Application") With oWord .Visible = True .Activate .WindowState = wdWindowStateNormal End With Set oDoc = oWord.Documents.Add MsgBox "Document open", vbMsgBoxSetForeground With oDoc .PageSetup.LeftMargin = InchesToPoints(1.25) End With ' This example inserts text at the end of section one. Set oRange = ActiveDocument.Sections(1).Range With oRange .MoveEnd Unit:=wdCharacter, Count:= -1 .Collapse Direction:=wdCollapseEnd .InsertParagraphAfter .InsertAfter "End of section." End With With oDoc .Saved = True End With Set oRange = Nothing Set oDoc = Nothing oWord.Quit Set oWord = Nothing End Sub
-
[ 実行 ] メニューの [ スタート ] をクリックするか、F5 キーを押してプログラムを開始します。
-
CommandButton をクリックします。 エラーは発生しません。 ただし、Wordへの参照は作成されており、リリースされていません。
-
CommandButton をもう一度クリックし、前に説明したエラーが表示されることに注意してください。
メモ このエラーは、コードが oWord オブジェクト変数で呼び出しの前に存在せずに InchesToPoints メソッドを参照しているために発生します。 -
プロジェクトを停止し、次の行を変更します。
.PageSetup.LeftMargin = InchesToPoints(1.25)
-宛先-
.PageSetup.LeftMargin = oWord.InchesToPoints(1.25)
-
プログラムをもう一度実行します。 次に、CommandButton をクリックします。 エラーは発生しません。
-
もう一度 CommandButton をクリックすると、エラーが表示されることに注意してください。
メモ このエラーは、oWord オブジェクト変数を使用して呼び出しの前に置かなくても、コードが ActiveDocument セクション 1 の Range オブジェクトを参照しているために発生します。 -
プロジェクトを停止し、次の行を変更します。
Set oRange = ActiveDocument.Sections(1).Range
-宛先-
Set oRange = oWord.ActiveDocument.Sections(1).Range
-
プログラムをもう一度実行します。 エラーなしでコードを複数回実行できることに注意してください。
Wordを自動化する Visual Basic プロジェクトをビルドするときに、プロジェクトに Microsoft Word オブジェクト ライブラリへの参照がある場合は、Word オブジェクト モデルのオブジェクト、メソッド、プロパティのサンプル コードをWordヘルプ ファイルから入手できます。 カーソルがコード内のキーワードの上にある場合は、F1 キーを押すと、該当するヘルプ テキストが表示されます。
ヘルプ トピックのサンプル コードは、Microsoft Word Visual Basic for Applications コードです。 Visual Basic コードで必要なオブジェクト参照は表示されません。 必要に応じて修飾子を追加する必要があります。
関連情報
詳細については、Microsoft サポート技術情報の次の記事を参照してください。
178510 PRB: オブジェクト '_Global'Failed の Excel Automation メソッド
Office アプリケーションの自動化の詳細については、以下の記事番号をクリックして、Microsoft サポート技術情報の記事を参照してください。