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のプロパティやメソッド・オブジェクト等を操作する場合は、必ずオブジェクト を指定します。
しながらコードを記入して下さい。 一度目は残らなくても、続けて実行するとエラーが発生したり、残ったりします。 これだけで現象の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