|
ぴぐぴぐ さん:
パパち さん:
おはようございます。
>Do Wihle 〜 Loop を利用するよりも、CPUに負荷がすくなくて
すんでいます。
私は、繰り返し処理に関しては、Do〜LoopとOntimeメソッド
ケースバイケースで使い分けるように心がけています。
今回は、何も解説がなかったのでユーザーフォームは、モーダルモードだと
解釈してのループするコードだったんですが、
場合によっては、Ontimeメソッドを使ったほうが動作が安定していつ場合も
ありますねえ!!
ループ中にSleepを入れておくと、CPUの占有率はそれほど高くならないという
結果からの判断で Do〜Loopの例を投稿しました。
モーダルモードのユーザーフォーム内での繰り返し処理では、実験も兼ねて
私は、殆ど Do〜Loopです
(と言っても、そんな滅多にこんな事象はありませんが)
>ontime、一応しらべたんですが、いまいちよくわからなかったので。
では、Ontimeを使った例です。
ユーザーフォーム(Userform1)には、以下のコントロールを
配置してください。
Label1 ----- 日付の表示用
Label2 ----- 時刻表示用
Textbox1 ----- 日付・時刻表示中に入力が可能か確認用
では、コードです。
標準モジュールに 繰り返し処理管理プログラムパック
これは、以前作成したものです。
'======================================
Private exetm As Variant '次の実行時刻
Private lmcnt As Long '繰り返し回数
Private ccnt As Long '現在の実行回数
Private reptm As Variant '実行間隔時間
Private prcnm As String '実行プロシジャー名
'===============================================================
Sub mc_schedule(ByVal on_off As Boolean, _
Optional ByVal limit_cnt As Long = 0, _
Optional ByVal rep_time As Variant, _
Optional ByVal proc_name As String, _
Optional ByVal F_Exetm As Variant)
'マクロ実行のスケジュールの設定を行う
'input : on_off --- true スケジュール設定 false---スケジュール解除
' limit_cnt 実行を繰り返す回数 0の場合は、制限なく繰り返す
' rep_time 実行間隔時間
' proc_name 実行するプロシジャー名
' F_Exetm 初回実行時間 省略すると、現在の時刻+実行間隔時間
On Error Resume Next
If on_off = True Then
reptm = rep_time
If limit_cnt <> -1 Then
lmcnt = limit_cnt
ccnt = 0
End If
If IsMissing(F_Exetm) Then
exetm = Now() + reptm
Else
exetm = F_Exetm
End If
prcnm = proc_name
End If
Application.OnTime EarliestTime:=exetm, Procedure:="mc_exec", Schedule:=on_off
On Error GoTo 0
End Sub
'==================================================================
Sub mc_exec()
'スケジュール設定されたプロシジャーを実行する
Dim wk As Variant
wk = Application.Run(prcnm)
ccnt = ccnt + 1
If lmcnt = 0 Or ccnt < lmcnt Then
Call mc_schedule(True, -1, reptm, prcnm)
End If
End Sub
別の標準モジュールに
'===============================================================
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'=======================================================================
Sub set_time_date()
With UserForm1
.Label1.Caption = Date
.Label2.Caption = Time
End With
DoEvents
Sleep 100
End Sub
'================================================================
Sub repeat_proc()
Call mc_schedule(True, -1, TimeValue("00:00:01"), "set_time_date")
End Sub
'======================================================================
Sub main()
UserForm1.Show
End Sub
最後にUserform1のモジュール
'======================================================================
Sub UserForm_Activate()
repeat_proc
End Sub
'======================================================================
Private Sub UserForm_Terminate()
Call mc_schedule(False)
End Sub
これでmainを実行してみてください
>パパちさんすみません、わざわざ提案していただいて。
>レスポンスが悪くなれば、パパちさんのを採用してみます。
|
|