tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 【解決】Re^2: Excelタスクの消えるタイミング
投稿日: 2009/07/01(Wed) 11:12
投稿者ケイ
> このコードの意図は、
>  「TgtShtName というシートが存在していれば、RetShtName に TgtShtName を代入する」
> でしょうか?

★はい、その通りです、この記述の後ほどに
If Len(RetShtName) = 0 Then 〜 処理 〜 End Ifと言う様な記述があります。

もとはこれらの記述してあるプロシージャー内で既存Excelファイルを開いて
シートのコピーやデータの取得、セルへのデータ書込み等を行い閉じると言う
一連の処理において、処理後「Set xlSheet = Nothing」〜「Set xlApp = Nothing」を
実行しても(End Subはまだ抜けていない状態で)タスクに残ってしまうのはなぜなのか?と
犯人捜しに乗り出しました。

Excel操作を1行処理する度に「Set xlSheet = Nothing」〜「Set xlApp = Nothing」を
記述し、タスクから消えたらこの終了関連の記述を一旦消し、次のExcel操作行の下行にまた
「Set xlSheet = Nothing」〜「Set xlApp = Nothing」を記述するといった様な感じで
問題ヶ所を突き止めました。
そうして「For Each ObjSht In xlBook.Worksheets」の下行に「Set xlSheet = Nothing」〜
「Set xlApp = Nothing」を記述・実行しても消えないことが判明し今回の質問となったわけです。


> おそらくは列挙子が原因だと思います。For Each 構文でループさせた場合、内部で
> _NewEnum メソッド/プロパティが呼び出されます(IEnumVARIANT)。このループ変数の
> スコープが、プロシージャ終了時まで保持されているのではないでしょうか。
★内部的な事は全く分からないのですが、魔界の仮面弁士さんの言われることは
それとなく理解できました。
別段プロシージャーから抜けると、プロセスからExcel.exeが消えるので問題視しなくても
よいと言うことが分かりました。(スッとしました)

私個人的にはFor Each文はあまり好きくないので、魔界の仮面弁士さんが提案くださった
「For n = 1 To xlBook.Worksheets.Count」で作業を進めたいと思います。
(ちなみに当方環境でも修正案2を実行するとプロセスからExcel.exeは消えましたよ〜)

よくこのBBSをROMってますが魔界の仮面弁士さんには、度々関心させられ頭が下がる思いです。
的確に迅速丁寧な対応ありがとうございました。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。