ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 工作表动态控件如何刷新赋给变量

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-10-17 13:15 | 显示全部楼层
aman1516 发表于 2024-10-17 12:49
不错!
是否可以理解成某种形式的“多线程”尽量放开后台操作...

具体细节我也不懂,我的猜测是:把控制权暂时交还给操作系统,这样操作系统就有时间更新前面的操作了。
我在注册COM DLL/EXE时,发现此方法(虽然丑陋了点)也可以暂时解决我遇到的问题,让我可以编写所谓的“绿色的软件”。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-10-17 13:16 | 显示全部楼层
lss001 发表于 2024-10-17 12:12
重新选择是保险一点
但不是重点
因为不选择也是可以的

原来这样,之前延时各种方式基本胡乱地用,现时明白了

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-10-18 11:38 | 显示全部楼层
文心一言的相关资料,自己备存一下:

几种常见的VBA延时方式及其特性,以及对系统的影响:

一、Application.Wait方法
特性:
暂停Microsoft Excel的所有操作,直至指定的时间。
时间参数为字符串格式,不支持小数,如“0:00:10”表示10秒。
在等待期间,后台操作(如打印和重新计算)可能会继续进行。
对系统的影响:
在等待期间,Excel应用程序无法访问,可能会给用户带来不便。
由于是全局暂停,可能会影响到Excel中的其他正在进行的操作或任务。
二、Sleep函数
特性:
Windows API函数,用于使程序暂停指定的毫秒数。
使用前需要声明,如Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)(64位系统)。
延时期间,程序处于挂起状态,操作系统暂时无法响应用户操作。
对系统的影响:
在长延时的情况下,可能会使用户觉得程序响应缓慢或无响应。
由于程序处于挂起状态,可能会影响到其他正在运行的程序或任务。
三、Timer和DoEvents函数
特性:
Timer函数返回自午夜以来的秒数,可以用于计算时间差。
DoEvents函数交出执行控制权,以便操作系统能够处理其他事件。
通过循环和条件判断,可以实现自定义的延时效果。
对系统的影响:
在延时期间,用户仍然可以与Excel进行交互,提高了程序的可用性和用户体验。
由于DoEvents函数会交出控制权,可能会影响到延时时间的精确性。
四、timeGetTime函数
特性:
Windows API函数,返回自系统启动以来的毫秒数。
可以与DoEvents函数结合使用,实现精确的延时效果。
使用前需要声明,如Private Declare PtrSafe Function timeGetTime Lib "winmm.dll" () As Long。
对系统的影响:
与Timer和DoEvents函数类似,可以在延时期间保持与用户的交互。
由于timeGetTime函数返回的是系统启动以来的毫秒数,因此具有更高的精确性。
总结:
不同的VBA延时方式具有各自的特性和对系统的影响。在选择延时方式时,需要根据具体的应用场景和需求进行权衡。如果需要高精度的延时效果,并且不介意程序在等待期间处于挂起状态,可以选择Sleep函数。如果需要保持与用户的交互,并且希望延时期间能够处理其他事件,可以选择Timer和DoEvents函数或timeGetTime函数。而Application.Wait方法则适用于需要全局暂停Excel操作的情况。

除了上面提到的Application.Wait方法、Sleep函数、Timer和DoEvents函数组合以及timeGetTime函数外,还有一些其他的延时方式:

一、基于循环和条件的延时
使用Timer函数
Timer函数返回自午夜以来的秒数(小数部分表示秒的小数部分),可以用于计算时间差。通过设置一个开始时间,并在循环中检查当前时间与开始时间的差值,可以实现自定义的延时效果。例如:

vba
Sub delayUsingTimer(T As Single)  
    Dim time1 As Single  
    time1 = Timer  
    Do  
        DoEvents ' 交出控制权,允许其他事件处理  
    Loop While Timer - time1 < T  
End Sub
调用时,可以传入所需的延时秒数,如delayUsingTimer(2)表示延时2秒。

使用DateDiff和Time函数
结合DateDiff和Time函数,也可以实现延时效果。首先记录开始时间,然后在循环中检查当前时间与开始时间的差值,当差值达到所需延时时,退出循环。例如:

vba
Sub delayUsingDateDiff(seconds As Long)  
    Dim startTime As Date  
    startTime = Time()  
    Do  
        DoEvents ' 交出控制权,允许其他事件处理  
    Loop While DateDiff("s", startTime, Time()) < seconds  
End Sub
二、基于Windows API的延时
除了Sleep函数外,还有其他一些Windows API函数可以用于延时,如timeBeginPeriod和timeEndPeriod(用于设置和恢复系统时钟的分辨率),但这些函数通常不直接用于延时,而是用于调整系统时钟的精度。在实际应用中,Sleep函数已经足够满足大多数延时需求。

三、注意事项
精度与性能
不同的延时方式在精度和性能上有所不同。例如,Application.Wait方法和Sleep函数具有较高的精度,但可能会使程序在等待期间处于挂起状态,影响用户体验。而基于循环和条件的延时方式则可以在延时期间保持与用户的交互,但精度可能受到系统负载和处理器速度等因素的影响。

系统兼容性
在使用Windows API函数时,需要注意系统兼容性。例如,在64位系统上使用Sleep函数时,需要在Declare语句后加上PtrSafe关键字。

代码可读性
在选择延时方式时,还需要考虑代码的可读性和可维护性。使用清晰、简洁的代码结构有助于其他开发人员理解和维护代码。

综上所述,VBA中提供了多种延时方式,可以根据具体的应用场景和需求选择合适的延时方式。在选择时,需要权衡精度、性能、系统兼容性和代码可读性等因素。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-19 11:27 , Processed in 0.040680 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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