VBA: 因为1个简单时间clock引发得一连串问题, application.ontime 不会自循环,而 call 自身或者 go label则会真的自循环。

 

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值