Excel VBA 2010中的消息泵如何生成?

我有一个需要很长时间的Excelmacros。 它似乎崩溃的Excel(我得到一个非响应的消息,在任务栏),当我离开它无人看pipe,但如果我把一个断点,每五秒或十秒击中,没关系。 麻烦的是,我需要从大约25万次的断点处开始(我们正在考虑执行这个野兽大约200个小时)

我猜测没有消息泵活动是对抗内核,所以我怎么可以冲洗消息队列? 还是我完全吠叫了错误的树?

顺便说一下,我很新,所以文档引用将非常受欢迎。

干杯,伙计

借用200h有点担心的观点,可以尝试DoEvents声明“ 放弃macros的执行,以便操作系统可以处理其他事件 ”。 (请注意,调用DoEvents有额外的时间处罚)

我必须同意0xA3,如果你有一个超过200小时的excel例程,那么你要么以非常低效的方式进行设置,要么使用错误的工具来完成这项工作。

无论如何,你可以做一些事情来优化例程。 如果你不断地给单个单元格写数值,这些特别有用。

 Sub MarathonCalc Application.EnableEvents = False Application.ScreenUpdating = False ' Code to decode human genome goes here Application.EnableEvents = True Application.ScreenUpdating = True End Sub 

再一次,如果你发布了一些代码,也许我们可以帮助你找出为什么这么长时间。

“没有响应”并不意味着Excel崩溃,它只是意味着它实际上不响应窗口消息。

除非这是一个问题,否则你不需要担心。 我很担心你的评论,你期望的任务需要花费200小时(这是一个多星期!)。 在我看来,你没有使用正确的工具来完成这项工作。 试着找出需要花费的时间,并解释你实际上在做什么。 那么我们可以看到如何更好地解决这个任务。

以前的答案给了你“DoEvents”,这是你的问题的第一线修复。

然而…仔细看看发生了什么引起了一些令人担忧的问题。 首先,Excel的线程模型是相当原始的:有一个过程(根据文档),没有新线程由内部或外部生成的事件,callback和消息创build。 一个进程,一个进程,其他所有事情都要等到当前的VBAmacros或电子表格计算完成。

实际上,有些东西可能会打断这个:{esc}和{ctrl-break}(尽pipe这些可以暂时禁用),所以至less有一个其他线程在Excel中运行,并且您希望操作系统是允许打破进程…不是吗?

丑陋的现实是Excel应用程序不允许外部事件和消息在macros或计算运行时运行到“事件接收器”,除非您调用“DoEvents”,并且某些Windows消息(注意大小写)仍然不会被处理。

如果没有logging的消息和外部事件数量悬而未决,应用程序将崩溃。 根据我自己的testing,我认为这个数字是50; 有关于registry设置的文档,但我没有链接到我认为不可靠的材料 – 我尝试了有关的设置,发现它是无效的。

那么这个离开你呢?

首先,再次查看你的代码。 Application.EnableEvents = False和Application.ScreenUpdating = False是有用的设置:你的下一步是find所有读取或写入操作,以单张单元格,只抓住单元格数组 – 抓住一个数组使用更快myVBAarray = Range.Value,在VBA中进行计算,然后将VBA数组variables写回Range.Value。

其次,你也看到,由断点强加的“等待”状态可以让一些事情自行排除。 这听起来像是一个asynchronous运行的外部进程(数据库查询?):是不是崩溃的Excel的消息或事件来自该进程?