Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4152 / 13646 ツリー ←次へ | 前へ→

【58052】時間の自動更新について ぴぐぴぐ 08/9/29(月) 23:12 質問[未読]
【58055】Re:時間の自動更新について ichinose 08/9/30(火) 6:00 発言[未読]
【58164】Re:時間の自動更新について パパち 08/10/7(火) 9:02 回答[未読]
【58174】Re:時間の自動更新について ぴぐぴぐ 08/10/7(火) 12:57 お礼[未読]
【58184】Re:時間の自動更新について ichinose 08/10/8(水) 8:26 発言[未読]

【58052】時間の自動更新について
質問  ぴぐぴぐ  - 08/9/29(月) 23:12 -

引用なし
パスワード
   Private Sub UserForm_Initialize()
Label11 = Date   
Label12 = Time   
End Sub

上記コードにてユーザーフォーム上にカレンダーを
表示させていますが、リアルタイムを必要とするものであり、
定期的に時刻を取得したいのですが、フォーム入力中であっても
更新することはできるのでしょうか?

【58055】Re:時間の自動更新について
発言  ichinose  - 08/9/30(火) 6:00 -

引用なし
パスワード
   ▼ぴぐぴぐ さん:
おはようございます。
テキストボックスなどに入力時は、多少、動作は、ぎこちないけど以下のようにすると、それらしい動作にはなります。


当該ユーザーフォームのモジュールに

'==================================================================
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private dt_sw As Boolean
'=======================================================================
Private Sub UserForm_Activate()
  dt_sw = True
  Do While dt_sw = True
    Label1.Caption = Date
    Label2.Caption = Time
    DoEvents
    Sleep 100
    Loop
End Sub
'====================================================================
Private Sub UserForm_Terminate()
  dt_sw = False
End Sub

上記のようにユーザーフォームを閉じる時や時刻表示が不必要な場合は、

dt_sw = False

として、ループから抜ける処理を忘れないでください。

【58164】Re:時間の自動更新について
回答  パパち  - 08/10/7(火) 9:02 -

引用なし
パスワード
   ▼ぴぐぴぐ さん:
わたしはOntimeを使用しています。
こんなかんじです。

Sub out_clock()
  dim form_timer as Date
  form_timer = Now + TimeSerial(0, 1, 0) 'この設定だと1分ごとに更新
  Application.OnTime form_timer, "out_clock"
  userform1.textbox1 = Date & "(" & WeekdayName(Weekday(Date), True) & ")-" & Format(Time, "h:mm")
End Sub

Do Wihle 〜 Loop を利用するよりも、CPUに負荷がすくなくて
すんでいます。ただ、秒までちゃんとしようとするとちらつきが気になる
ところです。

【58174】Re:時間の自動更新について
お礼  ぴぐぴぐ  - 08/10/7(火) 12:57 -

引用なし
パスワード
   ▼ichinose さん:
▼パパち さん:

おつかれさまです。
返信遅くなりすみません・・・


 ichinoseさんの案、採用させてもらいました。
ontime、一応しらべたんですが、いまいちよくわからなかったので。
パパちさんすみません、わざわざ提案していただいて。
レスポンスが悪くなれば、パパちさんのを採用してみます。

【58184】Re:時間の自動更新について
発言  ichinose  - 08/10/8(水) 8:26 -

引用なし
パスワード
   ぴぐぴぐ さん:
パパち さん:
おはようございます。

>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を実行してみてください


>パパちさんすみません、わざわざ提案していただいて。
>レスポンスが悪くなれば、パパちさんのを採用してみます。

4152 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free