ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 21775|回复: 11

[求助] 如何在一段代码中的某一处添加代码延迟几秒后执行?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-2-24 14:27 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Sub test1()
    arr = [a1].CurrentRegion
    With Sheet1
        For i = 2 To UBound(arr)
            .Cells(2, 1) = arr(i, 1)

            arr(i, 3) = .Cells(2, 4)
            arr(i, 4) = .Cells(2, 5)
            arr(i, 5) = .Cells(2, 6)
            arr(i, 6) = .Cells(2, 7)
            arr(i, 7) = .Cells(2, 8)


        Next
End With

[a1].CurrentRegion = arr

End Sub


    代码如上,需要在  .Cells(2, 1) = arr(i, 1)后延时3秒钟继续执行下面的代码,然后每次循环都在此延时,该如何添加?谢谢大神~



TA的精华主题

TA的得分主题

发表于 2016-2-24 14:32 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
申明:Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)'暂停
用法:Sleep 10'表示暂停10毫秒

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-2-24 15:29 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
我是来讨说法的 发表于 2016-2-24 14:32
申明:Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)'暂停
用法:Sleep 10'表示暂停1 ...

谢谢可用。不过我用的是2010版本,根据提示更改声明为:Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

TA的精华主题

TA的得分主题

发表于 2016-2-24 15:32 | 显示全部楼层
1、一般延时

一个应用接口需要限制运行速度,需要在循环中加个延时函数,这个延时不需要多么精确,要求有个几秒延时,网上用的比较多的就是用Timer函数编写,Timer是VBA自带的函数,用起来比较方便,一般程序如下:

'延时程序
Sub delay(T As Single)
    Dim time1 As Single
    time1 = Timer
    Do
        DoEvents
    Loop While Timer - time1 < T
End Sub

虽然一般用这个函数延迟用秒做单位,但1秒以内的延时也是可以的,老一点的机器时钟中断为每秒18.2次,就是说时间间隔在0.055秒(55毫秒)左右,现在的机器一般都比这个高,具体多少需要测试。Timer函数根据时钟中断记录当天的时间序列值,以秒为单位,也就是从当天0点开始到当前时间点上所经历的秒数(含小数)。当从23:59分钟跨越到0点是,Timer函数的时间也重新归零开始计算。通过查看函数中的timer值得变化情况,可以确定时钟中断的间隔。例如本人的机器timer值变化如下:

56742.09
56742.11
56742.13
56742.14
56742.16
56742.16
56742.17
56742.19
56742.2
56742.22
56742.23
可以看出,时间间隔在10-20毫秒之间(精确显示实际精度是0.015625秒,15.625毫秒)。如果时延在1秒以内,精度要求不高,就可以用这个方法,如:

delay(0.25)

由于延时函数中使用了 DoEvents语句交出了系统控制权,所以不会影响用户的其它操作。

上面方法虽然简单,但是有一个致命的缺陷,就是Timer函数的时间每天都是从0开始,如果从23:59:59开始延时1秒以上的话,这个延时程序将永远执行下去,下面的延时程序将弥补这个缺陷:

'延时程序
Sub delay(T As Single)
    Dim time1, time2 As Single
    time1 = Timer
    Do
        DoEvents
        time2 = Timer - time1
        If time2 < 0 Then time2 = time2 + 86400     '86400=24*3600
    Loop While time2 < T
End Sub



2、精确延时

精确延时可以使用sleep函数,sleep函数是Windows API函数,使用前必须先声明,然后使用,例如:

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

。。。

    sleep 1000      '延时1秒

。。。

sleep函数延时是毫秒级的,精确度比较高,但它在延时时会将程序挂起,使操作系统暂时无法响应用户操作,所以在长延时的时候不适合使用它。

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

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

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

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

'精确延时程序
Sub delay(T As Long)
    Dim time1 As Long
    time1 = timeGetTime
    Do
        DoEvents
    Loop While timeGetTime - time1 < T
End Sub

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

评分

5

查看全部评分

TA的精华主题

TA的得分主题

发表于 2016-2-24 15:35 | 显示全部楼层
sleep 10秒根本感觉不到,改成1000秒才有点感觉。不如试试下面的wait
Sub test1()
    newHour = Hour(Now())
    newMinute = Minute(Now())
    newSecond = Second(Now()) + 10
    waitTime = TimeSerial(newHour, newMinute, newSecond)
    MsgBox "hello"
    Application.Wait waitTime
    MsgBox "hello"
End Sub

TA的精华主题

TA的得分主题

发表于 2016-2-24 15:37 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
也试试这个,比较一下
  1. Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

  2. Sub test()
  3.     Cells(2, 6) = 10
  4.     Sleep 1000
  5.     Cells(3, 6) = 100
  6.     Sleep 1000
  7.     Cells(4, 6) = 1000
  8. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2016-2-24 16:20 | 显示全部楼层
If Application.Wait(Now + TimeValue("0:00:10")) Then
    。。。
End If

TA的精华主题

TA的得分主题

发表于 2017-12-20 13:09 | 显示全部楼层
Dān恋=_=。 发表于 2016-2-24 15:29
谢谢可用。不过我用的是2010版本,根据提示更改声明为:Private Declare PtrSafe Sub Sleep Lib "kernel3 ...

这个是因为是office 64位版本的原因,32位版本的哪怕2016也是没问题的。这32和64位 office间代码的兼容性,让我很郁闷。我目前只能把代码改写,不知道有没有其它方法可以兼容。

TA的精华主题

TA的得分主题

发表于 2018-5-2 12:10 | 显示全部楼层
学习了,get了很多东西,谢谢各位高手。

TA的精华主题

TA的得分主题

发表于 2018-10-16 15:09 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-16 02:30 , Processed in 0.042775 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表