我有一个要求,我搜索excel。由于我循环遍历所有行和列(许多行和列),因此需要花费时间。我想在搜索操作进行时显示一个消息框。
可以在VBA中进行吗?
谢谢, 约杰什
答案 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,无法完成"。
此外,显示一个消息框会阻止您的唯一线程,因此使用一个应该是不可能的。
你有几种选择。
DoEvents
可以在这里帮助一点。Public Event UpdateProgress
,然后表单需要声明一些Private WithEvents myLogic As MyObject
来处理那件事。BackgroundWorker
包装到COM可见库中,让.NET为您创建后台线程。答案 3 :(得分:0)
这就是我在代码运行时模仿进度条的方式:
添加单独的隐藏表格:
(白色背景,范围B2:G2
合并并格式化为%,所有其他行/列隐藏)
将条件格式应用于B2
:数据栏 - 最低值:0,最高值1,选择进度条背景颜色
当代码开始运行时,取消隐藏并激活它,进度更改B2
值(0-> 0%,1-> 100%),并调用DoEvents使其无效