Ana*_*com 20
您可能已经了解到VBA本身并不支持多线程.有3种方法可以实现多线程:
我在这里比较了所有的线程方法:http://analystcave.com/excel-multithreading-vba-vs-vbscript-vs-c-net/
考虑到方法#3,我还制作了一个VBA多线程工具,可以让您轻松地向VBA添加多线程:http://analystcave.com/excel-vba-multithreading-tool/
请参阅以下示例:
多线程For循环
Sub RunForVBA(workbookName As String, seqFrom As Long, seqTo As Long)
For i = seqFrom To seqTo
x = seqFrom / seqTo
Next i
End Sub
Sub RunForVBAMultiThread()
Dim parallelClass As Parallel
Set parallelClass = New Parallel
parallelClass.SetThreads 4
Call parallelClass.ParallelFor("RunForVBA", 1, 1000)
End Sub
Run Code Online (Sandbox Code Playgroud)
异步运行Excel宏
Sub RunAsyncVBA(workbookName As String, seqFrom As Long, seqTo As Long)
For i = seqFrom To seqTo
x = seqFrom / seqTo
Next i
End Sub
Sub RunForVBAAndWait()
Dim parallelClass As Parallel
Set parallelClass = New Parallel
Call parallelClass.ParallelAsyncInvoke("RunAsyncVBA", ActiveWorkbook.Name, 1, 1000)
'Do other operations here
'....
parallelClass.AsyncThreadJoin
End Sub
Run Code Online (Sandbox Code Playgroud)
sta*_*lee 13
我正在寻找类似的东西,官方的答案是否定的.但是,我在ExcelHero.com上找到了Daniel的有趣概念.
基本上,您需要创建worker vbscripts来执行您想要的各种事情并让它报告回excel.对于我正在做的事情,从各种网站检索HTML数据,效果很好!
看一看:
http://www.excelhero.com/blog/2010/05/multi-threaded-vba.html
我正在添加这个答案,因为程序员从更现代的语言进入VBA并在VBA中搜索Stack Overflow进行多线程处理可能并不知道有几种本机VBA方法有时可以帮助弥补VBA缺乏真正的多线程.
如果多线程的动机是拥有一个响应更快的UI,当执行长时间运行的代码时它不会挂起,VBA确实有一些经常在实践中工作的低技术解决方案:
1)可以使用户表单无模式显示 - 这允许用户在表单打开时与Excel交互.这可以在运行时通过将Userform的ShowModal属性设置为false来指定,也可以通过放置行来作为来自加载的动态完成
UserForm1.Show vbModeless
Run Code Online (Sandbox Code Playgroud)
在用户表单的初始化事件中.
2)DoEvents声明.这会导致VBA放弃对OS的控制,以执行事件队列中的任何事件 - 包括Excel生成的事件.典型的用例是在代码执行时更新图表.如果没有DoEvents,在运行宏之前不会重新绘制图表,但使用Doevents可以创建动画图表.这种想法的变体是创建进度表的常见技巧.在一个执行10,000,000次(并由循环索引i控制)的循环中,您可以拥有一段代码,如:
If i Mod 10000 = 0 Then
UpdateProgressBar(i) 'code to update progress bar display
DoEvents
End If
Run Code Online (Sandbox Code Playgroud)
这些都不是多线程 - 但在某些情况下它可能是一个足够的kludge.
| 归档时间: |
|
| 查看次数: |
92315 次 |
| 最近记录: |