[ad_1]
翻訳ソフトを使用しています。 間違いがありましたら申し訳ありません。
以下のコードを実行すると、メッセージ ボックスが表示される前に Excel から別のウィンドウ (Explorer、Chrome など) に勝手に切り替わります。
別ウィンドウを開いてAlt+Tabでエクセルに戻った直後に起きやすいと思います。
入力と画面遷移を制御しているときに、アクティブなウィンドウが切り替わらないようにするにはどうすればよいですか? どなたか解決策をご存知の方がいらっしゃいましたら、ご教示いただけますと幸いです。
Sub TEST() Application.Interactive = False ' Transition to "RUNNING" sheet' Workbooks("TEST.xlsm").Activate Worksheets("RUNNING").Activate Application.ScreenUpdating = False ' Start connection confirmation batch "ping.bat"' 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 ' If you can’t connect, transition to "ERROR" sheet' FILECHK = Dir("c:\test\PINGERR.txt", 0) DoEvents If FILECHK = "PINGERR.txt" Then Workbooks("TEST.xlsm").Activate Worksheets("ERROR").Activate MsgBox "ERROR!!" '←I would like to avoid switching here.' DoEvents Application.ScreenUpdating = True Application.Interactive = True End Else MsgBox "Nomarl End!" '←I would like to avoid switching here.' End If ' If you can connect, transition to "OK" sheet' Workbooks("TEST.xlsm").Activate Worksheets("OK").Activate Application.ScreenUpdating = True Application.Interactive = True End Sub
私が試したこと:
1. 「Application.Interactive = False」をコメントアウトします。
2. 「Application.Interactive = False, True」および「MsgBox “ERROR!!”」の前に「DoEvents」を配置します。
3. メッセージボックスを表示する前に「sleep」で待ち時間を入れます。
「1」のみ有効でしたが、ユーザーが操作できる状態になるため、他の方法を模索中です。
解決策 1
基本的に、アプリがインタラクティブでない場合は、MsgBox をまったく使用しないでください。 MsgBox は、ユーザーの入力を待機している現在のアプリをフリーズするように設計されています。ユーザーの操作なしで実行しようとしている場合、応答を求めるのはおそらく設計上の欠陥です…
Application.Interactive が false かどうかを確認し、そうであれば、メッセージを表示する代わりにログ ファイルに追加します。 おそらく、MsgBox へのすべての直接呼び出しを関数呼び出しに置き換えて、そこで何をすべきかをチェックして、すべてを 1 か所にまとめます。
解決策 2
「許可なく別のウィンドウに切り替える」ことを防ぐことはできません。 特に、コードはCMDプロンプトウィンドウに表示される新しいプロセスを起動しているため、ウィンドウを切り替える許可を取得するようなことはありません.
Shellステートメントを見てください。 値 2 (vbMinimizedFocus) は、フォーカスを使用して最小化されたプロセスを起動するようシェルに指示します。これにより、起動したばかりのプロセスの最小化されたアイコンに入力フォーカスが与えられます。
2 を 6 (vbMinimizedNoFocus) に変更すると、新しいプロセスがフォーカスを取得できなくなります。
[ad_2]
コメント