VBA Excel宏毫秒时序

时间:2012-05-03 19:46:47

标签: excel vba excel-vba

我正在尝试在VB中为宏电子表格编写一个宏,该电子表格以特定的时间间隔执行,这些时间间隔由电子表格本身中包含的值(以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 个答案:

答案 0 :(得分:3)

对于1/10秒的Application.Wait (Now + 0.000001)一样简单:

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

答案 1 :(得分:1)

Excel不能在整秒内完成任何操作。

您的代码存在一些问题:

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

TimeValue()只能在整秒内工作,因此t是否为分数并不重要,因为TimeValue()会丢弃任何小数部分。

宏将在t为零的情况下运行,但它不受控制且不规则。我怀疑这是Excel VBA在几毫秒内无法工作的部分原因:VBA代码的执行不够准确。

不幸的是,由于VBA无法在几毫秒内完成,我无法建议一种方法。

答案 2 :(得分:0)

使用Sleep API。

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

答案 3 :(得分:0)

如果不需要使用精确的毫秒值,但只需要#34;尽快",你可以使用 TimeSerial(0,0, 0