こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VBAのapplication.ontime メソッドでの日付を超えた設定方法について

VBAのapplication.ontime メソッドでの日付を超えた設定方法について
EXCEL VBAを使って、2×10^n, 5×10^n, 10×10^n (n=2~6)秒ごとに
測定器からデータを取得する下のようなプログラムを作りました。
測定開始時刻から起算した時刻を表に書き込み、それを読み込んで
application.ontimeで測定マクロを起動しようとするものです。
Dim clk, clk2, clk5, clk10 As Variant
Dim i, j, n As Integer

Sheet1.Range("A1") = Date
Sheet1.Range("B1") = Time
Sheet1.Range("C1") = Now
Sheet1.Range("D1") = 6 '時刻表の読取り開始位置指定
n = 6 '時刻表の書込み開始位置指定
clk = Now '開始時刻設定

For i = 3 To 5
c2 = 2 * 10 ^ i
Sheet1.Range("A" & LTrim(Str(n))) = c2 * 1000 '繰返し回数 2×10^i(k回)
clk2 = DateAdd("s", c2, clk) '2×10^i(k回)の時刻計算
Sheet1.Range("B" & LTrim(Str(n))) = clk2 '時刻表への書込み
mdate = CStr(Format(clk2, "yyyy/mm/dd")) '日付の抽出
mtime = Format(clk2, "h:m:s") '時刻の抽出
Sheet1.Range("C" & LTrim(Str(n))) = mdate '日付の書込み
Sheet1.Range("D" & LTrim(Str(n))) = mtime '時刻の書込み
n = n + 1 '時刻表書込み位置を1進める

c5 = 5 * 10 ^ i
Sheet1.Range("A" & LTrim(Str(n))) = c5 * 1000
clk5 = DateAdd("s", c5, clk)
Sheet1.Range("B" & LTrim(Str(n))) = clk5
mdate = CStr(Format(clk5, "yyyy/mm/dd"))
mtime = Format(clk5, "h:m:s")
Sheet1.Range("C" & LTrim(Str(n))) = mdate
Sheet1.Range("D" & LTrim(Str(n))) = mtime
n = n + 1

c10 = 10 * 10 ^ i
Sheet1.Range("A" & LTrim(Str(n))) = c10 * 1000
clk10 = DateAdd("s", c10, clk)
Sheet1.Range("B" & LTrim(Str(n))) = clk10
mdate = CStr(Format(clk10, "yyyy/mm/dd"))
mtime = Format(clk10, "h:m:s")
Sheet1.Range("C" & LTrim(Str(n))) = mdate
Sheet1.Range("D" & LTrim(Str(n))) = mtime
n = n + 1

Next i

For j = 6 To 14
mdate = Str(Sheet1.Range("C" & LTrim(Str(j)))) '測定日付読込み
mtime = Sheet1.Range("D" & LTrim(Str(j))) '測定時刻読込み
待ち時間 = TimeValue("0時00分30秒")
Application.OnTime (mtime) + DateValue(mdate), "measure", TimeValue(待ち時間)
Next j
End Sub
同日付の間は動くのですが、日付が変わると止まってしまいます。
Ontimeメソッドでは日付を指定すれば日付超え時刻指定ができると
聞き、日付、時刻を別の変数として指定する方法も試しましたが、型が一致しないエラーが出て困っています。
Application.OnTime TimeValue(mtime) + DateValue(mdate),  ・・・
上手い設定方法はないものでしょうか

投稿日時 - 2009-02-27 12:33:04

QNo.4753356

困ってます

質問者が選んだベストアンサー

コードはよく見てませんが…

充分に先の時間(数秒後?)であることがわかっているのですから、
 expression.OnTime(EarliestTime, Procedure)
の構文を利用すればいいのでは?

今からd日(d:整数) と hh:mm:ss 時間後にスタートであれば
 Application.OnTime Now + n + TimeValue("hh:mm:ss") , "measure"
でいけると思います。

>型が一致しないエラーが出て困っています。
TimeValueは24時間を越える数値だと、このエラーになるようですが、それが原因ではないでしょうか?

投稿日時 - 2009-02-27 15:48:18

補足

ご指摘ありがとうございました。
試しに単純化した下のマクロを実行しPCの時計を一時的に進めてテストしたところ、所望の動作を確認することができました。
Sub test()
Dim mtime, mdate, clk, c, d As Variant
Sheet1.Range("A1") = Date
Sheet1.Range("B1") = Time
Sheet1.Range("C1") = 3
For i = 3 To 6
d = Sheet1.Range("A" & LTrim(Str(i)))  '日差指定
c = Sheet1.Range("B" & LTrim(Str(i)))  '時差指定
mdate = DateAdd("d", d, Date)      '動作日付計算
mtime = DateAdd("s", c, Time)      '動作時刻計算
Sheet1.Range("C" & LTrim(Str(i))) = mdate
Sheet1.Range("D" & LTrim(Str(i))) = mtime
Application.OnTime TimeValue(mtime) + DateValue(mdate), "print_txt"
Next i
End Sub

結局、他のジョブと競合した場合の待ち時間指定に付けていたLatestTimeを削除したところ、問題なく動くことがわかりました。
本番のマクロに組み込んで、テストしてみようと思います。

投稿日時 - 2009-03-03 16:18:33

お礼

ありがとうございました。
測定日時、測定時刻の指定方法を見直して見ました。
VBAは初心者なのでマニュアルやヘルプ画面と首っ引きで
マクロを作成していますが、なかなか進展しません。

投稿日時 - 2009-03-03 16:31:47

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問