ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助]如何等待计算结束再运行以后的程序

[复制链接]

TA的精华主题

TA的得分主题

发表于 2008-8-5 10:12 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
其实这个问题已经有人提过(http://club.excelhome.net/viewthread.php?tid=308203),但没有得到回答。
本人也遇到了相同的困惑。
这个问题很简单,一个工作簿中有大量公式,程序使用Application.Calculate或Application.Calculatefull对工作簿进行计算,但后续代码需要等待这个计算过程结束后才运行,因此需要判断计算过程何时完成。
以下是本人的思路:
对CalculationState进行检测,根据EXCEL的帮助文件,CalculationState有三种状态,xlCalculating 、xlDone、xlPending,但没有对其含义作出解释,从字面上猜测,xlCalculating代表正在计算 、xlDone表示计算完成、xlPending表示计算过程被挂起。
可是经过实际运行,如果用以下代码:

Do While Application.CalculationState <> xlDone ' 等待直到计算结束
Loop

将陷入死循环,中断代码后查看CalculationState,发现是xlPending,于是改为判断是否是xlPending,但发现有时计算确实没有结束。
再查EXCEL帮助,发现还有一个有关自动计算的设置:CalculationInterruptKey 属性,于是怀疑计算过程被用户中断了,那么是否可以将CalculationInterruptKey 属性设置为xlNokey来阻止用户中断计算过程:

preStat = Application.CalculationInterruptKey    ' 保留原来状态
Application.CalculationInterruptKey = xlNoKey   ' 阻止用户中断计算过程
Do While Application.CalculationState <> xlDone ' 等待直到计算结束
Loop
Application.CalculationInterruptKey = preStat    ' 恢复原来状态

不知上述代码能否实现标题的要求?请高手指点。

TA的精华主题

TA的得分主题

发表于 2008-8-5 10:21 | 显示全部楼层
这种设计本身就是一种错误,工作簿上有大量公式,这些公式要花时间去计算,你能告诉我需要多少时间吗。事实上,这些公式都是在做重复的劳动,只不过在不同的区域位置而已。最好的设计是工作表上不存在公式,要把公式计算的那部份工作直接用代码去解决。

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-8-5 11:23 | 显示全部楼层
楼上说的没错,上述程序本来就是为了消除大量公式而设计的,
但对于工作簿中大量重复的公式,使用代码进行逐一计算的话,
会耗用大量时间,因此我的思路是将工作表函数公式批量填充
到单元格内,然后由EXCEL自行计算,等计算完成后,再将单
元格全部使用数值粘贴,从而清除公式。在数值粘贴之前,就
需要等待计算完成,这个问题便由此而来。

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-8-5 11:29 | 显示全部楼层
补充:
制造行业在管理中会遇到大量的数据的分类统计,其规模可能是数千行X数十列数据的合并分类汇总(EXCEL内建的简单分类汇总无法实现),会使用到大量SUMIF函数,这些函数公式完全是重复劳动,但如果用代码对数千行X数十列的单元格进行计算更新,我想这个效率也高不到哪里,因此采用了由程序在必要时自动填充函数公式,由EXCEL自行计算,再数值粘贴清除公式,仅保留自动计算结果。

TA的精华主题

TA的得分主题

发表于 2021-6-12 16:10 | 显示全部楼层
本帖最后由 Leopard12345 于 2021-6-14 00:50 编辑

顶一下
12年多过去了,请教高手指点,谢谢了!

TA的精华主题

TA的得分主题

发表于 2021-6-13 20:08 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2021-6-20 18:43 | 显示全部楼层
顶三下,我也想知道结果。doevents和sleep试过了都不行。下面是需求。过程一和过程二之间应该加个什么呢。才能让过程一引起的公式计算结束之后,再进行过程二
QQ图片20210620184102.png

TA的精华主题

TA的得分主题

发表于 2021-11-27 19:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 foreverwatson 于 2021-11-27 21:05 编辑

vba这块真是人气不行,12年了还没个答案,我自己跑出来一个。加个事件,用public变量判断是否保存完成。不过我发现,好像其实application的逻辑就是,必须先save完成,才会继续运行下面的代码,所以貌似是不用判断的。不过无所谓,判断一下安全点。calculate的话,也有一个aftercalculate,但是没找到具体用法,应该也差不多吧。

TA的精华主题

TA的得分主题

发表于 2021-11-28 15:40 | 显示全部楼层
foreverwatson 发表于 2021-11-27 19:17
vba这块真是人气不行,12年了还没个答案,我自己跑出来一个。加个事件,用public变量判断是否保存完成。不 ...

2楼给了标准答案,只因你视而不见罢了

TA的精华主题

TA的得分主题

发表于 2021-11-29 16:18 | 显示全部楼层
本帖最后由 foreverwatson 于 2021-11-29 17:55 编辑
ggmmlol 发表于 2021-11-28 15:40
2楼给了标准答案,只因你视而不见罢了

没看到。。。。。。。。。。。。。。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-28 02:57 , Processed in 0.060363 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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