application.ontime
application.ontime 比 application.wait要好,不会一直占用进程。
1 网上看到一个写简单自动计时的例子
- 确实可以循环执行
- 但是坏处是,会一直循环执行
- 但是application.ontime 比 application.wait要好,不会一直占用进程。
Sub clock0()
Range("a1").Value = Time()
testcount0
End Sub
Sub testcount0()
Application.OnTime Now() + TimeValue("00:00:01"), procedure:="clock0"
End Sub
2自己改写了一个,自己调用自己,也可以循环执行,同网上例子效果
Sub clock3()
Range("a1").Value = Time()
Application.OnTime Now() + TimeValue("00:00:01"), procedure:="clock3"
End Sub
用go1 应该也能实现
3 但是马上就想到,要执行有限次怎么修改
- 达到了有限次计次的效果
- 为什么不用application.ontime ,因为做不到循环执行
- application.ontime 好像只会执行一次
- 我是用application.wait 达到类似的效果,但wait会卡住占住进程,执行时干不了别的
Sub testcount2()
count1 = 0
Do Until count1 >= 10
Application.Wait Now() + TimeValue("00:00:01")
Range("a1").Value = Time()
count1 = count1 + 1
Range("b1").Value = count1
Debug.Print "count=" & count1
Loop
End Sub
4 测试用application.ontime 循环调用计时,但是不好使
-
application.ontime 相当于多线程?
-
application.ontime 相当于开启了一个计划外任务,且定时的
-
application.ontime 感觉会等其他程序执行完了,才会开始执行,而且在本例子里不会循环。
Sub clock1()
Range("a1").Value = Time()
End Sub
Sub testcount1()
i = 0
For i = 1 To 10 '循环不加处理,则会瞬间执行完成,不会等待
Range("b1") = i
Application.Wait Now() + TimeValue("00:00:01") 'wait会占住进程,干不了其他事情,ontime最灵活
Application.OnTime Now() + TimeValue("00:00:00"), procedure:="clock1" '即使TimeValue("00:00:00")也循环完成后只执行1次,?
Debug.Print i
Next
End Sub
5 即使在一个函数里用application.ontime重复调用自己,其实一次只会执行1次,并不会像 call 自身函数名 或 go label 这样,会循环执行自己
- 函数内,自己调用自己,会循环执行(可以提前写跳出条件),用 call 自身 或 自身就可以
- go label 也可以
- 但是 application.ontime 写着看起来像自循环,但实际上并不会
Public count
Sub clock7()
If count <= 3 Then
Debug.Print count
Debug.Print "clock1执行"
' Call clock7 '错误,必须在count=count+2 之后,否则调用时机不对,会死循环
Range("a1").Value = Time()
Debug.Print "clock2执行"
count = count + 2
' Call clock7 '或者用 go 1 ?
Debug.Print "clock3执行"
Application.OnTime Now() + TimeValue("00:00:01"), procedure:="clock7" '事实证明,这个Application.OnTime不会重复执行,只会调用自己1次
Debug.Print "clock4执行"
End If
End Sub
Sub count7()
count = 0
Call clock7
Do While count <= 5
Application.Wait Now() + TimeValue("00:00:01")
count = count + 1
Range("b1").Value = count
Debug.Print count
Debug.Print "count执行"
Loop
End Sub
这样测试也是
- for 循环时瞬时计算,不停的。
- 想要间隔时间,就要加类似的 application.wait等
- 另外 clock6()里写了application.ontime clock6 其实只会执行1次,并不会循环。而用call clock6 则会循环,可测试
- 调用count6()试一下就知道
Public count
Sub clock6()
If count <= 3 Then
Debug.Print count
Debug.Print "clock执行"
' Range("a1").Value = Time()
Application.OnTime Now() + TimeValue("00:00:01"), procedure:="clock6"
count = count + 2
' Call clock6
End If
End Sub
Sub count6()
count = 0
Call clock6
Do While count <= 5
Application.Wait Now() + TimeValue("00:00:01")
count = count + 1
Range("b1").Value = count
Debug.Print count
Debug.Print "count执行"
Loop
End Sub
如果用call 会真自循环
- 记得要用 公共变量 public 或者private 传递变量数据到不同的sub
- 执行count5 可以发现, clock5 时瞬时完成的,但是count5内是逐秒执行的
Public count
Sub clock5()
If count <= 5 Then
Debug.Print count
Debug.Print "clock执行"
' Range("a1").Value = Time()
' Application.OnTime Now() + TimeValue("00:00:01"), procedure:="clock4"
count = count + 2
Call clock5
End If
End Sub
Sub count5()
count = 0
Call clock5
Do While count <= 10
Application.Wait Now() + TimeValue("00:00:01")
count = count + 1
Range("b1").Value = count
Debug.Print count
Debug.Print "count执行"
Loop
End Sub