どーもボキです。
表示させても処理を続行できるダイアログ、一定時間で確実に閉じるダイアログ、これを実現できます
ダイアログ(MsgBox、Popup)を表示させると、そこで処理が止まります。ユーザへ通知しつつ、処理は続行したい時もありますよね?
手っ取り早く画面表示と処理の続行を両立させるには、コンソール(黒い画面、cscriptホスト)を使えばOKです。以下のリンクにdprintf関数をつかえばカンタンです。
今回は、ダイアログ表示のまま処理を続行できる独自関数myMsgBoxを紹介します。
myMsgBoxならば、次が可能になります。
- 一定時間後に閉じるダイアログ表示を表示できる。
- ダイアログ表示させたまま、メイン処理を続行できる。
- 上記を組み合わせて利用できる。
myMsgBoxでは、下図のように処理を止めることなく、メイン処理で終了を通知できることがわかります。
![[VBScript/VBA] 処理を止めない・一定時間で閉じる進化したダイアログ「myMsgBox」_a0021757_04434286.png](https://pds.exblog.jp/pds/1/202112/25/57/a0021757_04434286.png)
サンプルプログラムのダウンロードと使い方
WScript.ShellのPopupの「指定時間になっても閉じない」も回避できます
myMsgBoxは、WScript.ShellのPopup関数を利用してます。このPopupは、
- 実行元が非表示状態となっている。
- 実行元がシステム領域になっている。
等の場合、「指定時間が過ぎても閉じない」と思われます。
この閉じない現象の詳細原因は把握できていないものの、回避する方法は見つけています。
それが、このmyMsgBoxの実装で行っている「テンポラリなvbsをコールする」です。
このmyMsgBoxならば、OfficeツールからのPopupコールしても、処理が止まってしまう・一定時間が過ぎてもダイアログが閉じない、といった現象も回避できます。
今回開発したプログラムソース
myMsgbox "3秒後に閉じるダイアログを表示する。" & vbCr & "処理が止まる" , vbOkCancel + vbInformation, WScript.ScriptName, 3, True
myMsgbox "3秒後に閉じるダイアログを表示する。" & vbLf & "処理が続行する", vbOkCancel + vbInformation, WScript.ScriptName, 3, False
myMsgbox "ダイアログを表示する。" & vbCrLf &"処理が続行する" , vbOkCancel + vbInformation, WScript.ScriptName, 0, False
MsgBox "終了", vbInformation, WScript.ScriptName
'-------------------------------------------------------------------------------
' 別プロセス化で必ずタイマーが機能するPopup
'-------------------------------------------------------------------------------
Function myMsgBox(sPrompt, iButton, sTitle, nSecondsToWait, bWaitOnReturn)
Dim objWS: Set objWS = CreateObject("Wscript.Shell")
Dim objFS: Set objFS = CreateObject("Scripting.FileSystemObject")
Dim fpth: fpth = objFS.GetSpecialFolder(2) & "" & objFS.GetTempName & ".vbs"
Dim icode: icode = Array( vbCrlf , vbCr , vbLf , vbTab )
Dim scode: scode = Array("vbCrLf","vbCr","vbLf","vbTab")
Dim i,s: s = sPrompt
For i = 0 To UBound(icode)
s = Replace(s, icode(i), """ & " & scode(i) & " & """)
Next
Dim t: t = "CreateObject(""Scripting.FileSystemObject"").DeleteFile """ & fpth & """, True"
t = t & vbCrLf & "WScript.Quit CreateObject(""WScript.Shell"").Popup(""" & s & """, " & nSecondsToWait & ", """ & sTitle & """ , " & iButton & ")"
objFS.CreateTextFile(fpth, True).WriteLine t
myMsgBox = objWS.Run(fpth, 0, bWaitOnReturn)
End Function
この記事での気付き
ボキは、ダイアログ通知が好みではありません。それは、ダイアログ通知中に処理が止まってしまう・ユーザに操作や判断を強いるといった理由からです。通知されたダイアログがキーボードで操作できるものはまだしも、マウスでのクリック操作が必須となるダイアログは正直我慢なりません。
そんなコダワリのあるボキは、会社のPCのスタートアップでOutlookマクロを実行させていました。
このマクロにPopupダイアログを設定していたものの、指定時間が過ぎても閉じずに毎回操作が必要になっていたのです。
いくらキーボード操作で閉じられるダイアログとは言え、起動後とに操作するまでマクロが止まることが気に入りませんでした。そのため、そもそも通知させないといった暫定回避策を取っていました。
ここで思いついた恒久回避策が「myMsgBox」です。
このmyMsgBoxならば、指定時間で確実に閉じさせるだけでなく、ダイアログ表示させつつ処理が続行できるといった使い方が出来ますので、ユーザにダイアログ操作を強いることなく通知する、といったユーザの操作負担を減らした通知に利用できると思います。
にほんブログ村
htmx.process($el));"
hx-trigger="click"
hx-target="#hx-like-count-post-241309314"
hx-vals='{"url":"https:\/\/yozda.exblog.jp\/241309314\/","__csrf_value":"d1ffbcc2a22484e0ed6b31bc04c270ac358e60584d7a5942ac8b9776921cc93d8208ec69e6a2f2aa9bdb2b2690cad78438d85a9b0b901c61463e6ab9e4f5bd48"}'
role="button"
class="xbg-like-btn-icon">