3

スプレッドシート自体に含まれる値(Hz)によって定義される特定の間隔で実行されるExcelスプレッドシートのマクロをVBで作成しようとしています。私の問題は、この方法で自動マクロを実行するために見つけたコードは、2番目の精度しか許容しないように見えるため、1Hzを超える周波数は使用できないことです。可能であれば10Hz程度まで上げたいのですが、これにはミリ秒の精度が必要です。

私はVBを初めて使用するので、VBについてはよくわかりません。コードは次のとおりです。

Sub Macro2()
    Range("K1").Select
    Dim f As Single
    f = ActiveCell.Value
    Dim t As Integer
    t = 1 / f
    dTime = Now + TimeSerial(0, 0, t)
    Application.OnTime dTime, "Macro2"
    Range("J1").Select
    Dim c As Integer
    c = ActiveCell.Value
    c = c Xor 1
    ActiveCell.Value = c
End Sub

この方法を使用してミリ秒の精度を得る方法はありますか?

4

4 に答える 4

3

Application.Wait (Now + 0.000001)1/10秒の場合と同じくらい簡単です:

Sub Macro2()
' Macro2 Macro
Range("C1").FormulaR1C1 = "1"
Application.Wait (Now + TimeValue("0:00:01")) '1sec
Range("C1").FormulaR1C1 = "2"
Application.Wait (Now + 0.000001) '1/10sec
Range("C2").Select
Sleep (100)
End Sub
于 2015-11-30T14:53:57.487 に答える
1

Excelは1秒未満では機能しません。

コードにはいくつかの問題があります。

定義Dim t As Integerして割り当てを続行します。これは、1より大きいt = 1 / f値の場合、ゼロになることを意味します(整数に制限されているため)。ft

TimeValue()は数秒でしか機能しないため、小数部分が破棄されるtため、小数であるかどうかは関係ありません。TimeValue()

マクロはtゼロで実行されますが、制御されておらず、不規則です。これが、Excel VBAがミリ秒単位で機能しない理由の一部だと思います。VBAコードの実行は、十分に正確ではありません。

残念ながら、VBAはミリ秒単位で動作できないため、動作させる方法を提案することはできません。

于 2012-05-03T20:32:17.727 に答える
0

SleepAPIを使用します。

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub Macro2()
    Range("K1").Select
    Dim f As Single
    f = ActiveCell.Value
    If f = 0 Then Exit Sub
    Dim t As Long
    t = 1000 / f
    Sleep t
    Range("J1").Select
    Dim c As Integer
    c = ActiveCell.Value
    c = c Xor 1
    ActiveCell.Value = c
    Macro2
End Sub
于 2012-05-04T13:26:30.177 に答える
0

ミリ秒の正確な値を使用する必要がなく、「できるだけ早く」のみ使用する必要がある場合は、TimeSerial(0、0、0)を使用できます

于 2017-12-05T05:42:02.230 に答える