タイトル : 【解決】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ってますが魔界の仮面弁士さんには、度々関心させられ頭が下がる思いです。 的確に迅速丁寧な対応ありがとうございました。 |