
Excel-VBAで、指定秒数待つと自動的に閉じるダイアログを作成しています。普段は一定時間経つとちゃんと閉じるのですが、何度か実行していると、たまにいくら時間が経っても閉じない状態になってしまします。何が悪いのでしょうか。以下ソースです。何か手掛かりになることわかりましたらお教えください。よろしくお願い申し上げます。
----------
Sub test()
msgBox2("しばらくお待ちください", 5)
End Sub
Sub msgBox2(msg As String, sec As Long)
Dim WSH As Object
Set WSH = CreateObject("WScript.Shell")
WSH.Popup msg, sec, , vbInformation
Set WSH = Nothing
End Sub
No.2ベストアンサー
- 回答日時:
残念ながら、以下のURLでも説明されているとおり、WSHのPOPUPメソッドは不安定だというのが結論のようです。
↓https://hirachin.com/post-7426/・・・①
https://atsumitm.iobb.net/its/its-022.php・・・②
https://takeichi.work/messeagebox-autoclose-time …・・・③
つまり、解決策は「WSHのPOPUPメソッドを使わない」ということになります。
No.1さんの回答にあるユーザーフォームを使うのも一つの方法だと思います。
上記②のURLに複数の対応方法が照会されていますので、参考にしてください。
ただ、「MsgboxやWSH.Popupと似たデザインで」にこだわるなら、③で紹介されているWindows APIのMessageBoxTimeoutA関数を使うしかないと思います。
No.1
- 回答日時:
こんばんは
すみませんが、直接の回答ではありません。
ご提示のコードだとスクリプト(WSH)に処理を渡しているので、その後はVBAからは感知できません。
また、ご質問文からは再現性のない事象のように見受けられますので、究明へのヒントが無い状態と言えます。
原因を特定するにしても、相当に面倒であろうと想像されます。
(特定できるのかも、現状ではわかりませんが・・)
処理の全体像が不明ですが、「ダイアログを一定時間後に閉じる」ことが実現できれば良いのであれば、ユーザーフォームで同じようなものを作成しておいて、VBAの制御範囲内で表示/消去を行う方法に変えることで、仮に似た様な事象が発生したとしても(多分発生しないと思いますが)対処がしやすくなるのではと思います。
具体的には、フォームをモードレスで表示しておいて 、OnTimeメソッドで指定時間後に消す(=UnLoad)という方法です。
既定のボタンやアイコンが用意されてはいませんので、自分でフォームとレイアウトを事前に用意しておく必要がありますけれど・・・
(フォームの方が、自由にレイアウトが可能という利点はあります)
もしも、5秒後というのが概ねの時間で、何らかの準備処理等が終わるまでの時間を想定しているのであるのなら、上記の方法であれば、処理終了時にダイアログ(=フォーム)を消すことも可能になります。
ユーザが「×」ボタンで早く消すことは可能ですが、その点に関しては、ご提示の方法でも同様と思いますので。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
メッセージボックスのOKボタンをVBAでクリックさせたい
Visual Basic(VBA)
-
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
-
4
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
5
Excel VBA 自動的に閉じるMsgBox
Excel(エクセル)
-
6
VBA(エクセル)で自動的にボタンをクリックさせるには
その他(プログラミング・Web制作)
-
7
エクセルVBAで、MsgBox やInputBox は、画面の中央以外に表示させたい。
Excel(エクセル)
-
8
マクロを実行中に、msgbox を表示させたまま、ワークシートを上下左右に移動表示させたい。
Excel(エクセル)
-
9
メッセージボックスを前面に表示させるには?
Visual Basic(VBA)
-
10
VBAにて別ワークブック上の実行したマクロのメッセージボックスを操作
Visual Basic(VBA)
-
11
実行時エラー 438になった時の対処法を教えて下さい。
Visual Basic(VBA)
-
12
【Excel VBA】マクロでExcel自体を終了させたい
Excel(エクセル)
-
13
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
14
VBA メッセージボックスを自動で消したい
Visual Basic(VBA)
-
15
vba クリップボードクリアについて教えてください
その他(プログラミング・Web制作)
-
16
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
17
エクセルのVBAでユーザーフォームを4秒ぐらいで閉じるようにするには
Access(アクセス)
-
18
VBAにてメッセージボックスを最前面に表示させる
その他(プログラミング・Web制作)
-
19
private subモジュールを他のモジュールから呼び出して使う方法を教えてください(-.-)
Visual Basic(VBA)
-
20
ExcelVBAで今開いているユーザ情報を取得できますか?
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ACCESS2007OFFICEボタン開発者...
-
SQL-Loaderが動かないです。
-
AccessのDAO.ExecuteとDoCmd.Ru...
-
JAVA ServletでSQL Serverに接...
-
アクションクエリが実行できない
-
バッチでのSQL実行結果の分岐処...
-
「最高気温が35度以上の日を猛...
-
SQL2000Serverにアクセスするの...
-
ACCESSをWEB上で使用する
-
PL/SQLのコンパイル
-
SQL Server時間切れについて
-
ストアドプロシージャの実行に...
-
SQLServer2000へのリモート接続...
-
ノートパソコンのHDDを同機種へ...
-
AccessからODBC経由でのSQLServ...
-
SQLServerへのOpen命令でのエラー
-
configure: error: Berkeley DB...
-
Oracle8i
-
ACCESS ADOでupdateが効かない
-
mdfに通信できません
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel-VBAの「しばらくお待ちく...
-
AccessのDAO.ExecuteとDoCmd.Ru...
-
SQLServerのジョブからバッチを...
-
アクションクエリが実行できない
-
ストアドの速度がクエリの30...
-
sqlcmdでクエリの実行結果をバ...
-
Excelフィルタ抽出で「検索して...
-
SQLCMDにて教えていただきたい...
-
SQLServer2005のストプロでxp_c...
-
データベース SQL のセッショ...
-
100万件レコードdelete
-
バッチからメンテナンスプラン...
-
ユーザー定義関数内でのsp_exec...
-
UPDATE時のSETの実行順について
-
SQL-Loaderが動かないです。
-
指定時刻のクエリ自動実行
-
バッチでのSQL実行結果の分岐処...
-
同じSQL文で速度がだいぶ違う
-
ORACLEでのexportのbatファイル...
-
SQLサーバーのジョブでのexeフ...
おすすめ情報