tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルEXCELのプロセスの解放について
記事No15265
投稿日: 2011/07/26(Tue) 21:37
投稿者たぁ
過去ログにも同様の質問や回答があったので、とても聞きづらいのですが、
同じようにやっているつもりなのに上手くいかず、問題点やご指摘頂ける
ことがあればと思い、投稿させてもらいました。
実際のプログラムはSHEET2に貼り付けたデータを元にSHEET1にグラフを
貼り付けるのが目的だったのですが、どの部分をコメント化しても
プロセスが残ってしまうので、以下のソースまでロジックを削り
検証してみました。
ただ、ファイルを開いて印刷して、閉じているだけなのですが、プロセスが
残ります。VB歴は長いのですが、知識は浅いです。
何か手がかりになることがあれば教えて下さい。

環境:winXP、VB6.0SP6、EXCEL2003
-----以下、ソース------------------------
    Dim xlApp As Excel.Application
    Dim xlBook As Excel.Workbook
    Dim xlSheet As Excel.Worksheet
    
    
    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Open(App.Path & "\A.xls")
    
    xlBook.Worksheets(1).PrintOut
    
    xlBook.Close
    xlApp.Quit
    Set xlBook = Nothing
    Set xlApp = Nothing

[ツリー表示へ]
タイトルRe: EXCELのプロセスの解放について
記事No15266
投稿日: 2011/07/27(Wed) 07:42
投稿者shu
>     Set xlBook = xlApp.Workbooks.Open(App.Path & "\A.xls")
Set WkBooks = xlApp.Workbooks
でいったん切ったほうがいいです。そして最後にNothing

    
>     xlBook.Worksheets(1).PrintOut
Set Shts = xlBook.Worksheets
Set Sht = Shts(1)
でいったん切ったほうがいいです。そして最後にNothing

    
最近6は触ってないのですが多分こうだと思う。

[ツリー表示へ]
タイトルRe^2: EXCELのプロセスの解放について
記事No15268
投稿日: 2011/07/27(Wed) 09:00
投稿者たぁ
早速のご指摘ありがとうございます。
ご指摘に従って以下のように修正しましたが、「型が一致しません」の
エラーがでてしまいました。
xlSheetsの定義やセットしている値に問題ありますでしょうか?
自己解決できなくてすみません。

<追記>
エラーの部分を諦めてコメント化し、「Set xlSheet = xlBook.Worksheets(1)」として
みましたが、やっぱりプロセスは残ってしまいました。


    Dim xlApp As Excel.Application
    Dim xlBooks As Excel.Workbooks
    Dim xlBook As Excel.Workbook
    Dim xlSheets As Excel.Worksheets
    Dim xlSheet As Excel.Worksheet
    
    
    Set xlApp = CreateObject("Excel.Application")
    Set xlBooks = xlApp.Workbooks
    Set xlBook = xlBooks.Open(App.Path & "\R.xls")
    Set xlSheets = xlBook.Worksheets      ←ここでエラー
    Set xlSheet = xlSheets(1)
    
    xlSheet.PrintOut
    
    Set xlSheet = Nothing
    Set xlSheets = Nothing
    xlBook.Close
    Set xlBook = Nothing
    Set xlBooks = Nothing
    xlApp.Quit
    Set xlApp = Nothing

> Set WkBooks = xlApp.Workbooks
> でいったん切ったほうがいいです。そして最後にNothing

> Set Shts = xlBook.Worksheets
> Set Sht = Shts(1)
> でいったん切ったほうがいいです。そして最後にNothing

[ツリー表示へ]
タイトルRe: EXCELのプロセスの解放について
記事No15269
投稿日: 2011/07/27(Wed) 10:05
投稿者魔界の仮面弁士
> プロセスが残ってしまうので、以下のソースまでロジックを削り
> 検証してみました。

VB6 からの呼び出しコードとしては、特に問題が無いように見えます。
少なくとも当方環境では、正常に解放されました。


以下、確認事項として。


・Excel をタスクから強制終了した事がある場合、もしくは、Excel 起動中に
 オブジェクトを解放させることなく VB コードの実行を中止したことがある場合には、
 念のため、一度 OS を再起動してから再度検証してみてください。
 不安定な状態での検証は誤作動の元です。

・Excel からのユーザー応答メッセージなどを取りこぼさないようにするために、
 少なくともデバッグ段階では、Visible = True にしておくことをお奨めします。

・複数の Excel バージョンが共存していませんか?
 複数バージョンが混在すると、正しく呼び出せないことがあります。

・開発環境と実行環境で、Excel バージョンは同一ですか?
 Excel のライブラリ互換性は完全ではないため、呼び出す機能によっては
 バージョン判定およびバージョン依存の分岐処理が必要になることがあります。

・開いている A.xls 自体に問題はありませんか? 新規のブックで再検証してみてください。
 文書ファイル内のマクロに問題があって、それらが無駄な参照カウントを増加させる場合や、
 xls 内部の軽微なファイル破損が問題を引き起こしていたという状況を経験しています。

・Excel アドインやスタートアップマクロなどがある場合は、それらを外してみてください。
 文書ファイル感染型のマクロウィルスが問題となったケースもあるようです。

[ツリー表示へ]
タイトルRe^2: EXCELのプロセスの解放について
記事No15271
投稿日: 2011/07/27(Wed) 11:25
投稿者たぁ
ご指摘ありがとうございます。いつもいろいろ参考にさせてもらっています。
結果から言うと、上手く解放されません。
プロセスを指定して削除するプログラムでも作った方がいいのでしょうか?

> VB6 からの呼び出しコードとしては、特に問題が無いように見えます。
> 少なくとも当方環境では、正常に解放されました。
→ここまで削れば正常に解放されるのですが・・・。
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = True
    xlApp.Quit
    Set xlApp = Nothing

> ・Excel をタスクから強制終了した事がある場合は、一度 OS を再起動してから
>  再度検証してみてください。不安定な状態での検証は誤作動の元です。
>
→2度ほど再起動と実行を繰り返してみましたが、現象は同じでした。
  VBのファイルも新規プロジェクトで作りなおしたりして試してみましたが、ダメでした。

> ・Excel からのユーザー応答メッセージなどを取りこぼさないようにするために、
>  少なくともデバッグ段階では、Visible = True にしておくことをお奨めします。
→変更してみましたが、特にメッセージなどは出ていませんでした。
 xlApp.Quitをコメント化して、手動でEXCELを閉じた場合は、当然ながら解放されました。

> ・複数の Excel バージョンが共存していませんか?
>  複数バージョンが混在すると、正しく呼び出せないことがあります。
→開発を行っているPCが人から引き継いだものなので、実際のところは分かりませんが、
 Program Filesの中にOffice11とOffice12のフォルダがあります。Office12の中は10個
 程度のファイルのみで動作しそうにないですが、OFFICE2007のインストールの形跡が
 見受けられます。

> ・開発環境と実行環境で、Excel バージョンは同一ですか?
>  Excel のライブラリ互換性は完全ではないため、呼び出す機能によっては
>  バージョン判定およびバージョン依存の分岐処理が必要になることがあります。
→まだ実行環境が手元にありませんが、実行環境ではEXCEL2010になりそうなので、
 そちらでは別途検証が必要かと思っています。

> ・開いている A.xls 自体に問題はありませんか? 新規のブックで再検証して
>   みてください。
>  文書ファイル内のマクロに問題があって、それらが無駄な参照カウントを増加
>   させる場合や、xls 内部の軽微なファイル破損が問題を引き起こしていたという
>   状況を経験しています。
→その可能性も考え、新規で作成したのもを使用しています。
 A1セルに「1」を入力したのみのファイルです。

> ・Excel アドインやスタートアップマクロなどがある場合は、それらを外してみて
>   ください。
>  文書ファイル感染型のマクロウィルスが問題となったケースもあるようです。
→特に該当しませんでした。

[ツリー表示へ]
タイトルRe^3: EXCELのプロセスの解放について
記事No15273
投稿日: 2011/07/27(Wed) 13:26
投稿者魔界の仮面弁士
> プロセスを指定して削除するプログラムでも作った方がいいのでしょうか?

印刷処理を VBA 化して、VB を介さずに、そのマクロ入りブックを開いてみてください。
VBA から PrintOut を実行した場合に、Excel 終了後にプロセスは残りますか?

残るのであれば、環境側に問題があるのかも知れません。

残らないのであれば、印刷部分だけを VBA に外出しにしておき、
VB からそのプロシージャを Excel4Macro あるいは Run メソッドで
呼び出すことで、問題点を軽減できるかもしれません。


> →ここまで削れば正常に解放されるのですが・・・。
>     Set xlApp = CreateObject("Excel.Application")
>     xlApp.Visible = True
>     xlApp.Quit
>     Set xlApp = Nothing

上記の場合、元のコードと比較してみると、

(1) Application の Workbooks プロパティ取得
(2) Workbooks の Open / Add メソッド実行
(3) Workbook の Worksheets / Sheets プロパティ取得
(4) Sheets の 既定プロパティ取得
(5) Worksheet の PrintOut メソッド実行

が削られている事になりますが、(5) だけではなく、
それどころか (1) までも削らねばならなかったのでしょうか?

だとしたら、そもそもの実行環境に問題を抱えている可能性が高そうです。

[ツリー表示へ]
タイトルRe^4: EXCELのプロセスの解放について
記事No15274
投稿日: 2011/07/27(Wed) 14:06
投稿者たぁ
度々ありがとうございます。

> > →ここまで削れば正常に解放されるのですが・・・。
> >     Set xlApp = CreateObject("Excel.Application")
> >     xlApp.Visible = True
> >     xlApp.Quit
> >     Set xlApp = Nothing
>
> 上記の場合、元のコードと比較してみると、
>
> (1) Application の Workbooks プロパティ取得
> (2) Workbooks の Open / Add メソッド実行
> (3) Workbook の Worksheets / Sheets プロパティ取得
> (4) Sheets の 既定プロパティ取得
> (5) Worksheet の PrintOut メソッド実行
>
> が削られている事になりますが、(5) だけではなく、
> それどころか (1) までも削らねばならなかったのでしょうか?
>
> だとしたら、そもそもの実行環境に問題を抱えている可能性が高そうです。
→すみません、(1)に関しては削らなくても大丈夫でした。
 (2)の処理を入れると、プロセスが残ってしまうようです。
 印刷処理の有無に関係なくプロセスが残ってしまいますが、印刷処理のVBA化も
 試してみた方がいいですか?

    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = True
    '↓↓↓↓このロジックはコメント化しなくても大丈夫でした。
    Set xlBooks = xlApp.Workbooks
    Set xlBooks = Nothing
    '↑↑↑↑----------------------------------------------
    xlApp.Quit
    Set xlApp = Nothing

[ツリー表示へ]
タイトルRe^5: EXCELのプロセスの解放について
記事No15275
投稿日: 2011/07/27(Wed) 16:16
投稿者魔界の仮面弁士
>  (2)の処理を入れると、プロセスが残ってしまうようです。
Set xlBook = xlBooks.Add()
xlBook.Saved = True
xlBook.Close
Set xlBook = Nothing

のように、Workbooks.Add で空のブックを作成した場合も残りますか?
新規ブック生成時にも残るなら、アドインが読み込まれていないかを確認してみてください。

一方、特定のファイルを Open もしくは Add したときにのみ発生するようであれば、
その文書ファイル側の問題という可能性もありますが…この場合の切り分けには、
同ファイルを異なる環境で実行してみる必要があるかも。


>  印刷処理の有無に関係なくプロセスが残ってしまいますが、印刷処理のVBA化も
>  試してみた方がいいですか?
問題箇所は印刷部では無いようですが、仮に一連の処理を VBA で行ってみて、
その場合にはプロセスが残らないであれば、VB からのオートメーションは中止し、
それらを VBA で実行できるように作り替えていくことも検討してみては如何でしょう。

[ツリー表示へ]
タイトルRe^6: EXCELのプロセスの解放について
記事No15276
投稿日: 2011/07/27(Wed) 18:02
投稿者たぁ
回答ありがとうございます。

> >  (2)の処理を入れると、プロセスが残ってしまうようです。
> Set xlBook = xlBooks.Add()
> xlBook.Saved = True
> xlBook.Close
> Set xlBook = Nothing
>
> のように、Workbooks.Add で空のブックを作成した場合も残りますか?
> 新規ブック生成時にも残るなら、アドインが読み込まれていないかを確認してみて
> ください。
→新規ブック生成時でも残ってしまいました。
 アドインの確認はアドインマネージャですればいいですか?
 アドインマネージャで選択されているアドインは以下のとおりです。
 ・Component Services Add-In for VB 5.0/6.0
 ・Microsoft Visio UML Visual Basic Addin
 ・MouseWheel Fix
 ・Visual Component Maneager 6.0
 ・ソースコード管理


>
> 一方、特定のファイルを Open もしくは Add したときにのみ発生するようであれば、
> その文書ファイル側の問題という可能性もありますが…この場合の切り分けには、
> 同ファイルを異なる環境で実行してみる必要があるかも。
→複数の環境はすぐには揃えられそうにないので、実行環境が揃った段階で試して
 みようと思います。

> 問題箇所は印刷部では無いようですが、仮に一連の処理を VBA で行ってみて、
> その場合にはプロセスが残らないであれば、VB からのオートメーションは中止し、
> それらを VBA で実行できるように作り替えていくことも検討してみては如何でしょう。
→別のアプリから実行するのにEXEファイルである必要がありますので、出来るだけ
 VBで作りたいと思っています。もしダメなら、VBAを実行するEXEファイルを作るなどして
 対応はしようと思います。

[ツリー表示へ]
タイトルRe^7: EXCELのプロセスの解放について
記事No15279
投稿日: 2011/07/28(Thu) 10:36
投稿者魔界の仮面弁士
>  アドインマネージャで選択されているアドインは以下のとおりです。
それは Excel のアドインでは無く、VB6 のアドインではありませんか?
VB6 側のアドインの多くは Excel のインスタンスを掴むことはないので、
今回は特に気にしなくても良いと思います。


今回話題にしている“Excel のアドイン”には、
 「Excel アドイン」
 「スマートタグ」
 「COM アドイン」
 「オートメーション アドイン」
 「XML 拡張パック」
などがあります。
*.xla は「Excel アドイン」で、COM アドイン等は DLL タイプです。


> 環境:winXP、VB6.0SP6、EXCEL2003
Excel 2003 以下でのアドインの登録解除については、下記を参考に
してみてください。アドインの種類によって設定箇所が異なります。
(Excel 2007/2010 では、オプション画面の[アドイン]タブで一括管理されます)

http://support.microsoft.com/kb/291392/ja
http://office.microsoft.com/ja-jp/excel-help/HP005203732.aspx
http://office.microsoft.com/ja-jp/excel-help/HP001049394.aspx



各アドインがロードされない状態にしてから運用してみて、それで問題が
解消されるようであれば、そこから少しずつアドインを戻していって
問題点を突き止めていくという流れです。


それ以外の外部要因としては…セキュリティソフトウェアの類でしょうか。
仮にそれらが Running Object Table 等を監視してインスタンスを掴んで
しまうことがあるのだとすれば、内容をスキャンしてから解放するまでに
数秒から数百秒程度の時間を要することもあるのかも…と勝手に想像。
(本当にそんなソフトが存在するのかどうかは知りません)

[ツリー表示へ]
タイトルRe^8: EXCELのプロセスの解放について
記事No15281
投稿日: 2011/07/28(Thu) 17:20
投稿者たぁ
> それは Excel のアドインでは無く、VB6 のアドインではありませんか?
> VB6 側のアドインの多くは Excel のインスタンスを掴むことはないので、
> 今回は特に気にしなくても良いと思います。
→ご指摘の通りです。

> 今回話題にしている“Excel のアドイン”には、
>  「Excel アドイン」
→分析ツールのみでした。

>  「スマートタグ」
>  「COM アドイン」
→「COMアドイン」が選択出来なかったので、ツールバーに追加をしようとしたところ
 ドラッグしても追加されなかったので諦めました。

>  「オートメーション アドイン」
→オートメーションサーバ一覧にはいろいろあったのですが、その中に
 OFFICE ・・・9.0〜11.0の項目がいくつかありました。
 削除方法はレジストリから削除するような説明がありましたので、ちょっと
 手が出せないです。

> > 環境:winXP、VB6.0SP6、EXCEL2003
> Excel 2003 以下でのアドインの登録解除については、下記を参考に
> してみてください。アドインの種類によって設定箇所が異なります。
> (Excel 2007/2010 では、オプション画面の[アドイン]タブで一括管理されます)
>
> http://support.microsoft.com/kb/291392/ja
> http://office.microsoft.com/ja-jp/excel-help/HP005203732.aspx
> http://office.microsoft.com/ja-jp/excel-help/HP001049394.aspx
> 各アドインがロードされない状態にしてから運用してみて、それで問題が
> 解消されるようであれば、そこから少しずつアドインを戻していって
> 問題点を突き止めていくという流れです。
→参考にして、出来る限りやってみようと思います。

環境の問題が一番大きそうですので、別の環境が整ってそちらでも検証してみようと
思います。また、何か状況が変われば報告させていただきます。
VB6.0の内容からかなりずれてしまったにもかかわらず、いろいろ教えて頂いて
ありがとうございました。

[ツリー表示へ]
タイトルRe^9: EXCELのプロセスの解放について
記事No15291
投稿日: 2011/08/05(Fri) 13:22
投稿者たぁ
その後、少し話が変わりまして、開発ツールがVB6.0からVB2008に変更になりました。
VB2008で開発し、解放の処理も追加しましたが、開発環境ではEXCELのプロセスは
残ってしまいました。

本日、EXCEL2010が入荷されたので、実行環境にインストール後、VBで作成した
EXEを実行してみるとプロセスは残らずに正常終了しました。
やはり開発環境に何かしらの問題があるようです。
いろいろ回答して頂いてありがとうございました。

<追伸>
開発環境の参照設定ではEXCEL2003のOBJECTを参照するようにしていて、作成した
EXEをそのままEXCEL2010のみインストールされた実行環境にコピーしていますが、
実行環境にVBをインストールして、参照設定でEXCEL2010のOBJECTを参照するように
変更した方がいいでしょうか?
出力するファイルの保存形式が1997-2003形式なのと、とりあえず、プログラムが
動くので、このままの状態にしようとは思っているのですが・・・。

[ツリー表示へ]