Excelでmsgboxを2秒間だけ表示させて自動的に閉じさせるには、どうしたらいいのか解りません。sendkeysを使えばいいのか・・・?
すみませんが、よろしくお願いします。
msgboxに限らず、普通のメッセージボックスはモーダルダイアログとして表示します。
(つまり、表示中は次の命令が実行されない)
なので、msgboxでは無理です。
たしか、メッセージボックス系のAPIに、そういうことができるものもあったと思いますけど、覚えていません。
でも、使い方を考えると、
ボタンのないフォームを表示させたほうが早いような気もしますけど?
普通のフォームをmsgbox風にして、フォームロードのときにタイマーを起動させてみたら動でしょうか?
余計なコントロールを使いたくなければ
フォームを表示した後、APIのSleep関数を使って処理を2秒間停止させ
直後にアンロードするという手もあります。
処理を停止させるだけなら、Sleep APIを使わなくても、
Application.Wait DateAdd("s", 2, Now)
で充分かも。
なお、Sleep APIやWaitメソッドで停止させた場合、その間は
Excelの操作は一切できなくなります。
もし、「2秒後に自動的に閉じる」だけではなく、
「通常通り、MsgBoxの[OK]を押して閉じる」という動作も
行わせたいのであれば、Sleep/Watiは使えませんので、
かわりに、WshShellオブジェクトのPopupを利用してみてください。
intButton = CreateObject("WScript.Shell").Popup( _
"2秒たってもボタンが押されなければ、-1が返されます。", _
2, _
"ここはタイトル部です", _
vbInformation)
ただしこの方法は、Windows Scripting Host(WSH)のVersion 1.0以上が
インストールされている環境でしか利用できません。
(最近のOSであれば、WSH2.0以上が最初から入っていますけれどね)
もし、WSHを利用できないような場合は、自作のUserFormなどを使って、
自前でタイマー処理を行うようにするしか無いと思います。
——ただし、ExcelのUserFormには、AccessのFormの様なTimerイベントは
実装されていませんし、VBのようにTimerコントロールが付属している
わけでもないので……少々厄介かもしれませんけれども。
# ActiveXコントロールに頼っても良いのであれば、IeTimer.ocxなどを
# http://activex.microsoft.com/controls/iexplorer/x86/ietimer.cab
# 使うなどの方法もありますが、どうせインストールするなら、
# IeTimerよりも、先のWSHを入れてしまった方が手軽かも。(^^;
調べてみたら、ExcelにはOnTimeというメソッドがあるようですね。
先のWshShell.Popupを使わず、自作のフォームで実装するのであれば、
こんな感じでいけるかも。
'--- 標準モジュール ---
Option Explicit
Public Sub CloseForm()
UserForm1.CloseTime = Empty
Unload UserForm1
End Sub
'--- UserForm ---
Option Explicit
Public CloseTime As Variant
Private Sub CommandButton1_Click()
Unload Me
End Sub
Private Sub UserForm_Initialize()
CloseTime = DateAdd("s", 2, Now)
Application.OnTime CloseTime, "CloseForm"
End Sub
Private Sub UserForm_Terminate()
If Not IsEmpty(CloseTime) Then
Application.OnTime CloseTime, "CloseForm", , False
End If
End Sub
ツイート | ![]() |