Excel VBAの話。バッチと組み合わせて自動的に処理をするExcel VBAのとき、終了時に自分を終了すると、その時に開いていた別のExcelの変更を保存するかしないかきいてくる。そうすると、ユーザーは保存しようか保存しないか迷うし、このときのダイアログに[キャンセル]を選んでしまうと、自動的に実行していたExcel VBAがシートを無様に開けたまま停止していまう。
人物A「製作段階でも人物Bと検討したのですが、解決策が見当たらないのですよ」
人物A「実行中は他のExcelを使わない、っていう決まりが別のExcel操作でありましたよね」
な〜んて、会話がユーザーデモの会議で交わされたいた。
会議中に「?」と思ったが、黙っていた。
自分では別のExcel VBAで、他のExcelを閉じず自分のみ閉じる仕様を実現していたから。
でも、人物Aは出来ないって自信満々(?)にユーザーに説明していたし、作成した人物Bと検討したというし、それならそうなんだろう。人物BはExcel VBAに自信あるっていうし。前に自分が実現したのと実行条件が違うかもしれないし。
でも、一日経っても、自分のコーディングとどう違うのかが気になる。
お節介がしたくなる〜
終了時のコーディングは…
Workbooks("sample.xls").Save
なるほど…
そこで、この1行を
Workbooks("sample.xls").Close SaveChanges:=False
と変更してみた。(自分自身は保存しなくても良いので。)
そして、他のExcelを開いておいて、実行。
結果は、コードのとおり自分自身のみ終了する…って、出来てるじゃん!?
人物Aに「他が開いていても自分自身だけ終了できますよ」って話したら、
「自分だけのときExcelが起動したままにならない?Excel自体も終了しないと。」
と
ホレミロ!感アリアリで返事をしてきた。
確かに、Excelは起動したままだが…
ホレミロ!感アリアリで
ソンナコトハ、人物Bト、ケントウズミダヨ〜
って気持ちが言葉の端に乗ってくる。
お節介しなければよかったという後悔のあと、フツフツとアドレナリンが沸いてきた!
絶対出来るハズ!超集中!!!
で、追加修正したコードが概ね次のとおり。
Dim wa As String wa = "ほかに無い" Dim wb As Workbook For Each wb In Workbooks If wb.Name <> ThisWorkbook.Name Then wa = "ほかにあるよ" End If Next If wa = "ほかに無い" Then Application.DisplayAlerts = False Application.Quit '終了予定 End If Workbooks("sample.xls").Close SaveChanges:=False
簡易テストでは良好だった。人物Bに戻して(説明して)しっかりテストしてもらおうっと。
(2019/05/05追記)
VBA 開いているファイルだけ終了
で検索して訪問される方がいらっしゃるようです。ありがとうございます。
この記事が参考になっているのならばよろしいのですが笑