ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] 如何让VBA程序停止运行一段时间后,继续运行,但EXCEL的其他操作仍然可以操作。

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-7-14 11:39 | 显示全部楼层 |阅读模式
本人想写一个程序,从业务系统中导出一个EXCEL文件,该系统导出文件后默认为直接打开导出的EXCEL文件,想先判断一下该文件是否已导出,想通过以下语句判断是否已经打开:

    On Error Resume Next
        Set wb1 = Workbooks(filename)
    if err<>0 then
    此处写语句的功能是:暂停一段时间,等待业务系统导出完毕并打开EXCEL文件再用set 语句给wb1变量赋值导出并已打开的EXCEL文件
    用sleep 20000? 用Application.Wait (Now() + TimeValue("0:00:20")) ?好象都不行
    Set wb1 = Workbooks(filename)
    endif
  讨论:
       用Application.Wait (Now() + TimeValue("0:00:20")) 语句VBA程序停止运行,发现整个EXCEL应用程序也停止响应了,业务系统正在导出的操作也被停止了,所以该语句也不行。
      用sleep 20000 也貌似没有办法中断程序运行的同时,让业务系统的导出EXCEL表格的操作继续?

     请教如何才能实现,中断VBA程序运行,同时还能让业务系统的导出并打开EXCEL文件的操作仍然继续,以便等待导出文件并打开后,对该文件进行操作。

TA的精华主题

TA的得分主题

发表于 2022-7-14 12:00 | 显示全部楼层
VBA不支持多线程,这个还是挺难实现的,得想想其它的替代解决办法

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-7-14 12:38 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
huang1314wei 发表于 2022-7-14 12:00
VBA不支持多线程,这个还是挺难实现的,得想想其它的替代解决办法

其他替代的方法是什么,请教

TA的精华主题

TA的得分主题

发表于 2022-7-14 13:01 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
sukey1520 发表于 2022-7-14 12:38
其他替代的方法是什么,请教

你 业务系统的导出并打开EXCEL文件的操作也是VBA写的吗?  如果是的话,你在这个里面判断导出操作是否已经执行就行了

TA的精华主题

TA的得分主题

发表于 2022-7-14 13:40 | 显示全部楼层
本帖最后由 准提部林 于 2022-7-14 13:42 编辑

可利用一空白工作表(例Sheet1)+INDIRECT函數, 以下只是舉例!!!
1) Sheet1 A1 公式:
   =INDIRECT("'[ReportBook.xlsx]Sheet1'!$A$1")

2) Sheet1 事件程序(自動重算)
Private Sub Worksheet_Calculate()
If Range("B1") <> "" Then Exit Sub  當B1非空, 略过, 避免重復操作
If Not IsError([A1]) Then '當A1非錯誤值時, 表示目標檔已開啟
   Range("B1") = "OK"  'B1 填任意值
   Call 報表處理   '此程序完成後, 關閉檔案, 並清空B1, 等待下一次開啟報表
End If



End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-7-14 14:52 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
准提部林 发表于 2022-7-14 13:40
可利用一空白工作表(例Sheet1)+INDIRECT函數, 以下只是舉例!!!
1) Sheet1 A1 公式:
   =INDIRECT("'[Repo ...

主要在程序运行过程中,业务系统的导出操作没有进行,是不是vba是单线程的,一定是整个sub程序运行完,业务系统才会进行导出操作

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-7-15 09:39 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
huang1314wei 发表于 2022-7-14 13:01
你 业务系统的导出并打开EXCEL文件的操作也是VBA写的吗?  如果是的话,你在这个里面判断导出操作是否已经 ...

是用VBA写的,就是要在这里判断是否执行并打开了导出的表格,因为业务系统导出需要时间,一般需要7-8秒,可是我们的VBA程序运行完毕后,导出的命令是向系统发出并执行了,但导出的动作都是在程序运行完毕才启动,感觉是EXCEL是单线程的,当VBA程序在运行时,EXCEL的其他操作无法同时进行(如:从业务系统导出),所以在用Application.Wait (Now() + TimeValue("0:00:20")) 和sleep 2000 都无法启作用,这两个命令我的理解是整个应用程序EXCEL停卡响应20秒,其他操作也是停止的,我们的需求是,仅仅是代码停止运行(等待业务系统导出成功并默认打开导出EXCEL文件,我们对打开的文件进和后续代码控制操作),而其他应用程序对EXCEL的操作应该继续。我有说明白吗,请尊敬的版主指导,感谢。

TA的精华主题

TA的得分主题

发表于 2022-7-15 16:49 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2022-7-15 19:06 来自手机 | 显示全部楼层
业务系统导出单独写个sub 执行完再set wb1

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-12-6 15:00 | 显示全部楼层
简七 发表于 2022-7-15 19:06
业务系统导出单独写个sub 执行完再set wb1

我发现VBA程序一定要完全运行完毕,业务系统才会打开导出的EXCEL表格,我就奇怪VB就无法实现这种程序中间暂停以让其他应用程序运行出某种结果,VBA程序再往下运行的功能吗?在网上各种贴子找了很久还是没有答案,再来这里发贴求助。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-20 13:20 , Processed in 0.043791 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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