Excel365で作ったマクロをWindowsタスクで起動して自動実行させるものがあり、運用していたのですが、時間がかかりすぎた場合に、外部プログラムから終了させるニーズが生じて、苦戦しています。
対応方法は、FindWindow+SendMessage(WM_SYSCOMMAND, SC_CLOSE)のWin32APIを使う方法で考えています。
この方法で、SC_CLOSEはExcelマクロに正しく届いて、終了しようとするのですが、「変更内容を保存しますか?」の確認ダイアログが出てしまい、困っています。
このダイアログは、普通のダイアログ「#32770」と違って「NUIDialog」のようで、FindWindowExでボタンのハンドルを取得できず、ボタンにBM_CLICKを送信する方法が使えません。
確認ダイアログそのものはFindWindowで取得できますが、ダイアログにEnterキーイベントなどを送っても効果はなく。。
Excelマクロは、時刻などをシートに書き出しているので、SC_CLOSE受信でブックの保存確認ダイアログが出るのは仕方なさそうですが、無人運転なのでなんとか自動で閉じたいです。
ThisWorkbookモジュールに、Workbook_BeforeCloseは追加しましたが、これが呼ばれる前に保存確認ダイアログが出てしまい、そこで制御が止まって、Workbook_BeforeCloseの処理が動きません。
VBA
1Private Sub Workbook_BeforeClose(Cancel As Boolean) 2 Application.DisplayAlerts = False 3 ThisWorkbook.Save 4 ThisWorkbook.Close 5 Application.Quit 6End Sub
自動保存を無効にすればよいかと思って、Workbook_Openに追加しましたが、効果がありません。
VBA
1Private Sub Workbook_Open() 2 ThisWorkbook.EnableAutoRecover = False 3End Sub
何かいい方法はないでしょうか?
回答4件
あなたの回答
tips
プレビュー