- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
深入探讨Excel Application对象OnTime方法的死穴.doc
深入探讨Excel Application对象OnTime方法的死穴
[摘 要]因为Excel集数据库和程序设计于一体,令广大VBA编程爱好者前赴后继地奔走在Excel考试系统路上,定时器作为考试系统的基本要求,而Excel却没有Timer,使爱好者乱了方寸,幸好Application对象OnTime方法带来了一线生机,但它又无法感知系统时间被修改的弊端,成了Excel考试系统的死穴,又让爱好者垂头丧气。
[关键词]探讨 Excel Application对象 OnTime方法
中图分类号:TP311.52 文献标识码:A 文章编号:1009-914X(2016)02-0351-01
Excel考试系统的重点和难点都是定时器的实现,但定时器作为任何考试系统的基本要求,又无法回避,怎样彻底实现Excel考试系统的定时器功能呢?
一、实现定时器的基本方法
虽然Excel VBA没有提供定时器,但可以通过Application对象的OnTime方法实现简单的定时器功能,OnTime方法能够安排一个过程在将来的特定时间运行,既可以是具体指定的某个时间,也可以是指定的一段时间之后。
语法如下:Application.OnTime EarliestTime,Procedure,LatestTime,Schedule
在OnTime方法中递归调用Procedure过程,就可实现定时器。
二、致命的死穴
尽管OnTime方法可以具体指定的某个时间和指定的一段时间之后两种方式执行Procedure,但本质上都是具体指定的某个时间,因此一旦修改系统时间,不管是提前或延后时间,让其错过指定时刻,或让指定时刻延后数小时或更长,导致OnTime方法失效,从而失去定时器的功能,成为Excel考试系统的死穴。
三、解决方案
许多编程爱好者都在苦苦探索一旦修改系统时间,立刻让Excel感知系统时间被修改了,从而调整定时器方案,其中想利用类似lostfocus和getfocus事件的Workbook_Activate()、Workbook_SheetActivate()、Workbook_WindowActivate()等事件的探索者,均以失败而告终,因为WindowActivate等事件都是在有两个以上workbook打开时(也就是多个excel文件),互相之间切换起作用,而不是workbook和其他程序窗口间切换。同理,WindowDeactivate也得是在多个workbook时起作用。
经过多次探索,终于发现Worksheet_Change()或Workbook_SheetChange()可担当此大任,两个事件都在编辑单元格后触发事件,类似TextChange事件,因为一般而言,Excel随时随地都处于编辑状态,所以时时刻刻都会触发Worksheet_Change()或Workbook_SheetChange()事件,只要在事件中获取系统时间,并比较前后时间的变化,即可判断系统时间是否被修改。尤其是系统时间被修改为以前的时间,更容易感知,因为时间毕竟不能倒流。
四、具体实现方法
首先定义两个全局变量Public pass As Date,Public nowtime As Date,在Workbook_Open()事件中获取系统时间,启动定时器过程displaytime()。
Private Sub Workbook_Open()
nowtime = Now()
pass = nowtime - TimeValue(01:00:00) 防恶意修改系统时间
displaytime
End Sub
而在定时器中递归调用过程displaytime()。
Public Sub displaytime()
nexttime = Now + TimeValue(00:00:01)
If Range(D2).Value TimeValue(00:00:00) Then
Application.OnTime nexttime, ThisWorkbook.displaytime, , True
End If
End Sub
在Worksheet_Change()或Workbook_SheetChange()事件中利用DateDiff函数比较pass和nowtime两个变量,当nowtime比pass还早,说明修改了系统时间,提示并作关闭Excel处理。
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As
您可能关注的文档
最近下载
- TCQAE.32025信息技术生僻字处理第3部分服务机构要求.pdf
- 医学影像检查技术学教案(本科).doc
- TCQAE.22025信息技术生僻字处理第2部分业务系统要求.pdf
- TCQAE.12025信息技术生僻字处理第1部分软件产品要求.pdf
- 《信息技术 生僻字处理要求 第 3 部分:服务机构》.PDF
- 《信息技术 生僻字处理要求 第 2 部分:业务系统》.PDF
- 国际结算(史燕平)第三章 国际结算方式--汇款方式与托收方式.ppt VIP
- 《信息技术 生僻字处理要求 第1部分:软件产品》.PDF
- 2025年青岛版(2024)小学科学三年级上册(全册)教学设计(附目录P150).docx
- 国际结算中的票据.pptx
文档评论(0)