VBの初心者です。
一定間隔を待たせる下記のようなルーチンを作成しましたが、間隔が一定にできません。いい方法をご存知ありませんか?
call 時間wait("00:00:03")'3秒待たせる
Private Sub 時間wait(t As String)
Dim StartTime As Date
Dim KeikaJikan As Date
Timer1.Enabled = True
'スタートの時刻を記憶
StartTime = Time()
Do Until KeikaJikan >= t
DoEvents
'スタートからの差を計算
KeikaJikan = Time() - StartTime
Loop
Timer1.Enabled = False
End Sub
Timeだと、ミリ秒単位での判断ができないです。
APIのGetTickCountを使いましょう。
あなたのコードを尊重するならこう
Option Explicit
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Private Sub Command1_Click()
Call 時間wait("00:00:03") '3秒待たせる
End Sub
Private Sub 時間wait(t As String)
Dim StartTime As Long
Dim KeikaJikan As Long
Dim t2 As Double
'ミリ秒に換算
t2 = CDate(t) * 86400 * 1000
'スタートの時刻を記憶
StartTime = timeGetTime()
Do Until KeikaJikan >= t2
DoEvents
'スタートからの差を計算
KeikaJikan = timeGetTime() - StartTime
DoEvents
Loop
End Sub
やや不正確だがTimerを使うなら、たとえばこう
(TimerにはWin95でせいぜい55msec程度の精度しかない。)
Option Explicit
Dim KeikaJikan As Long
Private Sub Command1_Click()
Call 時間wait("00:00:03") '3秒待たせる
End Sub
Private Sub 時間wait(t As String)
Dim t2 As Double
'秒に換算
t2 = CDate(t) * 86400
KeikaJikan = 0
Timer1.Interval = 1000
Timer1.Enabled = True
Do Until KeikaJikan >= t2
DoEvents
Loop
Timer1.Enabled = False
End Sub
Private Sub Timer1_Timer()
KeikaJikan = KeikaJikan + 1
End Sub
一番簡単なのはこう
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub Command1_Click()
Dim t2 As Long
'ミリ秒に換算
t2 = CDate("00:00:03") * 86400 * 1000
Sleep t2
End Sub
[たかみちえさん]、[Say]さんアドバイスありがとうございます。
[Say]さんのアドバイスでテストしてみたところ正確な待ち時間を作ることができました。ほんとうにありがとうございました。
[たかみちえ]さんにアドバイスしていただいた方法も、ホームページなどで調べて試してみます。
初心者なものですから、簡単なことでも調べるのに時間がかかってしまいます。
どうしてもわからなかったら、また質問させていただきます。
そのときは、簡単なサンプルコードでもおしえてください。
お二人のご親切に感謝します。
GetTickCountはtimeGetTimeと使い方はほぼ同じです。
単に、誤差がGetTickCountで5〜12msec,timeGetTimeでほぼ1msecで、
timeGetTimeのほうが精度が高い、と思ってもらって結構です。