• ベストアンサー

エクセルVBAでms単位でのタイマ(wait)

エクセルVBAで制御をやりたいと思っています。 描画を切ったらそれなりの実行速度が出るのは確認済みなのですが、実行環境のスペックによってかなりばらつきがあるので、ちゃんとしたタイマを実装したいと思っています。 秒単位のスリープ的なものは検索して何件か見つけたのですが、ms単位でのwaitは見つかりません。 何かいい方法をご存じないでしょうか。 PS: 多重ループを毎回はさんで負荷をかけて実行速度を下げるやりかただと、環境依存が強すぎました。 Pentium4でちょうどいいのウェイトに使ってた関数がcore i7だと瞬殺だったりで、これは使えないなと。

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

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

色々な方法があります。 単に何もしないで待つだけならSleepがあります。 Declare Sub Sleep Lib "KERNEL32" (ByVal ミリ秒 As Long) Sub 待機()   Sleep 1000 '1秒の待機 このAPIはCPUのタイムスライスをOSに返すため、 休止中にはCPUに負荷がかかりません。 何か処理しながら時間を計測する場合はタイマの 割り込みを使う方法があります。これはウィンドウの サブクラス化などを伴うので、アーキテクチャに詳し くないと難しいことになります。 この他の手段としてはGetTickCountがあります。 これはマシンが起動してからの時間をミリ秒単位で 返すものです。 Declare Function GetTickCount Lib "KERNEL32" () As Long Sub 待機() Dim 終了 As Long 終了 = GetTickCount + 1000 '1秒後 Do     Sleep 1     DoEvents Loop Until GetTickCount >= 終了 これ以上の分解能が必要な場合は以下の関数も あります。 QueryPerformanceCounter '起動後の経過時間 QueryPerformanceFrequency '1秒あたりのカウント値 使い方はGetTickCountと同様に経過時間をカウンタに 持っています。精度は私のPCでは約0.45ナノ秒です。 こちらはサポートしていないPCもあります。また、扱う データが64ビットなので、計算が面倒です。 タイマ割り込みと、高分解能タイマに関しては興味が あるなら、再度ご質問ください。

hmhm39
質問者

お礼

詳しく説明していただいてありがとうございます!! ms以下も設定できるんですね。 いろいろためになりました。

その他の回答 (1)

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.1

Sleepとかいかがでしょう http://hinekure.vba-soft.com/?eid=245424

hmhm39
質問者

お礼

Sleepってそのまま使えたんですね! どこかで、Sleepは使えない的なことを聞いて、試していませんでした。 ありがとうございます!

関連するQ&A