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

現象

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

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

エラー メッセージ 1

注

実行時エラー '1004':
オブジェクト '_Global' のメソッド '<name of method>' が失敗しました

エラー メッセージ 2

注

アプリケーション定義またはオブジェクト定義のエラー

Microsoft Excel 95 では、次のいずれかのエラー メッセージが表示されます。

エラー メッセージ 1

注

実行時エラー '-2147023174'
OLE オートメーションのエラー

エラー メッセージ 2

注

実行時エラー '462':
リモート サーバー マシンが存在しないか、使用できません。

原因

Visual Basic では、Excel オブジェクト変数で要素を修飾せずに Excel オブジェクト、メソッド、またはプロパティを呼び出すコード行のために Excel への参照が確立されています。 Visual Basic は、プログラムを終了するまでこの参照を解放しません。 コードが複数回実行されると、この誤った参照がオートメーション コードに干渉します。

解決策

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

状態

この動作は仕様です。

追加情報

Microsoft Excel を自動化するには、通常は Excel アプリケーション オブジェクトまたは Excel ブック オブジェクトを参照するオブジェクト変数を設定します。 その後、ワークシート、Range、または Microsoft Excel オブジェクト モデル内の他のオブジェクトを参照するように他のオブジェクト変数を設定できます。 Excel のオブジェクト、メソッド、またはプロパティを使用するコードを記述するときは、呼び出しの前に必ず適切なオブジェクト変数を指定する必要があります。 これを行わない場合、Visual Basic では Excel への独自の参照が確立されます。 この参照は、オートメーション コードを複数回実行しようとすると問題を引き起こす可能性があります。 コード行が object 変数で始まっている場合でも、先頭に object 変数がないコード行の途中で Excel オブジェクト、メソッド、またはプロパティを呼び出すことができることに注意してください。

次の手順は、この問題の再現方法と問題の修正方法を示しています。

動作を再現する手順

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

  2. [プロジェクト] メニューの [参照設定] をクリックし、自動化するバージョンの Excel のオブジェクト ライブラリをチェックします。

  3. Form1 に CommandButton コントロールを配置します。

  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. プログラムを再実行します。 エラー メッセージを受け取らなくても、コードを複数回実行できます。

参考資料

189618 オートメーションを使用してWordを制御する Visual Basic コードを実行すると、"実行時エラー '-2147023174' (800706ba) エラー メッセージまたは "実行時エラー '462'" が表示される場合があります