我正在尝试在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
使用这种方法有没有办法获得毫秒精度?
答案 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 )