Excelが解放されない
                                                         玄関へお回り下さい。
Excel のタスクを正常に終了できない現象       (VB6.0)
   VBからExcelを使用すると誰でも最初に出会う現象で掲示板での質問も絶えません。従って、
ここに今まで判明(私が知った)した現象について書いておきます。

通常の起動・終了処理 
  Dim xlApp  As Excel.Application
  Dim xlBook As Excel.Workbook
  Dim xlSheet As Excel.Worksheet

  ' 変数にオブジェクトの参照を代入します。Add メソッドを使って
  ' 新規 workbookとworksheet オブジェクトを作成します。
  Set xlApp = CreateObject("Excel.Application")
  Set xlBook = xlApp.Workbooks.Add
  Set xlSheet = xlBook.Worksheets(1)
        
      作業内容
        
  Set xlSheet = Nothing
  xlBook.Close
  Set xlBook = Nothing
  xlApp.Quit
  Set xlApp = Nothing
このような基本的な起動・終了処理をしているにもかかわらずタスクを正常に終了できない
現象について下記に明記します。

基本的な部分については詳しくはヘルプで下記項目を調べて下さい。
  ・ CreateObject 関数
  ・ 変数に対するオブジェクト参照の代入
  ・ オブジェクトへの参照の作成方法
  ・ オブジェクトの参照の高速化

   1.一番多いのがマクロ等で記録したのをそのまま使った等で起きるVBAとVBの操作の違い
  です。
  VBからExcelのプロパティやメソッド・オブジェクト等を操作する場合は、必ずオブジェクト
  を指定します。
誤り 正解
Application.CentimetersToPoints     xlApp.CentimetersToPoints      
ActiveSheet xlBook.ActiveSheet  又は xlSheet のようにシート名を指定するようにして下さい
ActiveCell xlSheet.Activate
xlApp.ActiveCell
Key1:=Range("C2") Key1:=xlSheet.Range("C2")
xlSheet.Range(Cells(1, ・・・略 xlSheet.Range(xlSheet.Cells(1, ・・・略
Selection.ClearContents  xlSheet.Activate
xlApp.Selection.ClearContents 
   
 上記以外にも色々ありますので、自動メンバー表示などのインテリセンス機能を利用して確認
 しながらコードを記入して下さい。
 一度目は残らなくても、続けて実行するとエラーが発生したり、残ったりします。
これだけで現象の90%は改善されるでしょう。

2.セルの値の取得、コピー/貼り付け、値の代入などを繰り返す処理を実行している
  次に多いのがこのような処理かと思います。

これは http://support.microsoft.com/default.aspx?scid=kb;ja;JP414107 に詳しく書いていま
す。([XL2000] オートメーションでセルの値の取得やコピーを繰り返すと応答しない)

この問題は、以下の条件をすべて満たした場合に発生します。
  1. Windows 9x 環境で使用している
  2. Internet Explorer 4.0 以降のバージョンがインストールされている
  3. セルの値の取得、コピー/貼り付け、値の代入などを繰り返す処理を実行している
回避策として
  ・配列を使用するプロシージャに変更する
  ・Windows 9x 以外の環境で使用する
  ・ループする回数を減らす
等が報告されています。
  私の環境で(VB6.0(SP5) Windows98SE Excel2000 IE6.0)で下記を実施したところ残って
  しまいました。
   For i = 1 To 20000
     myText = xlSheet.Cells(i, 1)
   Next i
  これを回避する方法として下記のような方法もあります。
   With xlSheet.Cells
     For i = 1 To 20000
       myText = .Item(i, 1).Value
     Next i
   End With
  又、Range オブジェクトを使用する方法も有効かと思います。
  Dim rs As Range
  For Each rs In xlBook.ActiveSheet.UsedRange
    myText = rs.Value
  Next
   余談ですが、上記の方法は For 〜 Next より高速にアクセスできますし、色々応用できる
   かと思いますので、ヘルプで調べて下さい。

3.Excelのファイルが壊れている場合(下記のような事もありました)
  いろいろ試してみたのですが、 Openしたファイルがおかしかった様です。 excelのシートを
  コピーして新しいファイルに貼り付けて、 新しく作ったファイルで実行してみたところ excel
  のインスタンスは無くなりました。 (投稿No.2215より)

4.下記のようなミスでも発生します。
  Set xlBook = xlApp.Workbooks.Add    このように書くところを
  Set xlBook = Workbooks.Add       このように書くと終了するまで解放されません。
  前にも書きましたが事前バインディング参照すると自動メンバー表示機能が働きますので、
  それを利用するようにしますとタイプミス等が防げます。

5.これだけでは、問題が発生しないが......。
  xlApp.Workbooks.OpenText や xlApp.Cells.Select や xlApp.Range("A1").Select
 らは、これだけの処理では、プロセスが残る事はありませんが、どの Book の
 どの Sheet の Range("A1") かが特定されていない為にそのまま他の処理等を行
 うと、誤動作をしたり、プロセスが残る原因になり兼ねません。
 (当サイトのサンプルでも一部同様に使っておりましたが、誤解をまねくので、
  コードが少し本文とはずれて複雑になりますが、修正する事にしました。)

タスクを正常に終了できない現象が発生したら上記を1番〜順に調べてみて下さい。
それでほとんど問題が解決できるかと思います。上記に該当しない場合は、特殊なケースかと思
われますので、使用環境と詳しい状況とコード等を掲示板に投稿して下さい。 
  




2006/12/05