• VBA定时执行某程序


    OnTime 方法
    参阅应用于示例特性安排一个过程在将来的特定时间运行(既可以是具体指定的某个时间,也可以是指定的一段时间之后)。

    expression.OnTime(EarliestTime, Procedure, LatestTime, Schedule)
    expression      必需。该表达式返回一个 Application 对象。

    EarliestTime      Variant 类型,必需。设置过程开始运行的时间。

    Procedure      String 类型,必需。设置要运行的过程名。

    LatestTime      Variant 类型,可选。过程开始运行的最晚时间。例如,LatestTime 参数设为 EarliestTime + 30,当时间到了 EarliestTime 时,如果由于其他程序处于运行状态 Microsoft Excel 不处于“就绪”、“复制”、“剪切”或“查找”模式,则 Microsoft Excel 将等待 30 秒让第一个过程先结束运行。如果 30 秒内 Microsoft Excel 不能回到“就绪”模式,则不运行此过程。如果省略该参数,Microsoft Excel 将一直等待到可以运行该过程为止。

    Schedule      Variant 类型,可选。如果该值为 True,则安排一个新的 OnTime 过程。如果该值为 False,则清除先前设置的过程。默认值为 True。

    说明
    使用 Now + TimeValue(time) 可安排经过一段时间(从现在开始计时)之后运行某个过程。使用 TimeValue(time) 可安排某个过程只运行指定的时间。

    示例
    本示例设置 15 秒后运行 my_Procedure 过程,从现在开始计时。

    Application.OnTime Now + TimeValue("00:00:15"), "my_Procedure"

    本示例设置 my_Procedure 在下午 5 点开始运行。

    Application.OnTime TimeValue("17:00:00"), "my_Procedure"

    本示例撤消前一个示例对 OnTime 的设置。

    Application.OnTime EarliestTime:=TimeValue("17:00:00"), _
        Procedure:="my_Procedure", Schedule:=False

    Sub hi()
       Debug.Print "hello"
    End Sub
    
    Sub AutoRun()
      hi
      Application.OnTime TimeValue("14:03:00"), "AutoRun"
    End Sub
    

      

    在工作中我们经常需要定时执行某程序,或者有时需要每隔特定时间执行某个程序,例如我们需要每15分钟执行一次保存的动作,这个功能在VBA中是通过Application.OnTime函数来实现的。这个函数有两个参数,一个是执行程序的时间,另一个是要执行的程序名称。下面来看一代简单代码

    Sub macro1()
    Dim NewTime As Date
    NewTime = Now + TimeValue("00:00:05")
    Application.OnTime NewTime, "Macro2"
    End Sub

    Sub macro2()
    MsgBox "你执行了程序Macro2"
    End Sub

    上面Macro1代码的意思是在5秒之后执行宏Macro2,在Macro1中我们定义了一个日期变量NewTime,其值是当前时间加上5秒,注意下这里时间的写法,"hh:mm:ss"时、分、秒。之后用到application.ontime函数,两个参数上面说过了,一个代表时间,一个代表要执行的程序。要想在5秒之后执行Macro2,你首先要手动运行Macro1,这样5秒之后才会运行Macro2,这点很重要,不要以为写出了这个代码其就可以自动运行了。

    上面只是在特定时间执行某程序,那现在如果我们要循环执行某程序怎么办?比如我们每隔10秒钟就要执行一次自动保存的动作。这也好办,看下面的代码

    Sub 自动保存()
    Dim NewTime
    NewTime = Now + TimeValue("00:00:05")
    ThisWorkbook.Save
    Application.OnTime NewTime, "自动保存"
    End Sub

    在这里我们没有用两个程序,而是将要执行的代码也嵌入到了Application.OnTime程序中,Application.OnTime NewTime, "自动保存",看到了吧,我们执行的是程序自身,每5秒调用一下本程序,运行的时候又设定了5秒之后执行本程序,形成了一个循环,这就达到了我们定时循环执行某动作的目的。

    Sub hi()
       Debug.Print "hello"
    End Sub
    
    Sub AutoRun()
      hi
      Application.OnTime Now + TimeValue("00:00:05"), "AutoRun"
    End Sub
    

      

    上面说过要这些程序首先要手动运行一次,如果想要打开工作簿就自动执行,那在Open事件中调用一下就可以了

    Private Sub Workbook_Open()
    Call 自动保存
    End Sub

    Public TimerEnabled As Boolean
      
      Sub EnableTimer() '开始
        TimerEnabled = True
        StartTimer
      End Sub
      
      Sub DisableTimer() '停用
        TimerEnabled = False
      End Sub
      
      Sub StartTimer()      '注意改代码需要放在模块级
          If TimerEnabled = True Then
            Application.OnTime Now + TimeValue("00:00:01"), "StartTimer" '每1秒钟自动运行一次
            Work '需要每秒运行的代码
          End If
      End Sub
      
      Sub Work()
        Sheet1.Cells(1, 1) = Sheet1.Cells(1, 1) + 1
      End Sub
    

      

  • 相关阅读:
    linux环境变量(一)
    linux常用命令-ps
    linux实用小命令--查看文本内容
    postman tests常用方法
    Vue 中嵌套 Iframe,用postMessage通信 踩坑记
    [Vue warn]: Error in nextTick: "RangeError: Maximum call stack size exceeded"
    对STM32所用位带操作宏的详细剖析
    移植Modbus TCP二
    移植Modbus TCP一
    STM32位带操作
  • 原文地址:https://www.cnblogs.com/yuhuameng/p/10224249.html
Copyright © 2020-2023  润新知