VB Excelmacros毫秒定时

我正在尝试在VB中编写一个Excel电子表格的macros,该电子表格是在特定的时间间隔内执行的,这些时间间隔由电子表格中包含的值(以Hz为单位)来定义。 我的问题是,我发现用这种方法完成一个自动macros的代码似乎只允许第二个精度,所以任何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 

有没有办法使用这种方法获得毫秒精度?

Excel不能在整个秒钟内运行。

你的代码有几个问题:

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

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

macros将运行t为零,但它是不受控制和不规则的。 我怀疑这是Excel VBA不能以毫秒为单位工作的部分原因:VBA代码的执行不够准确。

不幸的是,因为VBA不能在毫秒内工作,所以我不能build议这样做。

就像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 

使用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 

如果没有必要使用毫秒的确切值,而只是“尽快”,则可以使用TimeSerial( 0,0,0