前提
ExcelのVBAでバッチを呼び出し、
その処理結果をメッセージボックスと画面に表示させるシステムを作成しています。
バッチ実行中は実行中画面を表示し、その時にユーザが画面入力できないように
Application.Interactive = Falseを追記したところ、メッセージボックス表示前にExcelから直残まで開いていたウィンドウ(エクスプローラやchromeなど)へ勝手に切り替わる現象が発生するようになりました。
実現したいこと
Application.Interactive = False 時に、メッセージボックスを表示するとき、アクティブウィンドウが勝手に切り替わらないようにしたい。
発生している問題・エラーメッセージ
別ウィンドウを開き、Alt+TabでExcelへ戻った直後に起きやすい。
該当のソースコード
VBA
Sub TEST() Application.Interactive = False '実行中画面へ遷移 Workbooks("TEST.xlsm").Activate Worksheets("RUNNING").Activate Application.ScreenUpdating = False '接続確認バッチ(ping)を起動 TaskID = Shell("c:\test\ping.bat", 2) hProc = OpenProcess(PROCESS_ALL_ACCESS, False, TaskID) If OpenProcess(PROCESS_ALL_ACCESS, False, TaskID) <> vbNull Then Call WaitForSingleObject(hProc, INFINITE) CloseHandle hProc End If '接続できない場合、エラー画面へ遷移 FILECHK = Dir("c:\test\PINGERR.txt", 0) DoEvents If FILECHK = "PINGERR.txt" Then Workbooks("TEST.xlsm").Activate Worksheets("ERROR").Activate MsgBox "ERROR!!" '←ここで切り替わらないようにしたいです。 DoEvents Application.ScreenUpdating = True Application.Interactive = True End Else MsgBox "Nomarl End!" '←ここで切り替わらないようにしたいです。 End If '接続できた場合、OK画面へ遷移 Workbooks("TEST.xlsm").Activate Worksheets("OK").Activate Application.ScreenUpdating = True Application.Interactive = True End Sub
試したこと
1.Application.Interactive = Falseをコメント化。
2.「DoEvents」をApplication.Interactive = False、TrueやMsgBox "ERROR!!"の前に入れる。
3.メッセージボックス表示前に「sleep」で待ち時間を入れる。
1のみ効果がありましたが、ユーザが操作できる状態になってしまうため、他の方法を探しています。
入力や画面遷移の制御を行いつつ、アクティブウィンドウが切り替わらないようにするにはどうしたらいいでしょうか。解決策をご存じの方いらっしゃいましたら、ご教授いただけると嬉しいです。
補足情報(FW/ツールのバージョンなど)
環境は、
Windows10のExcel2019を使用しています。

0 コメント