VBA中有两个并行的任务,有可能吗?

我有一个要求,在哪里我search一个excel。 由于我遍历所有的行和列(许多行和列),它的花费时间。 我想在search操作正在进行时显示一个消息框。

在VBA中可以做到吗?

谢谢你,Yogesh

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

VBA的一个永恒的问题是线程的限制。 VBA被设想为一个单线程模型。 从那以后,它依然如此。 在本地VBA中使用multithreading构buildmacros是不可能的。

几个解决方法是用COM接口构buildDLL并在VBA中调用它们,或者在VBS中创build工作者脚本并在VBA中使用它们。

当在Excel中显示进度条时,单线程的这种局限性使开发人员感到非常烦恼。 没有API与Excel的内置进度条进行通信。 如果您希望直观地通知用户有关正在进行的一些工作,并且需要等待,那么您只剩下状态栏文本或等待光标。 另一种方法,有点复杂,因为它们的模式和非模式风格,是使用用户窗体。 另一种方法,但非常笨拙,不稳定和非本地的,是使用Internet Explorer对象并更新其HTML。

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

VBA是单线程的,所以无聊的答案是“不能做,不能做”。

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

你有几个select。

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

当代码运行很长时,这就是我如何模拟progressbar:

  • 添加单独的隐藏表单: 在这里输入图像描述

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

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

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

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