2021年11月3日水曜日

VBAでは操作したい対象をオブジェクトと言いますが、複座な操作のコードを書くと、何でもオブジェクトのような気がしてくるぜ - Application.Quit(VBA)

ブックを閉じてもエクセルは不死身
    
VBでExcelを操作している時、Excelのプロセスが残ってしまう現象が起きます。
ブックを閉じるコマンドを実行すれば、アプリそのものも終了するはずなんだ。

でも、冒頭画像のようにエクセルのアプリだけが残される状態になってしまう。
ならばと、VBAでApplication.Quitを実行しますが、それでも終了しないんだ。

つまり、正しく処理していないから、Excelのプロセスが終わらないのだろうか。
ならば、プロセスが残っていて、何かのオブジェクトのゴミが残っているのか。

まあ、手順通りに従うのなら、最初にWorkBookオブジェクトをCloseします。
それから、Applicationオブジェクトのブックを、QuitでCloseするのが常識だ。

でも、この順序では、アプリが残されてしまい完全終了にならない場合が多い。
ネットで調べたら、Applicationオブジェクトを全て終了していないからだとか。

こういう表現で、このオブジェクトが一体何を意味するのか、分からなかった。
それで、もう一度ググってみますと、プロパティの一覧表を見つけ出しました。

中には、ActiveWorkbook、ActiveSheet、Appliation、DisplayAlertsなどだ。
今回のVBAプログラムは、プロシージャが多いので、これらを多用しています。

だから、こういったオブジェクトがどこで終了していないのか見つけ出せない。
プログラム自体は、完全起動だし不満は特にありませんが、完全終了したいな。

だとすれば、Application.Quit を記述する位置を変更してみたらと思って実験。
ActiveWorkbook.Close SaveChanges:=Falseよりも、果敢に前に置いてみた。

Private Sub Workbook_Open()
 MsgBox "ボタン押せば終了"
 Application.Quit
 ActiveWorkbook.Close SaveChanges:=False
End Sub

おやっ、完全にエクセルが終了して、ウインドウズのスクリーンから消滅する。
教科書通りに考えるのなら、リソースはつかった順の逆で終了するのが無難だ。

でも、このApplication.Quitというコマンドは、先に予約しておけるらしいな。
Quitを先に実行しておいて、ブックを閉じればオブジェクトがすべて消えます。

それから、保留されたQuitのコマンドを実行して、エクセルも終わらせるんだ。
そういう動作だと結論付けましたが、ネットもそう書かれているのを発見した。

というわけで、RPAとの組込みでVBAを走らせるので、終わらせる必要もある。
今回の不思議なコマンド挙動で、改めてVBAにおけるオブジェクトが気になって調べて見ましたが、オブジェクトと呼ばれる対象は、いろいろな種類があって、その中でも、Excel アプリケーション全体を表すのがApplicationオブジェクトだって言われても、動いて使えればかまわないと思うのが自分なのでした。



いいねと思ったら、三つポチっとね!
にほんブログ村 スキースノボーブログへにほんブログ村 スキースノボーブログ スキーへにほんブログ村 旅行ブログ 旅日記・旅の思い出へ
にほんブログ村    にほんブログ村      にほんブログ村 



0 件のコメント:

コメントを投稿