精华内容
下载资源
问答
  • VBA,实现延时自动执行的各种方法

    千次阅读 2020-03-15 09:59:07
    延时代码的问题(还没解决) 如果是使用 Application.wait now+timevalue(00:00:03) 等待时会整个卡住 如果是使用sleep sleep sleep代码,必须要加载一个特定库才可以使用 另外 sleep需要配合 doevents用 时间延迟...

    目的:想实现有限循环内的延时自动执行效果。

     

    1 前置知识

    1.1 do events

    DoEvents( )   转让控制权,以便让操作系统处理其它的事件。

    • DoEvents 函数会返回一个 Integer,以代表 Visual Basic 独立版本中打开的窗体数目,例如,Visual Basic,专业版,在其它的应用程序中,DoEvents 返回 0。
    • DoEvents 会将控制权传给操作系统。当操作系统处理完队列中的事件,并且在 SendKeys 队列中的所有键也都已送出之后,返回控制权。
    • DoEvents 对于简化诸如允许用户取消一个已启动的过程 — 例如搜寻一个文件 — 特别有用。对于长时间过程,放弃控制权最好使用定时器或通过委派任务给 ActiveX EXE 部件来完成。以后,任务还是完全独立于应用程序,多任务及时间片由操作系统来处理。
    • 小心 确保以 DoEvents 放弃控制权的过程,在第一次 DoEvents 返回之前,不能再次被其他部分的代码调用;否则会产生不可预料的结果。此外,如果其它的应用程序可能会和本过程以不可预知的方式进行交互操作,那么也不要使用 DoEvents,因为此时不能放弃控制权。

     

    1.2 timer() 计时器

    • VBA自带计时器 timer()
    • 单位是秒
    • 数据存储类型  typename(timer())=single

     

    1.3 sleep  休眠 (需声明新库 Lib "kernel32")

    • sleep  是让程序休眠一段时间
    • windows API
    • 需要加载新的库 Lib "kernel32"
    • 需要加载新的库,Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    • sleep 2000

     

    1.4 timeGettime   (需声明新库 Lib "winmm.dll" )

    • windows API
    • 需要加载新的库  Lib "winmm.dll" 
    • Private Declare Function timeGetTime Lib "winmm.dll" () As Long
    • time1 = timeGetTime

     

    2 延迟的方法1:使用timer() + doevents ,单位:秒

    • 下面是写了一个 timer()的 delay函数
    • 局限性  timer() 的原理是 从每日0点开始累计秒数,也就是过每天24:00:00 时会重新计时,不会一直累加
    • 所以要加一个判断, If time2 < 0 Then time2 = time2 + 86400 ,这个是为了防止因为timer不一直累加,而判断永远为负数
    • 单位:秒
    Sub test_print1()
        For i = 1 To 10
           Debug.Print i
           delay30 (2)
        Next
    End Sub
    
    Sub delay30(t As Single)
        Dim time1 As Single
        time1 = Timer
        Do
            DoEvents
            time2 = Timer - time1
            If time2 < 0 Then time2 = time2 + 86400
        Loop While time2 < t
        
    End Sub

    也可以直接写

    Sub test_print11()
        For i = 1 To 10
           Debug.Print i
           time1 = Timer()
           Do
              DoEvents
              time2 = Timer() - time1
              If time2 < 0 Then time2 = time2 + 86400
           Loop While time2 < 2
        Next
    End Sub

     

    3 延迟的方法2:sleep :会转圈loading,单位毫秒

    • 需要加载新的库,Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    • sleep 毫秒数
    • 另外 sleep需要配合 doevents用
    • 局限性:坏处是让系统等待,比如转圈loading

     

    3.1 直接使用sleep

    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    
    Sub test_t1()
    For i = 1 To 10
       Debug.Print i
       Sleep 2000
    Next
    End Sub

     

    3.2 用sleep写的 delay 过程或函数,调用

    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    
    Sub test_t2()
    For i = 1 To 10
       Debug.Print i
       delay_t2 (3000)
    Next
    End Sub
    
    
    Function delay_t2(t)
       Sleep (t)
    End Function
    

     

    3.3  sleep + doevents 会缓解些,但是还是会转圈等待

    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    
    Sub test_t2()
    For i = 1 To 10
       Debug.Print i
       delay_t2 (3000)
    Next
    End Sub
    
    
    Function delay_t2(t)
       Sleep (t)
       DoEvents
    End Function

     

    4  延迟的方法3:  timeGettime +doevents ,单位毫秒

    • 需要加载新的库  Lib "winmm.dll" 
    • Private Declare Function timeGetTime Lib "winmm.dll" () As Long
    • time1 = timeGetTime
    Private Declare Function timeGetTime Lib "winmm.dll" () As Long
    
    Sub test_print1()
        For i = 1 To 10
           Debug.Print i
           delay1 (2000)
        Next
    End Sub
    
    
    Sub delay1(t As Long)
        Dim time1 As Long
        time1 = timeGetTime
        Do
            DoEvents
         Loop While timeGetTime - time1 < t
    End Sub

    尝试了下,如果注掉 doevents 就会卡顿

    Private Declare Function timeGetTime Lib "winmm.dll" () As Long
    
    Sub test_print1()
        For i = 1 To 10
           Debug.Print i
           delay1 (2000)
        Next
    End Sub
    
    Sub delay1(t As Long)
        Dim time1 As Long
        time1 = timeGetTime
        Do
    '        DoEvents      '如果不加doevents 就会像sleep一样,总卡着等待
         Loop While timeGetTime - time1 < t
    End Sub

     

    5 Application.wait  方法也可以

    5.1 applcation.wait 也可以达到延时效果,但是也是要卡顿

    • 注意 application.wait () 后面跟的时间不能是时间值/段,得是时间点,所以得是 now+timevalue()
    
    Sub test_print1()
        For i = 1 To 10
           Debug.Print i
           Application.Wait (Now + TimeValue("00:00:03"))
           DoEvents
        Next
    End Sub

     

    5.2  尝试用 application.wait + doevents  也是可以的

    • 直接写 doevents 好像不行
    • 但是我用了  do   while 里  doevents 发现加不加 application.wait 都可以
    Sub test_print1()
        For i = 1 To 10
           Debug.Print i
           time1 = Now()     '中间变量固定下当时的时间
           Do
               DoEvents
           Loop While Now() < time1 + TimeValue("00:00:03")
    '       Application.Wait time1 + TimeValue("00:00:03")
        Next
    End Sub

     

    6 Application.ontime  方法?? --还没写完

     

    
    
    Sub test_print12()
        For i = 1 To 10
           Debug.Print i
        Next
    End Sub
    
    
    
    Sub test_print13()
        For i = 1 To 10
           Application.OnTime Now() + TimeValue("00:00:03"), procedure:="t12"
        Next
    End Sub
    
    
    Sub t12()
        Debug.Print i
        i = i + 1
    End Sub

     

    7  我发现单独用 doevents+时间判断 也可以

    ​
    Sub test_print1()
        For i = 1 To 10
           Debug.Print i
           time1 = Now()     '中间变量固定下当时的时间
           Do
               DoEvents
           Loop While Now() < time1 + TimeValue("00:00:02")
        Next
    End Sub
    
    ​

    也可以写出只用 doevents +时间的专门的delay() 函数或过程

    Sub test_print11()
        For i = 1 To 10
          Debug.Print i
          test_delay5 (3)
        Next
    End Sub
    
    
    Sub test_delay5(t)
       time1 = Now()
       Do
          DoEvents
       Loop While Now() < time1 + TimeValue("00:00:" & t)  '只允许设定延迟秒数
    End Sub

     

    参考资料

    https://blog.csdn.net/iamlaosong/article/details/49802327

    http://blog.sina.com.cn/s/blog_15b9821340102waqs.html

    https://blog.51cto.com/12040328/2130722

     

     

    msgbox 或 其他倒计时的

    加这个延时函数一起使用

    4 实现倒计时窗口,倒计时显示且自动关闭

     

    展开全文
  • 《优爱酷Excel VBA高级应用:数据动态可视化自定义毫秒级Wait等待函数》 自定义毫秒级Wait等待函数,期间不卡顿,动画如丝般顺滑,可开始暂停... 优爱酷Excel VBA高级应用:数据动态可视化自定义毫秒级Wait函数,...

     

    《优爱酷Excel VBA高级应用:数据动态可视化自定义毫秒级Wait等待函数》 自定义毫秒级Wait等待函数,期间不卡顿,动画如丝般顺滑,可开始暂停...

    优爱酷Excel VBA高级应用:数据动态可视化自定义毫秒级Wait函数,自定义毫秒级Wait等待函数,期间不卡顿,动画如丝般顺滑,可开始暂停

    #优爱酷# #UiCool# #vba高级应用#

    展开全文
  • VBA 等待1S 处理方法

    万次阅读 2017-07-27 15:10:34
    Application.Wait (Now + TimeValue("0:00:01")) 表示暂停1s


    Application.Wait (Now + TimeValue("0:00:01"))  表示暂停1s


    展开全文
  • 大家好,我们今日继续讲解VBA代码解决方案的第82讲内容:如何利用代码让程序延时,SLEEP函数和timeGetTime函数两个API函数的讲解。在上一讲中我们讲了使用Wait方法,但这种方法的不足是只能提供精度为1秒的延时,...

    4419d2f1d3bb3a75e5c578e71049d532.png

    大家好,我们今日继续讲解VBA代码解决方案的第82讲内容:如何利用代码让程序延时,SLEEP函数和timeGetTime函数两个API函数的讲解。

    在上一讲中我们讲了使用Wait方法,但这种方法的不足是只能提供精度为1秒的延时,如果需要更低精度的延时,需要使用Sleep API函数,如下面的代码所示。

    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

    Sub MyTypeDemo()

    Dim sTest As String

    Dim i As Integer

    sTest = "欢迎你来到这个平台学习VBA!"

    For i = 1 To Len(sTest)

    Range("A1").Value = Left(sTest, i)

    Sleep 200

    Next

    End Sub

    代码解析:

    MyTypeDemo过程模拟打字效果在单元格A1中输入一行文字。"欢迎你来到这个平台学习VBA!"

    第1行代码Sleep API函数声明,参数dwMilliseconds为以毫秒为单位的时间长度。

    在第6行到第9行代码在每次循环时增加显示的数据,并且在每次增加时使用Sleep语句延时200毫秒,好像字符逐个输入,从而达到模拟打字的效果.

    在上面的实例中,对于精确延时使用的sleep函数,使用这个函数要注意的是,由于这个函数是Windows API函数,使用前必须先声明,然后使用。 虽然sleep函数延时是毫秒级的,精确度比较高,但它在延时时会将程序挂起,使操作系统暂时无法响应用户操作,所以在长延时的时候不适合使用它。

    更好的办法是使用timeGetTime函数,timeGetTime函数返回的是开机到现在的毫秒数,可以支持1毫秒的间隔时间,而且永远增加,不存在回头的问题。当然不是永远不回头,毕竟Long型变量(双字,4字节)也是有取值范围的,这个值在0到2^32之间。大约49.71天。

    同sleep函数一样,timeGetTime函数是Windows API函数,使用前必须先声明,即:

    Private Declare Function timeGetTime Lib "winmm.dll" () As Long

    延时函数和上面的一样,只是将sleep函数换成timeGetTime:

    Private Declare Function timeGetTime Lib "winmm.dll" () As Long

    Sub S_timeGetTime()

    Dim time1 As Long

    time1 = timeGetTime

    Range("A2").Value = timeGetTime

    Do

    Range("A3").Value = timeGetTime

    DoEvents

    Loop While timeGetTime - time1 < 1000

    MsgBox "时间到!"

    End Sub

    注意:延时时间单位是毫秒。由于延时函数中使用了 DoEvents语句交出了系统控制权,所以不会影响用户的其它操作。

    代码截图:

    3971742aa66b856e2224efdca7702e3b.png

    f751f5f55bf54ff2d35da255c55f981c.png

    运行:

    e11a1ebfbfff5703cfc7de2ff798de9a.png

    dd93f154e456c32e13b168c91dd7677d.png

    今日内容回向:

    1 如何实现程序的延时呢?

    2 本节讲了两种延时的方式,是否理解呢/

    欢迎到我的自媒体平台沟通交流:个人微信号“NZ9668”、头条号“VBA专家”、百家号“VBA与GO语言”、微信公众号“NZ_9668”、社群“VBA学习交流群”。

    这一系列文章是根据我多年的工作经验编写的,也是一直在利用的工具,非常方便好用。现在分享出来,希望能对同样在职场打拼的朋友有些许的帮助,使你的工作更加高效、流畅。朋友们有问题请随时提出来,我们一起探讨学习。对数据分析有需要的公司、组织或个人可以直接联系我,及时为你提供专业的定制技术支持。

    工作不是一切。工作是每个人安身立命、成长发展的基础。但你要知道工作是永远也做不完的,时间会抹去很多问题。多关注自己、家人和朋友,这些才是我们生活中更为重要的东西。

    展开全文
  • wait方法和sleep方法的区别

    千次阅读 2018-09-16 15:25:00
    首先,要记住这个差别,“sleep是Thread类的方法,wait是Object类中定义的方法”。尽管这两个方法都会影响线程的执行行为,但是本质上是有区别的。Thread.sleep不会导致锁行为的改变,如果当前线程是拥有锁的,那么...
  • VBA研究】VBA中编写延时函数

    万次阅读 2015-11-24 11:52:42
    作者:iamlaosong1、一般延时一个应用接口需要限制运行速度,需要在循环中加个延时函数,这个延时不需要多么精确,要求有个几秒延时,网上用的比较多的就是用Timer函数编写,Timer是VBA自带的函数,用起来比较方便,...
  • EXCEL VBA常用语句100句

    千次阅读 2009-07-31 10:23:00
    以下转自:http://www.bbioo.com/blog/bio/guohui/1524.htm  EXCEL VBA常用语句100句定制模块行为Option Explicit 强制对模块内所有变量进行声明*****Option Private Module 标记模块为私有,仅对同一工程中其它...
  • 要确保调用wait()方法的时候拥有锁,即,wait()方法的调用必须放在synchronized方法或synchronized块中。 那么总的来说: 最主要的区别是sleep方法没有释放锁,而 wait方法释放了锁,使得其他线程可以使用...
  • [Excel VBA]如何制作动态数据图表?

    千次阅读 2019-06-02 09:44:28
    然而,對於辦公室工作族群,Microsoft Excel是再熟悉不過的工具,除了靜態的數據視覺化呈現,其實善用Excel函數搭配Excel VBA,也可以達到不錯的動態數據視覺效果,如上述影片所示。 關於上述動態數據範例,其使用...
  • 1 时间相关的基础用法 ... 错误语法: application.wait(now+timevalue(00:00:01)) 错误语法: application.wait(now+timevalue("00:00:01")) Sub maomi1() Debug.Print "point 1" t = Timer...
  • 代码: waitTime = TimeSerial(Hour(Now()), Minute(Now()), Second(Now()) + 3) Application.Wait waitTime 来自excelhome网友Zamyi
  • for循环内使用wait()方法注意

    千次阅读 2018-10-09 22:21:32
    今天用wait()和notify()进行线程通信实现输出12A34B56C.....格式的长字符,写了一段看起来很不成熟的代码,然后还把自己绕晕了= =、原来是因为在for循环里使用if-elseif结构调用wait方法导致出错,找了好久的bug终于...
  • Excel VBA开发自动发送邮件

    万次阅读 多人点赞 2017-04-27 17:37:33
    若没有做如下操作设置,则Excel VBA调用Outlook自动发送邮件时提示如下 2.1 Outlook->工具->信任中心 2.2 编程访问->选中”从不向我发出可疑活动警告(不推荐)“,注意:建议使用Excel VBA自动发送...
  • VBA网抓入门

    万次阅读 2018-02-28 22:38:55
    Public Function GetInfo(strMoblie As String) As String '创建对象 Dim xmlHttp As Object Set xmlHttp = CreateObject("MSXML2.XMLHTTP") '发送请求 xmlHttp.Open "GET"...
  • AppActivate title , [ wait ] https://docs.microsoft.com/zh-cn/office/vba/language/reference/user-interface-help/appactivate-statement AppActivate 语句语法具有下列命名参数: title 必需。 时间 可选。 ...
  • VBA暂停10秒

    2021-11-04 16:48:46
    Dim time As String time = CStr(Now()) If Application.Wait(Now + TimeValue("00:00:10")) Then MsgBox time & Chr(10) & Now() End If
  • 关于【VBA 网抓】的那些事,最近,由于我的一个VBA工程项目,需要做到与网页里的特定数据进行比对,由于在此之前,也没有对VBA网抓有过多的了解,因此就凭着一股猛劲,边做边学,并最终达到了预期目的。 对于此过程...
  • VS3013安装update 2以后,打开offie出现“please wait while windows configures microsoft visual studio professional 2013”提示,每次打开都会有。 解决办法: 在C:\Windows\Microsoft.NET\Framework文件夹下...
  • 代码用途 先刷新所有连接 然后刷新所有表 这里的连接是指数据是从远程连接刷新过来的 比如远程mysql服务器 hive等等 ...vba代码 Sub 先刷新连接后刷新所有表() For Each objConnection In ThisW...
  • VBA,Application对象的常用属性和方法

    千次阅读 2020-02-01 12:22:05
    applicaiton.Wait (Now + TimeValue("00:00:02")) application.ontime()   2 Application的属性虽然多数是过程级的,但sub结尾需要重置回来 2.1 Application.screenupdating = False 只能过程sub 或...
  • EXCEL vba 运行错误438

    2017-03-13 16:10:13
    打开网页还没有问题,不懂为什么加个do while/ debug.print就提示 运行错误 438,对象不支持该属类或方法,我用的EXCEL2013版,WIN7-64BIT 这是错误代码 : Sub BrowseToSite() Dim IE As New SHDocVw....
  • vba截图相关

    千次阅读 2020-05-01 19:18:00
    testSaveScreen2File:保存截图成文件 Sub testPaste2Mspaint() For i = 1 To 3 Call getPicScreen a = Shell("mspaint", 1) 'AppActivate a Application.Wait (Now + TimeValue("00:00:01")) 'DoEvents ...
  • Sub 测试() Dim k As Long k = 1 MsgBox k + 1 = kEnd Sub …… 白鹤亮翅,打完收工 更多VBA编程教程▼ 菜单->教程->零基础学VBA 老铁,江湖路远关注不迷路,咱们下期再贱。 ▎全方位系统学习Excel 推荐加入我的 ...
  • 什么?你不知道照相机是什么??那参见我这篇文章吧 ...VBA Private Sub pictureSheet() Dim Sht As Worksheet Dim iSht As Worksheet Dim iCnt%,eRow%,eCol% IMG_NAME = "img" '用于存放图片的工
  •  Application.Wait Now() + VBA.TimeValue("00:00:03")  Unload Me End Sub 调用变量名执行指定的宏过程 Sub test()  Application.Run "fun1"  Application.Run "fun2", "2", "30"  result...
  • excel-vba的常用功能普通功能变量定义日期计算插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的...
  • excel vba 移动方向键 excel vba 怎么移动方向键 ,执行该语句之后,相当于我按了方向键,选定了隔壁的单元格 授之以鱼: 模拟左方向键: Application.Sendkeys "{LEFT}" 右方向键: Application.Sendkeys "{RIGHT...
  • 14 日志导出 15 excle文件格式转换 16 VBA隐藏表格 17 改变窗体外观 18 更改Sheet名 19 对文件夹中多个文件进行操作 20 合并单元格 21 插入一行单元格 22 在指定单元格内输入字符 23 调整行高和列宽 24 跳转到该列...
  • 常用vba功能汇总

    2020-04-02 17:53:56
    excel文件保存相关: Public Function fast_start(Optional ByVal displayalert = True) With Application .ScreenUpdating = False .Calculation = xlCalculationManual '.CalculateBeforeSav...
  • VBA中的ColorIndex信息

    2021-04-19 23:53:38
    Color Palette, Excel (#chart) To see your 56 colors (to bring up box in VBA) In XL95 Help --> index --> Colorindex property In XL97/XL2000 VBE HELP (Alt+F11, F1) --> index --> ColorIndex property It...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 558
精华内容 223
关键字:

vbawait