【发布时间】:2017-07-05 13:52:18
【问题描述】:
我有一个相对较大 (7MB) 但更重要的是公式和宏重的 Excel 文件,这是我最近一直在开发的。 对于最终用户,它必须能够在自动计算模式下使用。
在手动计算模式下使用 F9(立即计算)计算整个工作表时,将在约 10 秒内工作并计算,但当我将其打开为自动模式时,它会重复计算(即达到100%,然后立即从 0% 重新开始),因此无限期冻结。
到目前为止我已经尝试过:
- 在所有 VBA 宏中放置断点以查看它是否挂在宏内
- 从文件中删除所有宏(我担心其中一个会被触发以自动模式重复运行)
但两者都没有起作用,这让我怀疑这个问题实际上是否与 VBA 无关。
有没有人对以下方面有任何想法:
- 可能是什么原因造成的?
- 如何诊断原因?
如果有帮助,很乐意提供更多背景信息。我是一个相对有经验的 excel 用户,虽然通常不会从头开始编写 VBA 宏,但我对重新利用我继承/在线查找的代码很有信心。我用的是比较强大的 6 核机器,但是在其他机器上测试过,结果是一样的。
【问题讨论】:
-
尝试将文件另存为 .xls 以确保它不是宏问题。如果文件仍然作为未启用宏的文件挂起(确保在保存后关闭并重新打开),那么这是一个公式问题。如果文件仍未挂起,则为宏问题。我的计算经验并不太广泛,但如果你让它在这样的循环中计算,那么要么是一个事件正在触发(可能是一个工作表事件),要么你的公式是不稳定的(任何时候一个值发生变化,所有相关的值都必须重新计算。这与 Excel 的标准“仅脏单元格”方法不同。
-
不幸的是,我正在使用 64 位 .xlsb 文件,因此无法保存为 xls,因为工作表不够大,无法容纳我的数据所在的位置。文件中有大量的volatile函数[主要是INDIRECT()],值得研究。如果是事件触发,我将如何诊断?
-
除了将其保存为非宏文件之外,您还可以在即时窗口中执行“Application.EnableEvents = False”。这应该关闭所有事件。还有安全设置,或者手动检查VB项目中的每一个文件夹并添加断点。
-
感谢所有帮助。事实证明,该问题是宏触发的不稳定操作。我有一个宏循环隐藏空行,但隐藏一行是不稳定的,所以在下一次循环运行之前触发一个新的计算。循环本身是 500 次迭代,所以这意味着 500 组 3 秒计算!如果您改写为专注于易变的操作,很高兴将其标记为答案!