ユーザーフォームが開いたらすぐにプログラムを実行

ユーザーフォーム

はじめに

 ユーザーフォームは、ボタンを押す際にButtonのPushイベントなどを受けてプログラムを実行する事が多いと思います。
 ただ、場合によってはユーザーフォームが開いたらすぐにプログラムを実行したい場合もあるでしょう。
 
 そのような場合には、UserForm_Activate イベントにプログラムを書けばOKです。
 ユーザーフォームが開く前に初期化を行う UserForm_Initialize イベントにプログラムを書いてもユーザーフォームは開きません。
 UserForm_Activate は、ユーザーフォームがアクティブになった時に実行されるようになります。

時刻を表示するプログラム

 ここでは時刻を表示するプログラムを紹介します。

 ユーザーフォームにラベルを配置し、そこに Now関数で時刻を表示させます。
 ただ繰り返し実行しなければ、時刻を刻んでいるように見せる事はできません。

時刻を表示して5秒後に終了するプログラム

 簡単な例として、ユーザーフォームを起動させて時刻を表示し5秒後に終了するプログラムを書いてみます。

 ユーザーフォームのモジュールで、コードウインドウの左上部から「UserForm」を選択し、右上部のイベントは「Activate」を選択します。
 尚、今回はSleep関数を使いますので、宣言が必要になります。ユーザーフォームで宣言する場合は、Private属性を付けて宣言する必要がありますので注意してください。

'//UserFormモジュールに記述します。
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As Long) 

Private Sub UserForm_Activate()
    Dim i As Long
    For i = 1 To 10
        Me.Label1.Caption = Format(Now(), "HH:mm:ss")
        DoEvents
        Sleep 500
    Next

    Unload Me
End Sub

プログラム解説

 時刻の表示は、Now関数の値をFormat関数で整形して出力しています。
 時間を示す HH は大文字にすると24時間表示になります。

 繰り返し処理は、For文を使い、Sleep関数で500(0.5秒)待ってから処理を進ませます。
 ここで、DoEvents を挟まないと表示されませんので注意してください。
 
 DoEvents の代わりに Me.Repaint としても動作しますが×マークでの終了ができなくなります。

問題点

 DoEvents を挟んだおかげで、×マークでユーザーフォームを閉じることができました。
 しかし、実は×マークでユーザーフォームが閉じただけでFor文は最後まで実行し続けています。
 
 そこでFor文を抜け出す仕組みが必要になってきます。

時刻を表示を途中で止める仕組み

 DoEvents を挟んだ事で×マークからユーザーフォームを閉じることができるようになったのですが、繰り返し処理を抜ける事が出来ていません。
 これを解消するため、フラグ用の変数を設けて終了する事を知らせてやる必要があります。

Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As Long)  

Dim bStop As Boolean

Private Sub UserForm_Activate()
    Dim i As Long
    
    bStop = False
    
    For i = 1 To 10
        Me.Label1.Caption = Format(Now(), "HH:mm:ss")
        DoEvents
        
        If bStop Then Exit For
        
        Sleep 500
    Next

    Unload Me
End Sub

Private Sub UserForm_Terminate()
    bStop = True
End Sub

 今度のプログラムでは、フラグ用に Boolean bStop 変数をグローバル変数として追加します。
 更に Terminate イベントプロシージャも追加しています。
 
 ×マークを押すと、 Terminate が呼ばれますので、そこで bStop Trueにして繰り返し処理を抜けるようにしています。

まとめ

 今回の注意点をまとめておきます。
 ・ユーザーフォーム起動と同時にプログラムを走らせる場合は、Activate イベントを使う
 ・ユーザーフォームで Sleep関数の宣言をする時は、Private属性を付ける
 ・繰り返し処理の中で DoEvents を使う時は Terminate イベントが呼ばれても処理が継続するので注意する

 尚、途中で処理を中断する仕組みに関しては、フラグ用のグローバル変数DoEvents をセットで考えておくと良いでしょう。

コメント

タイトルとURLをコピーしました