質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

5887閲覧

Excel VBA:メッセージボックスを一定時間表示し、その後分岐を行いたい

Yoichinn

総合スコア16

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/06/17 07:23

お世話になります。
ExcelVBAについてご教示いただけますでしょうか。

◆環境
Windows7
Microsoft Excel for Office365 MSO(16.0.11126.20192) 32ビット

◆やりたいこと
1.とあるセルに「する」と入力されていればVBAを自動実行させる。
※コード上ではauto_start

2.その際、メッセージボックスを5秒間表示し、その間に中止を選択すれば
自動実行を停止
※コード上では「vbYes」を選択時に処理停止

3.選択しないで5秒経過すると自動実行開始

◆現状
実行すると、メッセージはポップアップされますが、5秒以上経過しても選択待機のままとなります。

◆現在のコード
参考ページ

VBA

1Dim WSH As Object, re As Long 2Set WSH = CreateObject("Wscript.Shell") 3 4If auto_start = "する" Then 5 re = WSH.PopUp(Text:="自動実行を中止しますか?", SecondsToWait:=5, Type:=vbYesNo + vbQuestion) 6 If re = vbYes Then 7 Set WSH = Nothing 8 End 9 End If 10 11 Set WSH = Nothing 12 13 Call "自動実行したい処理" 14End If 15

何か不足している情報等ございましたらご指摘いただけると助かります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

解決方法ではなく参考情報です。
私の環境で何回かやっていると、閉じることは閉じるのですが妙に時間がかかる事がありました。

そこで以下のように、フォームを作成しボタンを押すとメッセージボックスが出るようにして
ボタンを連打してみました。
イメージ説明
左上のメッセージが一番最初に作成され、一番右下が一番最後に作成されたメッセージボックスです。
左上のメッセージボックスから順番に消えていくかと思ったのですが、
実際には右下のメッセージボックス(新しい方)から消えていきました。(左上が最後)

推測ですが、
Wscript.Shell が、どこか別の処理を優先して動かしており
質問主さんのメッセージボックスの処理まで手が回っていない状態(カウントダウンが動いていない)なのではないかと思いました。

あくまで私の推測です、参考までに。

投稿2019/06/17 08:17

torisan

総合スコア678

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

torisan

2019/06/17 08:28

少し調べましたが、今ひとつ解決策がみつかりませんでした。。私ならユーザーフォームで代用と思います。
Yoichinn

2019/06/17 09:42

ご確認頂きありがとうございます。 今回は、Popupの直前にDoEventsを入れることで正しく動作いたしました。 頂いた情報は今後の参考にさせていただきます。 今後とも宜しくお願いいたします
guest

0

記載してあるソースでやってみましたが5秒”くらい”で終了してましたね。
ただ、一部記事等でVBAではWSH.Popupは不安定という記載を見つけました。

その記事では以下の方法を記載してました。
参考までに。

MessageBoxTimeoutというHiddenAPIを使用したサンプルです。

VBA

1 2Private Declare Function MessageBoxTimeoutA Lib "User32" _ 3(ByVal Hwnd As Long, _ 4ByVal lpText As String, _ 5ByVal lpCaption As String, _ 6ByVal uType As VbMsgBoxStyle, _ 7ByVal wLanguageID As Long, _ 8ByVal dwMilliseconds As Long) As Long 9 10Private Const MB_TIMEOUT = &H7D00 11 12 13Private Sub test() 14Dim re As Long 15 16If auto_start = "する" Then 17 If TimerMsgbox Then 18 'Call "自動実行したい処理" 19 End If 20 21End If 22 23End Sub 24 25Function TimerMsgbox() As Boolean 26 27Dim Sec As Long 28Dim Result As Long 29 30Sec = 5 * 1000 '5秒 31sMsg = "自動実行を中止しますか?" 32 33TimerMsgbox = False 34 35Result = MessageBoxTimeoutA(Application.Hwnd, sMsg, _ 36Application.Name, vbOKCancel + vbMsgBoxSetForeground, 0&, Sec) 37 38Select Case Result 39Case vbOK 40 TimerMsgbox = True 41Case vbCancel 42 TimerMsgbox = False 43Case MB_TIMEOUT 44 TimerMsgbox = True 45End Select 46 47End Function 48

投稿2019/06/17 08:05

ktamon

総合スコア35

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yoichinn

2019/06/17 09:44

ありがとうございます! このような方法もあるんですね!! 一度試してみます 今回はPopupの直前にDoEventsを入れることで解決いたしました。 今後とも宜しくお願いいたします。
guest

0

ベストアンサー

手元で確認しましたが、動作的には問題ありませんでした。
auto_start の値が設定されていないとか、"自動実行したい処理"内でエラーになっているなどを確認されてはどうでしょうか。

投稿2019/06/17 07:37

sazi

総合スコア25430

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yoichinn

2019/06/17 08:01

ご回答頂きありがとうございます! ご指摘いただいた点について確認いたしました。 Debug.Printでauto_startの内容を確認しましたが、「する」が選択されておりました。 後続させる処理についても、「いいえ」を選択するとそのまま正しく動作いたしました。 ただ、5秒以上放置してもメッセージが消えず次に進みません。 ご指摘いただいた点以外で、何か要因は考えられますでしょうか。 ※記載が漏れておりましたが、Workbook_Openに上記コードを記載しております 現状:以下の箇所で5秒経ってもポップアップが消えてくれないため、放置しても先に進まない re = WSH.PopUp(Text:="自動実行を中止しますか?", SecondsToWait:=5, Type:=vbYesNo + vbQuestion)
sazi

2019/06/17 08:08

先ずは、メッセージに関する部分だけで検証されてみて下さい。 期待通りでなければ、環境依存ですし、期待どおりなら、他の処理と組み合わせてどの処理が影響しているかを検証してどの処理に関連しているかを絞り込んでみて下さい。
sazi

2019/06/17 08:11

気休めですけど。PopUpの直前にDoEvents入れてみるとか。
Yoichinn

2019/06/17 09:40

ありがとうございます。 結論、DoEventsを入れると動きました! Dim WSH As Object, re As Long Set WSH = CreateObject("Wscript.Shell") If auto_start = "する" Then DoEvents re = WSH.PopUp(Text:="自動実行を中止しますか?", SecondsToWait:=5, Type:=vbYesNo + vbQuestion) If re = vbYes Then Set WSH = Nothing End End If Set WSH = Nothing Call "自動実行したい処理" End If
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問