Top / TIPS / OLEオートメーションで起動した Excel が終了しない

原因は、主に2つあります。

コーディングが間違っている場合

Excel を参照設定すると、

Global Application As New Excel.Application

という変数が、暗黙的に作成されます。( DAO の、DBEngine にあたるもの。)
困ったことに、この変数、コーディングに気をつけないと、すぐに Excel のインスタンスへの参照を格納してしまいます。

たとえば、次のようなコーディング

   Dim objApp As Excel.Application
   Dim objBook As Excel.Workbook
   Set objApp = New Excel.Application
   Set objBook = Workbooks.Add()              ' ※ここに注意!
   objBook.Close
   Set objBook = Nothing
   objApp.Quit
   Set objApp = Nothing

これだけで、VBが終了するまで、Excel は終了しなくなります。

※の部分を、

   Set objBook = objApp.Workbooks.Add()

とするだけで、Excel は終了するようになるはずです。

このように、インスタンスを明示しないで、Excel の関数や、オブジェクトを使ってしまうと、自動的に、 変数 Application に Excel のインスタンスへの参照が格納されてしまいます。

このようなコーディングを見つけるのは、非常にやっかいです。

絶対にこのようなコーディングをしないようにするには、参照設定しないのが一番なのですが、それだと、自動メンバ表示などの便利な機能が使えなくなるので、これもやっかいですね。(^_^;)

Win9x で実行している場合

これは、Microsoft の Web にも載っています。

(1) Win9x (Windows95,98,ME) 上で使用している。 (2) Internet Explorer 4.0 以上をインストールしている。 (3) セルの値の取得、コピー/貼り付け、値の代入などを繰り返す処理を実行している。

(1)〜(3) の条件を満たすとき、終了しなくなります。

次のように、WorkSheet オブジェクトの Cells プロパティをキャッシュすると、回避できるようです。

※ 現象が発生するコーディング

   For i = 1 To 2000
       wk = xlsheet.Cells(i, 1)
   Next

※ 回避したコーディング

   With xlsheet.Cells
        For i = 1 To 2000
            wk = .Item(i, 1).Value
        Next
   End With



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2009-10-25 (日) 23:56:04 (2800d)