ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 有VBA 的excel文件在关闭的情况下自动又打开是什么问题?怎么解决?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-9-25 15:48 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
如题: 有VBA 的excel文件在关闭的情况下自动又打开是什么问题?怎么解决?


附上代码:



Public RunWhen As String
'每1200秒执行一次
Public Const cRunIntervalSeconds = 1200
Public Const cRunWhat = "status_check"
Sub StartTimer()
RunWhen = Application.WorksheetFunction.Text(cRunIntervalSeconds / 86400, "[hh]:mm:ss")
Application.OnTime EarliestTime:=Now() + TimeValue(RunWhen), Procedure:=cRunWhat, Schedule:=True
End Sub
Function GetPingResult(Host)
   Dim objPing As Object
   Dim objStatus As Object
   Dim strResult As String
   Set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}"). _
       ExecQuery("Select * from Win32_PingStatus Where Address = '" & Host & "'")
   For Each objStatus In objPing
      Select Case objStatus.StatusCode
         Case 0: strResult = "Connected"
         Case 11001: strResult = "Buffer too small"
         Case 11002: strResult = "Destination net unreachable"
         Case 11003: strResult = "Destination host unreachable"
         Case 11004: strResult = "Destination protocol unreachable"
         Case 11005: strResult = "Destination port unreachable"
         Case 11006: strResult = "No resources"
         Case 11007: strResult = "Bad option"
         Case 11008: strResult = "Hardware error"
         Case 11009: strResult = "Packet too big"
         Case 11010: strResult = "Request timed out"
         Case 11011: strResult = "Bad request"
         Case 11012: strResult = "Bad route"
         Case 11013: strResult = "Time-To-Live (TTL) expired transit"
         Case 11014: strResult = "Time-To-Live (TTL) expired reassembly"
         Case 11015: strResult = "Parameter problem"
         Case 11016: strResult = "Source quench"
         Case 11017: strResult = "Option too big"
         Case 11018: strResult = "Bad destination"
         Case 11032: strResult = "Negotiating IPSEC"
         Case 11050: strResult = "General failure"
         Case Else: strResult = "Unknown host"
      End Select
      If strResult = "Connected" Then
        GetPingResult = "通"
      Else
        GetPingResult = "不通"
      End If
   Next
   Set objPing = Nothing
End Function

Sub status_check()
Dim arData As Variant
arData = Sheet8.Range("A1").CurrentRegion
For i = 2 To UBound(arData)
    arData(i, 3) = GetPingResult(arData(i, 2))
    arData(i, 4) = Now()
    DoEvents
Next
Sheet8.Range("A1").Resize(UBound(arData), UBound(arData, 2)) = arData
Call StartTimer
End Sub


TA的精华主题

TA的得分主题

发表于 2024-9-25 16:11 | 显示全部楼层
关闭事件里把Ontime设定的内容取消掉

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-25 16:20 | 显示全部楼层
kevinchengcw 发表于 2024-9-25 16:11
关闭事件里把Ontime设定的内容取消掉

哪一段, 我不会 ?

TA的精华主题

TA的得分主题

发表于 2024-9-25 16:22 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
kenese 发表于 2024-9-25 16:20
哪一段, 我不会 ?

上传附件看看,也有可能是宏编辑器里的引用问题,清除失效的引用问题就可能消失了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-25 16:38 | 显示全部楼层
附上附件, 求解

ping.zip

14.49 KB, 下载次数: 7

TA的精华主题

TA的得分主题

发表于 2024-9-25 17:10 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
把这句注销掉即可
Application.OnTime EarliestTime:=Now() + TimeValue(RunWhen), Procedure:=cRunWhat, Schedule:=True

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-25 17:15 | 显示全部楼层
zjdh 发表于 2024-9-25 17:10
把这句注销掉即可
Application.OnTime EarliestTime:=Now() + TimeValue(RunWhen), Procedure:=cRunWhat,  ...

这行删掉?对吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-9-25 20:58 | 显示全部楼层
kenese 发表于 2024-9-25 17:15
这行删掉?对吗?

删掉之后数据就不更新了(要求在文件打开的情况下每隔20分钟更新一次的)

TA的精华主题

TA的得分主题

发表于 2024-9-26 20:58 | 显示全部楼层
的确是的,有一个笨办法,不改变宏,关闭文件时同时关闭Excel程序,若需要用Excel则再打开。

TA的精华主题

TA的得分主题

发表于 2024-9-27 06:23 | 显示全部楼层
  1. Public RunWhen As Date
  2. '每1200秒执行一次
  3. Public Const cRunIntervalSeconds = 5
  4. Public Const cRunWhat = "status_check"

  5. Sub StartTimer()
  6. RunWhen = Now() + cRunIntervalSeconds / 86400
  7. Application.OnTime EarliestTime:=RunWhen, Procedure:=cRunWhat, Schedule:=True
  8. End Sub

  9. Sub status_check()
  10. '干活的内容自己添加
  11. StartTimer
  12. End Sub

  13. '名称 必选/可选 数据类型 说明
  14. 'EarliestTime 必选 Variant 希望此过程运行的时间。
  15. 'Procedure 必选 String 要运行的过程名。
  16. 'LatestTime 可选 Variant 过程开始运行的最晚时间。例如,如果 LatestTime 参数设置为 EarliestTime + 30,且当到达 EarliestTime 时间时,由于其他过程处于运行状态而导致 Microsoft Excel 不能处于“就绪”、“复制”、“剪切”或“查找”模式,则 Microsoft Excel 将等待 30 秒让第一个过程先完成。如果 Microsoft Excel 不能在 30 秒内回到“就绪”模式,则不运行此过程。如果省略该参数,Microsoft Excel 将一直等待到可以运行该过程为止。
  17. 'Schedule 可选 Variant 如果为 True,则预定一个新的 OnTime 过程。如果为 False,则清除先前设置的过程。默认值为 True。
  18. Private Sub Workbook_BeforeClose(Cancel As Boolean)
  19. Application.OnTime EarliestTime:=RunWhen, Procedure:=cRunWhat, Schedule:=False
  20. End Sub
复制代码

注释下方事件代码注意位置。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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