2 回目のコード実行時に Excel のオートメーションが失敗する


現象


オートメーションを使用して Microsoft Excel を制御するコードの実行中に、以下のいずれかのエラーが発生することがあります。



Microsoft Excel 97 以降のバージョンの Excel では、次のいずれかのエラー メッセージが表示されます。

エラー メッセージ 1
実行時エラー '1004':

'<name of method>' メソッドは失敗しました: '_Global' オブジェクト
エラー メッセージ 2
アプリケーション定義またはオブジェクト定義のエラーです。
Microsoft Excel 95 では、次のいずれかのエラー メッセージが表示されます。

エラー メッセージ 1
実行時エラー '-2147023174':

OLE Automation error
エラー メッセージ 2
実行時エラー '462':

リモート サーバーがないか、使用できる状態ではありません。

原因


Excel オブジェクト変数で修飾せずに Excel のオブジェクト、メソッド、またはプロパティを呼び出すコード行があるため、Visual Basic で Excel への参照が確立されます。Visual Basic では、プログラムを終了するまでこの参照は解放されません。この参照が原因で、コードを 2 回以上実行した場合に、オートメーション コードが失敗します。

解決方法


この問題を解決するには、適切なオブジェクト変数で修飾して、Excel のオブジェクト、メソッド、またはプロパティをそれぞれ呼び出すようにコードを変更します。

状況


この動作は仕様です。

詳細


Microsoft Excel を自動化するには、通常、Excel の Application オブジェクトまたは Workbook オブジェクトを参照するオブジェクト変数を確立します。これにより、Microsoft Excel オブジェクト モデルの Worksheet、Range などのオブジェクトを参照する他のオブジェクト変数を設定できるようになります。Excel のオブジェクト、メソッド、またはプロパティを使用するようにコードを記述する場合は、適切なオブジェクト変数で修飾して呼び出す必要があります。修飾しない場合、Visual Basic によって Excel への独自の参照が確立されます。オートメーション コードを複数回実行しようとすると、この参照が原因で問題が発生することがあります。コード行がオブジェクト変数で始まる場合でも、コード行の途中にある、オブジェクト変数で修飾されていない Excel のオブジェクト、メソッド、またはプロパティへの呼び出しが行われる場合があります。



以下の手順では、この問題の再現方法および修正方法について説明します。

現象の再現手順

  1. Visual Basic で、新しい標準 EXE プロジェクトを作成します。デフォルトで、Form1 が生成されます。

  2. [プロジェクト] メニューで [参照設定] をクリックし、自動化する Excel のバージョンに対応するオブジェクト ライブラリのチェック ボックスをオンにします。
  3. CommandButton コントロールを Form1 に配置します。

  4. Form1 のコード ウィンドウに以下のコード例をコピーします。

          Option Explicit

    Private Sub Command1_Click()
    Dim xlApp As Excel.Application
    Dim xlBook As Excel.Workbook
    Dim xlSheet As Excel.Worksheet
    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Add
    Set xlSheet = xlBook.Worksheets("Sheet1")
    xlSheet.Range(Cells(1, 1), Cells(10, 2)).Value = "Hello"
    xlBook.Saved = True
    Set xlSheet = Nothing
    Set xlBook = Nothing
    xlApp.Quit
    Set xlApp = Nothing
    End Sub
  5. [実行] メニューの [開始] をクリックするか、F5 キーを押してプログラムを開始します。

  6. CommandButton コントロールをクリックします。エラーは発生しません。ただし、Excel への参照が作成され、解放されません。

  7. CommandButton コントロールを再度クリックします。「現象」に記載されているいずれかのエラー メッセージが表示されます。



    : エラー メッセージが表示されるのは、このコードでは、xlSheet オブジェクト変数で修飾せずに呼び出したセルのメソッドを参照しているためです。

  8. プログラムを終了し、以下のコード行を変更します。

    xlSheet.Range(Cells(1,1),Cells(10,2)).Value = "Hello"
    以下のようなコード行に変更します。

    xlSheet.Range(xlSheet.Cells(1,1),xlSheet.Cells(10,2)).Value = "Hello"
  9. プログラムを再度実行します。コードを複数回実行しても、エラー メッセージが表示されないことを確認します。

関連情報


関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。


167223 入手可能な Microsoft Office 97 オートメーション ヘルプ ファイル

189618 [PRB] 限定されないメソッドまたはプロパティを呼び出すとオートメーション エラーが発生する