|
2012/07/21(Sat) 19:05:51 編集(投稿者)
■No63120 (あひる さん) に返信 > VS2008で、ブレイクポイントを張ってチェックしました。 ブレイクポイント、もとい、ブレークポイントはどの位置に設置していますか?
こちらでは、Sub Button1_Click の行、あるいは★マークの行で止めてみましたが、 当方環境ではステップ実行時に勝手に閉じられてしまうことはありませんでした。 x86 ビルド、AnyCPU ビルド、x64 ビルドの 3 パターンでの検証です。
Windows 7 Enterprise x64 SP1 .NET Framework 3.5 SP1 Visual Studio 2008 Development Edition Version 9.0.30729.4462 QFE Office 2010 Professinal - Excel 2010 x86 (14.0.6117.5003) SP1 MSO (14.0.6112.5000)
ところで、ステップ実行時に wb.close() の行の上にマウスカーソルを重ねたりはしていないでしょうか?
もしかしたら、その時に式が評価されてしまうことで、レイトバインドでの Close が呼び出され、ワークブックが閉じられてしまったのかも知れません。
とはいえ、Workbooks.Close 自体は戻り値を返さない Sub メソッドなので、 Debug.Print ThisWorkbook.Close() のようなコードを、Excel 2010 VBA 側のイミディエイトで実行しても、 「Function または変数が必要です。」との構文エラーになってしまうのですけれどね。
しかしながら、VBA 側で Debug.Print CallByName(ThisWorkbook, "Close", VbMethod) のように実行してみた場合、何故か True を返すという事態になったので、 レイトバインド時には Function として動作する仕様なのかも知れません。
> ブレイクポイントなしで実行すると、問題ないのですが、 > ブレイクポイントありで、デバックしながら実行すると、★の箇所でブックが閉じてしまいます。 最初の質問のコード(Open メソッドの戻り値を受け取る)方が良いでしょうね。 なお、コードを投稿する場合は、掲示板の投稿モードを「図表モード」にしておいてください。
> wb.close() これを CallByName(wb, "Close", CallType.Method) にしてみるというのはどうでしょうか。 万一、先の「意図せずに式が評価されてしまう」という仮設が正しかったとしても、 これならば実行されないと思いますので。
同様の理由から、今はデバッグ ウィンドウの類(ローカル、スレッド、ブレークポイント、 ウォッチ、呼び出し履歴)一式を、とりあえず閉じておいた方が良いかもしれません。
それからもう一つ。Sub ReleaseObj のループ内で、 Do I = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom) Debug.WriteLine(I) Loop Until I <= 0 のようにしてみた場合、ブレークポイントの有無で I の値に変化があるかどうかも 確認しておいてみてください。通常は「0」のみが出力されるはずです。
|