重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

こんにちは。
エクセルVBAにて次のようなプログラムを作成しておりますが思考のループに入ってしまった為御助力をお願いします。
メインルーチンをキーボード「↑」が押されるまでループする。
その中で処理Aを1秒間隔、処理Bを5秒間隔、処理Cを30秒間隔に実行させる。
※今回はサンプルコードの為DEBUG.PRINTを実行させる。
現状ループの中にApiSleepを入れ1/1000で制御しています。

処理を実行させると若干もたつきが感じられます。
正確な時間計測は必要としていませんのでシステム日付程度の精度を求めています。
方法は幾つかあると思いますがご協力をお願いします。

以下サンプルコード
Public Type TestType
  XTime As Integer
  XBack As Integer
End Type
Sub Sample()
  Dim KeyChk As Integer
  'Dim ThisTime As Integer
  Dim Ret1 As TestType
  Dim Ret2 As TestType
  Dim Ret3 As TestType
  KeyChk = 0
  With Ret1
    .XTime = 1
    .XBack = .XTime
  End With
  With Ret2
    .XTime = 5
    .XBack = .XTime
  End With
  With Ret3
    .XTime = 30
    .XBack = .XTime
  End With

  Do
    KeyChk = GetAsyncKeyState(VK_UP)
    Sleep (1000)
    'ThisTime = ((Hour(Time) * 60) + Minute(Time) * 60) + Second(Time)
    With Ret1
      If .XTime = 0 Then
        Debug.Print "処理A実行"
        .XTime = .XBack
      Else
        .XTime = .XTime - 1
      End If
    End With
    With Ret2
      If .XTime = 0 Then
        Debug.Print "処理B実行"
        .XTime = .XBack
      Else
        .XTime = .XTime - 1
      End If
    End With
    With Ret3
      If .XTime = 0 Then
        Debug.Print "処理C実行"
        .XTime = .XBack
      Else
        .XTime = .XTime - 1
      End If
    End With
  Loop While KeyChk = 0
  MsgBox ("終了")
End Sub

API宣言及び仮想キー宣言は省略

A 回答 (1件)

sleepの代わりにこんなのを見つけましたがいかがでしょうか


http://support.microsoft.com/kb/231298/ja
hTimer = CreateWaitableTimer(0, True, App.EXEName & "Timer")
のところを、
hTimer = CreateWaitableTimer(0, True, Application.Name & "Timer")
に変更したら、ご提示のコードのsleep(1000)のところを、wait(1)にして、動作いたしました。
実行中にワークシートを操作した感じでは、sleep(1000)と、DoEventsの組合せよりセル操作が軽快な気がします。但し、↑キーへの反応は鈍くなります。

この回答への補足

提示して頂いたコードですと確かにキー待ちの反応が悪くなりますね。
とりあえず別案を検討して見ます。

補足日時:2010/01/04 17:25
    • good
    • 0
この回答へのお礼

先のコードでは処理実行の判断としてカウントダウンを使用していましたが逆に実行時間を設定させインターバルを速くして精度を上げて見ました。
インターバルが速くなったことによりキー待ちの反応がかなり改善されました。
処理AからCを実際のコードに置き換え実行しましたがボチボチの反応でしたので現状で行きます。
ありがとうございました。

お礼日時:2010/01/04 17:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!