【解決方法】application.interactive=falseの時、メッセージボックス表示時にアクティブウィンドウが勝手に切り替わらないようにしたい。


翻訳ソフトを使用しています。 間違いがありましたら申し訳ありません。
以下のコードを実行すると、メッセージ ボックスが表示される前に Excel から別のウィンドウ (Explorer、Chrome など) に勝手に切り替わります。
別ウィンドウを開いてAlt+Tabでエクセルに戻った直後に起きやすいと思います。
入力と画面遷移を制御しているときに、アクティブなウィンドウが切り替わらないようにするにはどうすればよいですか? どなたか解決策をご存知の方がいらっしゃいましたら、ご教示いただけますと幸いです。

VBA
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) に変更すると、新しいプロセスがフォーカスを取得できなくなります。

シェルのドキュメントは ここ[^].

コメント

タイトルとURLをコピーしました