排行
数据库百科
核心案例
行业报告
月度解读
大事记
产业图谱
中国数据库
向量数据库
时序数据库
实时数据库
搜索引擎
空间数据库
图数据库
数据仓库
大调查
2021年报告
2022年报告
年度数据库
2020年openGauss
2021年TiDB
2022年PolarDB
2023年OceanBase
首页
资讯
活动
大会
学习
课程中心
推荐优质内容、热门课程
学习路径
预设学习计划、达成学习目标
知识图谱
综合了解技术体系知识点
课程库
快速筛选、搜索相关课程
视频学习
专业视频分享技术知识
电子文档
快速搜索阅览技术文档
文档
问答
服务
智能助手小墨
关于数据库相关的问题,您都可以问我
数据库巡检平台
脚本采集百余项,在线智能分析总结
SQLRUN
在线数据库即时SQL运行平台
数据库实训平台
实操环境、开箱即用、一键连接
数据库管理服务
汇聚顶级数据库专家,具备多数据库运维能力
数据库百科
核心案例
行业报告
月度解读
大事记
产业图谱
我的订单
登录后可立即获得以下权益
免费培训课程
收藏优质文章
疑难问题解答
下载专业文档
签到免费抽奖
提升成长等级
立即登录
登录
注册
登录
注册
首页
资讯
活动
大会
课程
文档
排行
问答
我的订单
首页
专家团队
智能助手
在线工具
SQLRUN
在线数据库即时SQL运行平台
数据库在线实训平台
实操环境、开箱即用、一键连接
AWR分析
上传AWR报告,查看分析结果
SQL格式化
快速格式化绝大多数SQL语句
SQL审核
审核编写规范,提升执行效率
PLSQL解密
解密超4000字符的PL/SQL语句
OraC函数
查询Oracle C 函数的详细描述
智能助手小墨
关于数据库相关的问题,您都可以问我
精选案例
新闻资讯
云市场
登录后可立即获得以下权益
免费培训课程
收藏优质文章
疑难问题解答
下载专业文档
签到免费抽奖
提升成长等级
立即登录
登录
注册
登录
注册
首页
专家团队
智能助手
精选案例
新闻资讯
云市场
微信扫码
复制链接
新浪微博
分享数说
采集到收藏夹
分享到数说
首页
/
leep API函数延时
leep API函数延时
VBA语言専攻
2022-07-28
166
【分享成果,随喜正能量】 只行好事,莫问前程。北人水旱,得命于天,有借有还,再借不难。扁担是条龙,一生吃弗穷,本小利微,本大利宽。
《VBA信息获取与处理》教程是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网数据抓取、VBA延时操作,剪贴板应用、Split函数扩展、工作表信息与其他应用交互,FSO对象的利用、工作表及文件夹信息的获取、图形信息的获取以及定制工作表信息函数等等内容。程序文件通过32位和64位两种OFFICE系统测试。是非常抽象的,更具研究的价值。
教程共两册,八十四讲。今日的内容是”专题十一:VBA如何做到延时获得数据信息”:Sleep API函数延时
第二节 使用Sleep API暂停函数实现延时获取数据
这节我们继续讲解延时获得数据的方案,将介绍给大家利用一个API函数来实现这个功能。在Windows系统中,提供了一个名为Sleep的API函数,该函数将当前进程线程挂起数毫秒。在此等待期间,一切都将被锁定在应用程序之外,所有事件都将延迟,直到等待完成。中断键也不能用来中断等待。
1
Sleep API暂停函数
语法:Sleep milliseconds
意义: 暂停当前线程的执行,直到超时间隔过去。暂停执行的时间间隔为毫秒milliseconds。
说明:值为零会导致线程将放弃其剩余的时间,并运行任何其他线程。如果没有其他线程可以运行,函数将立即返回,线程将继续执行。WindowsXP:值为零会导致线程将放弃其剩余的时间,并运行其他任何已准备好的具有相同优先级的线程。如果没有其他同等优先级的线程可以运行,函数将立即返回,线程将继续执行。从Windows Server 2003开始,此行为已更改。
此函数使线程放弃其剩余时间部分,如果毫秒dwMilliseconds小于系统时钟的分辨率,则线程可能睡眠的时间小于指定的时间长度。如果毫秒大于一个刻度但小于两个刻度,则等待时间可以介于一个刻度和两个刻度之间,依此类推。要提高睡眠间隔的准确性,请调用timeGetDevCaps函数以确定支持的最小计时器分辨率,并调用timeBeginPeriod函数将计时器分辨率设置为最小值。
在睡眠间隔过后,线程就可以运行了。如果指定0毫秒,则线程将放弃其剩余时间片,但保持就绪。注意,就绪线程不能保证立即运行。因此,线程可能直到睡眠间隔结束后的某个时间才运行。
2
Sleep API暂停函数的应用
同样是上节中的代码,我给出利用Sleep API函数的代码:
#If VBA7 And Win64 Then
' 64 bit Excel
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByValdwMilliseconds As LongLong)
#Else
' 32 bit Excel
Public Declare Sub Sleep Lib "kernel32" (ByValdwMilliseconds As Long)
#End If
Sub mynzB() '使用Sleep实现延时获取数据2
Sheets("sheet2").Select
For i = 1 To 100
Cells(1, 1) = i
Sleep 0.5 * 1000
Cells(2, 1) = Time()
Next
MsgBox ("OK!")
End Sub
代码截图:
代码讲解:
1)上述代码实现了毫秒级别的延时。我给出的延时时间是500毫秒,即半秒钟。代码部分不是很难。就不再讲解了。
2)在声明部分,我给出了两个声明,一个是对于64位office的,一个是针对32位office的,代码利用的是:
#If VBA7 And Win64 Then
' 64 bit Excel
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByValdwMilliseconds As LongLong)
#Else
' 32 bit Excel
Public Declare Sub Sleep Lib "kernel32" (ByValdwMilliseconds As Long)
#End If
下面我就这两种OFFICE系统做一下简单的说明:
①
自Office2010发布以后,Office2010分成32位和64位两个版本,随之一起诞生的VBA7也和广大用户见面了,但由于当时64位系统普及率不够,使用64位Office并不广泛,当时微软也建议用户避开64位Office 2010,不建议使用64位Office2010。但随着Office2013和2016推出后,64位版本更加稳定,使用的人也越来越多。为了支持64位,VBA进行了升级,而Office 2010对象模型也已经得到了更新。因此,当企业用户自Office 2003升级至Office 2010的时候,很有可能需要处理旧的、不兼容的程序代码。目前64位Windows已经大行其道,越来越多的使用者碰到64位系统下的VBA的使用问题。
②对于在 Office 2010 版本之前(VBA 版本 6 和更早版本)编写的 VBA 代码,需要修改为在 64 位 Office 版本中运行,否则在 64 位平台上运行时会导致错误。这是因为,VBA 版本 6 和更早版本完全以 32 位平台为目标,而且通常包含 Declare 语句,这些语句调用的 Windows API 使用 32 位数据类型的指针和句柄。因为 VBA 版本 6 和更早版本没有用于指针或句柄的特定数据类型,所以,它使用 Long 数据类型(一种 32 位 4 字节的数据类型)来引用指针和句柄。64 位环境中的指针和句柄为 8 字节 64 位数。这些 64 位数不能包含在 32 位数据类型中。
③在 64 位 Office 中运行旧 VBA 代码的问题在于,将 64 位加载到 32 位数据类型中会截断 64 位数。这会导致内存溢出、代码中出现意外结果,并且可能导致应用程序故障。为解决此问题,以使 VBA 代码能同时在 32 位和 64 位环境中正确运行,新版 VBA 中增加了几项语言功能。有三个重要的新增功能,分别是:LongPtr类型别名、LongLong数据类型和PtrSafe关键字。
aLongPtr。LongPtr实际解析为哪种数据类型取决于它在哪种 Office 版本中运行:在 32 位版本的 Office 中LongPtr解析为 Long,在 64 位版本的 Office 中LongPtr解析为LongLong。LongPtr用于指针和句柄。
b LongLong:LongLong数据类型为有符号的 64 位整数,仅在 64 位版本的 Office 中可用。LongLong用于 64 位整数。必须使用转换函数将LongLong(包括 64 位平台上的LongPtr)显式赋予较小的整型。不允许将LongLong隐式转换为较小的整数。
c PtrSafe - PtrSafe关键字声明 Declare 语句可以在 64 位版本的 Office 中安全运行。
④在 64 位版本的 Office 中运行时,所有 Declare 语句必须都包括PtrSafe关键字。仅仅将PtrSafe关键字添加到 Declare 语句中只是表示 Declare 语句显式针对 64 位,而语句中需要存储 64 位(包括返回值和参数)的所有数据类型仍须经过修改才能保存 64 位数。
⑤带有PtrSafe关键字的 Declare 语句为建议的语法。包括PtrSafe的 Declare 语句可同时在 32 位和 64 位平台上的 VBA7 开发环境中正确工作。为确保在 VBA7 中以及更早版本中的向后兼容性,请使用下面的构造:
#If Vba7 Then
Declare PtrSafe Sub...
#Else
Declare Sub...
#EndIf
这就是我在程序中应用写法的解释:
3
Sleep API暂停函数的应用效果
我们到EXCEL工作表界面,看看上述代码的实现效果:
界面还是非常友好的。
本节知识点回向:
① sleep 方法的意义是什么?
② sleep 方法应用前要建立一个什么样的引用?
③ sleep 方法的32引用和64位引用有什么不同,如何理解这种写法。
本节代码参考文件“011工作表.xlsm”
我20多年的VBA实践经验,全部浓缩在下面的各个教程中,教程学习顺序
:
【分享成果,随喜正能量】钓鱼穷三年,玩鸟毁一生,久病孝子离,家兴出恶狗,男占二五八,女占三六九,宁卖九毛九,不卖一块一,问路不用礼,多行数十里。
线程
软件
api函数
vba
文章转载自
VBA语言専攻
,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
领墨值
有奖问卷
意见反馈
客服小墨