プロが教える店舗&オフィスのセキュリティ対策術

いつもお世話になります

プログラムの実行中に現在の処理状況をUserformで下記ように
Sleep関数を使ってUserに伝えていますが、時々メッセージを出したまま
止まってしまいます
原因が分からないので、もしご経験や問題点が有れば教えてください
また、他の良い方法をご教授頂ければ幸いです。

Private Sub UserForm_activate()
Dim i As Long
DoEvents
Me.Label1.Caption = Message1
Sleep MilliTimer
Unload Me
End Sub

変数MilliTimerは、As LongでPublicにて定義されています
また、Userformを呼び出す前にMilliTimer = 3000 と値をセットしています

以上、よろしくお願い申し上げます

A 回答 (1件)

こんにちは



>時々メッセージを出したまま止まってしまいます
発生したりしなかったりということは、明確なコード上の問題ではなさそうですし、再現したときに調査しないと原因はわかりにくいだろうと思います。


一方で、Sleep関数ってWindowsAPIを利用しているってことですよね?
ご提示の使い方を見る限りでは、メッセージを読む時間だけ表示して消しているようなので、正確な時間計測は必要ないものと勝手に解釈しました。
もしそうであるなら、APIを介さずとも、Waitメソッドを利用してみてはいかがでしょうか?
https://learn.microsoft.com/ja-jp/office/vba/api …
指定方法が、「現在+待機時間」に変わりますけれど、WaitメソッドであればAPIのように他に制御を移すことをしないので(=VBAの範囲内で実行)、ご質問のようなことは起きにくいであろうと想像します。
(API利用でも、ご質問のような状況は見たことはありませんが・・)


以下は、ご質問には関係ありませんが・・
どのようなタイミングでご提示の処理が実行されるのか不明ですが、APIでもWaitでも、待機中はユーザーの操作を受け付けなかったと思います。
ユーザーが何らかの操作中に、いきなりメッセージを表示されて操作が中断してしまうのは、はた迷惑になりかねません。
もしも、操作を中断しないようにするのなら、フォームをモードレスにして、待機処理については自前で経過時間を待つループを記述することで可能になると思います。
    • good
    • 0
この回答へのお礼

早速ご回答に心から感謝します

複数のファイル処理から作表する場合
少しUserが待たされるので、処理状況を伝えるために
2,3秒出力させています

Userは実行中に操作することないですが、ご忠告と
ご提案、さっそくテストしてみます

本当にありがとうございました
これからもよろしくお願い申し上げます

お礼日時:2023/01/18 11:54

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