アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (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関数を使うしかないと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。参考にさせていただきます。今使っている機能は不安定なんですね。別の方法を探ってみます。

お礼日時:2023/05/25 15:35

こんばんは



すみませんが、直接の回答ではありません。

ご提示のコードだとスクリプト(WSH)に処理を渡しているので、その後はVBAからは感知できません。
また、ご質問文からは再現性のない事象のように見受けられますので、究明へのヒントが無い状態と言えます。
原因を特定するにしても、相当に面倒であろうと想像されます。
(特定できるのかも、現状ではわかりませんが・・)


処理の全体像が不明ですが、「ダイアログを一定時間後に閉じる」ことが実現できれば良いのであれば、ユーザーフォームで同じようなものを作成しておいて、VBAの制御範囲内で表示/消去を行う方法に変えることで、仮に似た様な事象が発生したとしても(多分発生しないと思いますが)対処がしやすくなるのではと思います。

具体的には、フォームをモードレスで表示しておいて 、OnTimeメソッドで指定時間後に消す(=UnLoad)という方法です。
既定のボタンやアイコンが用意されてはいませんので、自分でフォームとレイアウトを事前に用意しておく必要がありますけれど・・・
(フォームの方が、自由にレイアウトが可能という利点はあります)

もしも、5秒後というのが概ねの時間で、何らかの準備処理等が終わるまでの時間を想定しているのであるのなら、上記の方法であれば、処理終了時にダイアログ(=フォーム)を消すことも可能になります。
ユーザが「×」ボタンで早く消すことは可能ですが、その点に関しては、ご提示の方法でも同様と思いますので。
    • good
    • 0
この回答へのお礼

ありがとうございます。参考にさせて頂きます。

お礼日時:2023/05/25 15:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A