VBA中的两个并行任务,是否可能?

时间:2015-03-01 20:51:53

标签: excel vba

我有一个要求,我搜索excel。由于我循环遍历所有行和列(许多行和列),因此需要花费时间。我想在搜索操作进行时显示一个消息框。

可以在VBA中进行吗?

谢谢, 约杰什

4 个答案:

答案 0 :(得分:2)

doevents会中断当前线程并允许更新用户环境。

答案 1 :(得分:2)

VBA的一个永恒问题是它的线程限制。 VBA被认为是一个单线程模型。从那以后,它仍然如此。在本机VBA中使用多线程构建宏是不可能的。

使用COM接口构建DLL并在VBA中召唤它们或在VBS中创建工作程序脚本并在VBA中使用它们的解决方法很少。

单线程的这种限制在excel中显示进度条时广泛地惹恼了开发人员。没有API可以与Excel的内置进度条进行通信。 如果您希望在视觉上通知用户正在进行的某些工作并且需要等待,那么您剩下的就是状态栏文本或等待光标。另一种方法和位错综复杂,因为它们的模态和非模态样式,是使用UserForms。另一种方法,但非常笨拙,不稳定和非本机,是使用Internet Explorer对象并更新其HTML。

vba代码:http://ashuvba.blogspot.in/2014/10/ajax-style-progress-display-in-vba.html

答案 2 :(得分:0)

VBA是单线程的,所以无聊的答案是" nope,无法完成"。

此外,显示一个消息框会阻止您的唯一线程,因此使用一个应该是不可能的。

你有几种选择。

  1. 在主机应用程序的状态栏中报告进度。这可以使您长时间运行的任务运行得更长,因为现在在实际工作之上,您需要刷新UI元素 - DoEvents可以在这里帮助一点。
  2. 报告自定义用户表单中的进度。这可能很棘手,因为您可能不希望该表单实际上拥有执行长期运行任务所执行的任何操作的代码/逻辑;您需要将该逻辑封装在类/对象中,并让表单调用该对象 - 该对象公开一些Public Event UpdateProgress,然后表单需要声明一些Private WithEvents myLogic As MyObject来处理那件事。
  3. 将.NET BackgroundWorker包装到COM可见库中,让.NET为您创建后台线程。

答案 3 :(得分:0)

这就是我在代码运行时模仿进度条的方式:

  • 添加单独的隐藏表格: enter image description here

    (白色背景,范围B2:G2合并并格式化为%,所有其他行/列隐藏)

  • 将条件格式应用于B2:数据栏 - 最低值:0,最高值1,选择进度条背景颜色

  • 当代码开始运行时,取消隐藏并激活它,进度更改B2值(0-> 0%,1-> 100%),并调用DoEvents使其无效

  • 隐藏此工作表并在完成时激活主工作表