Excel VBA質問箱 IV

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

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


987 / 13645 ツリー ←次へ | 前へ→

【77067】0.1秒単位でのマクロの実行の仕方を教えてください たか 15/5/12(火) 22:30 質問[未読]
【77068】Re:0.1秒単位でのマクロの実行の仕方を教え... β 15/5/12(火) 23:33 発言[未読]
【77069】Re:0.1秒単位でのマクロの実行の仕方を教え... たか 15/5/13(水) 0:20 発言[未読]
【77070】Re:0.1秒単位でのマクロの実行の仕方を教え... β 15/5/13(水) 5:52 質問[未読]
【77071】Re:0.1秒単位でのマクロの実行の仕方を教え... γ 15/5/13(水) 7:15 発言[未読]
【77072】Re:0.1秒単位でのマクロの実行の仕方を教え... β 15/5/13(水) 7:44 発言[未読]

【77067】0.1秒単位でのマクロの実行の仕方を教え...
質問  たか  - 15/5/12(火) 22:30 -

引用なし
パスワード
   はじめまして、
VBAを始めて、10日目の初心者です。
皆様方のお力をおかりしたくて投稿させて頂きます。

下記のようにマクロを書くと、10:00:00に「予定時刻になりました」と
いうメッセージ出すことができますが、10:00:00に0.4秒遅れて、
10:00:00.4にメッセージを出す(それ以降のマクロを動かす)には
どのようにしたら良いのでしょうか?

初心者で申し訳ございませんが、宜しくお願い致します。


Sub test()

Dim DatTime As Date
  DatTime = TimeValue("10:00:00")
  Application.OnTime DatTime, "show_msg"

End Sub

Sub show_msg()

MsgBox "予定時刻になりました"

End Sub

【77068】Re:0.1秒単位でのマクロの実行の仕方を教...
発言  β  - 15/5/12(火) 23:33 -

引用なし
パスワード
   ▼たか さん:

0.1秒という、一瞬の時間を【正確に】ということですか?
もしかしたら、10:00:00 に実行されたら、そのあとすぐにということではないのですか?
そもそも、10:00:00 にメッセージが出たとします。
メッセージがでている間は、このメッセージを出しているプロシジャは終了していませんので
たとえ 10:00:00:01 に予定されている処理があったとしても走りませんよ。
走るのは、あくまで、10:00:00 に実行されたプロシジャが終了した後です。
その時には、もう、すっかり 10:00:00:01 は過ぎ去っていますよねぇ・

なので、要望がいまいちわからないですねぇ。

まぁ、そういうこととは別に、秒以下の制御をしようとすれば通常はAPIを引っ張り出すところですが
VBA標準のTimerを使っても、ある程度のことはできます。

h tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=33079;id=excel

↑のなかの ichinose さんの投稿を参考にしてください。


>はじめまして、
>VBAを始めて、10日目の初心者です。
>皆様方のお力をおかりしたくて投稿させて頂きます。
>
>下記のようにマクロを書くと、10:00:00に「予定時刻になりました」と
>いうメッセージ出すことができますが、10:00:00に0.4秒遅れて、
>10:00:00.4にメッセージを出す(それ以降のマクロを動かす)には
>どのようにしたら良いのでしょうか?
>
>初心者で申し訳ございませんが、宜しくお願い致します。
>
>
>Sub test()
>
>Dim DatTime As Date
>  DatTime = TimeValue("10:00:00")
>  Application.OnTime DatTime, "show_msg"
>
>End Sub
>
> Sub show_msg()
>
> MsgBox "予定時刻になりました"
>
>End Sub

【77069】Re:0.1秒単位でのマクロの実行の仕方を教...
発言  たか  - 15/5/13(水) 0:20 -

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

ありがとうございます。
微妙に狂った時計に合わせたいということです。
正確さより、10:00:00より遅れたら0.1秒とか0.2秒とか遅らせたい、
10:00:00より早まったら、0.1秒とか0.2秒とか早くさせたい。
1秒早いとか1秒遅いでは、早すぎ/遅すぎ、という要望です。

回答例が、now()にプラスすることなので、少し早めるとか(例えば9:59:59.9)
とか、少し遅くする(10:00:00.1)にするには、自分のちからでは、1週間以上
かかりそうです。

初級者ではなくて、初心者ですみません。


>0.1秒という、一瞬の時間を【正確に】ということですか?
>もしかしたら、10:00:00 に実行されたら、そのあとすぐにということではないのですか?
>そもそも、10:00:00 にメッセージが出たとします。
>メッセージがでている間は、このメッセージを出しているプロシジャは終了していませんので
>たとえ 10:00:00:01 に予定されている処理があったとしても走りませんよ。
>走るのは、あくまで、10:00:00 に実行されたプロシジャが終了した後です。
>その時には、もう、すっかり 10:00:00:01 は過ぎ去っていますよねぇ・
>
>なので、要望がいまいちわからないですねぇ。
>
>まぁ、そういうこととは別に、秒以下の制御をしようとすれば通常はAPIを引っ張り出すところですが
>VBA標準のTimerを使っても、ある程度のことはできます。
>
>h tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=33079;id=excel
>
>↑のなかの ichinose さんの投稿を参考にしてください。
>
>

【77070】Re:0.1秒単位でのマクロの実行の仕方を教...
質問  β  - 15/5/13(水) 5:52 -

引用なし
パスワード
   ▼たか さん:


質問の意図を取り違えていたようです。
10:00:00に何か実行、そして、さらに 10:00:00:04 にも 何か実行。
こういうように受け取ってしまいました。
そうではなく、10:00:00:04 に何か実行ということだったんですね。
失礼しました。

微妙に狂った時計に合わせるということなら、OnTime では苦しいですね。
ichinoseさんのサンプルのように 0.1秒加えたつもりでも、実際には 0.2秒おくれたり
0.3秒遅れたりしますから。Now() そのもので実行しても、0.1秒程度は遅れることもあります。

精密さを求めるなら API の SetTimer,KillTimer でしょうね。

h tp://note.phyllo.net/?eid=1106267

ただ、これは時刻指定ではなく、指定ミリ秒後に実行ということになりますから
10:00:00:04 まで、何ミリ秒なのかを計算しなければいけません。
計算している間に、その計算結果のミリ秒の値が求めるべきものではなくなっているとか?

何よりも、この時刻はPC設定時刻ですから、これが0.4秒くるっていれば意味がないですね。
(おうおうにして、これぐらいはくるってますよね)

なやみますね。

たとえば 10:00:00 に実行予約しておく。
で、その予約されたプロシジャの先頭で 4ミリ秒停止させる。
Application.Wait は(原則)秒単位ですので、精密にやろうとすれば、API のSleep を用いる。
でも、これにも誤差はあります。平気で 10〜15ミリ秒は狂うみたいです。

h tp://dream-drive.net/archives/2011/09/excel_vba1wait.html
h tp://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1467582304

結論からいえば、4ミリ秒の精度は困難では?
お役に立てずごめんなさい。

【77071】Re:0.1秒単位でのマクロの実行の仕方を教...
発言  γ  - 15/5/13(水) 7:15 -

引用なし
パスワード
   横からすみません。
0.4秒は、400ミリ秒ではないでしょうか。
ご指摘のSleepで調整する方法がよいかもしれませんね。

# 勉強始めて10日ですか。長足の進歩ですね。

余談:
平成27年(2015年)7月1日(水)は うるう秒の調整があるようですね。

【77072】Re:0.1秒単位でのマクロの実行の仕方を教...
発言  β  - 15/5/13(水) 7:44 -

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

いつもありがとうございます。

>0.4秒は、400ミリ秒ではないでしょうか。

汗、汗! です。

これなら、Ontime で 10:00:00 、先頭で 400ミリ秒のSleep でいけそうですね。

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