3

我正在尝试在 VB 中为 Excel 电子表格编写一个宏,该电子表格以特定间隔执行,该间隔由电子表格本身中包含的值(以 Hz 为单位)定义。我的问题是我发现以这种方式完成自动宏的代码似乎只允许第二精度,因此任何高于 1Hz 的频率都是不可能的。如果可能的话,我希望能够达到 10Hz 左右,这需要毫秒级的精度。

我是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/10sec 一样简单:

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 在不到整秒的时间内无法工作。

您的代码有几个问题:

您定义Dim t As Integer并继续分配t = 1 / f,这意味着对于任何f大于一的值,t将为零(因为它被限制为整数)。

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 回答