VBA 提速的方法

 

问题描述:同样的代码。读取三万条数据并进行逻辑处理,2010excel 版本基础版本14.0.4763.1000 运行一秒一条,大概需要两三个小时左右。而2010excel 版本 14.0.7015.1000 运行大概一分钟左右。运行加处理。

 

处理办法:基本安装的都是 基础版本14.0.4763.1000 需要加上 补丁 Office 2010 SP2 

 

网上关于这个提速的问题都是 一些代码优化之类的,

而这个补丁是什么,补哪些方面的我没有具体研究。但是这个速度 是让我很吃惊的。

补丁下载地址:https://www.microsoft.com/zh-CN/download/details.aspx?id=39667

 

 

 

 

 

 

转载于:https://my.oschina.net/960823/blog/1502524

<think>我们正在讨论ExcelVBA中连续执行多个模块代码的方法。用户希望在一个过程中连续调用多个模块中的子过程或函数。在ExcelVBA中,有几种方法可以实现连续执行多个模块中的代码:1.直接调用:在一个主过程中按顺序调用各个子过程或函数。2.使用Application.Run方法:通过字符串形式指定要运行的过程名,这样可以动态调用,甚至跨工作簿调用。3.使用CallByName函数:通过对象和过程名的字符串来调用,但通常用于对象的方法。下面我们将详细说明这些方法方法1:直接调用假设我们有两个模块(Module1和Module2)中的子过程:Module1中有SubProc1()Module2中有SubProc2()我们可以创建一个主过程来按顺序调用它们:```vbaSubMain()CallProc1'调用Module1中的Proc1CallProc2'调用Module2中的Proc2EndSub```或者省略Call关键字:```vbaSubMain()Proc1Proc2EndSub```注意:直接调用要求过程的作用域必须是公共的(Public),并且过程名在当前作用域内可见(即没有同名的冲突)。方法2:使用Application.Run方法如果过程名是字符串变量,或者需要跨工作簿调用,可以使用Application.Run。```vbaSubMain()Application.Run"Module1.Proc1"Application.Run"Module2.Proc2"EndSub```使用Application.Run时,过程名可以包含模块名,也可以不包含。如果不包含模块名,VBA会在所有模块中查找该过程,如果有重名可能会出错。建议包含模块名以避免歧义。方法3:使用CallByName这种方法通常用于调用对象的方法,对于简单的子过程并不常用。但为了完整性,这里也提一下:```vba'假设我们有一个类模块,但普通模块中的过程不适用于此方法。'所以对于普通模块,我们通常不使用CallByName。```此外,如果需要传递参数,上述方法都可以传递参数。例如:直接调用:```vbaProc1arg1,arg2```使用Application.Run:```vbaApplication.Run"Module1.Proc1",arg1,arg2```注意事项:1.确保被调用的过程是Public的(默认是Public),如果过程被声明为Private,则只能在同一个模块中调用。2.如果过程在不同的工作簿中,需要先打开该工作簿,然后使用Application.Run时指定工作簿和模块名,如:Application.Run"'WorkbookName.xlsm'!Module1.Proc1"因此,根据需求选择合适的方法。最常用的是直接按顺序调用,如果过程名是动态的则使用Application.Run。下面是一个示例,展示如何连续执行三个不同模块中的子过程:```vba'在模块Module1中PublicSubFirstProcedure()MsgBox"第一个过程执行"EndSub'在模块Module2中PublicSubSecondProcedure()MsgBox"第二个过程执行"EndSub'在模块Module3中PublicSubThirdProcedure()MsgBox"第三个过程执行"EndSub'主过程(可以放在任意模块中)PublicSubRunAll()FirstProcedureSecondProcedureThirdProcedureEndSub```或者使用Application.Run:```vbaPublicSubRunAllDynamic()Application.Run"Module1.FirstProcedure"Application.Run"Module2.SecondProcedure"Application.Run"Module3.ThirdProcedure"EndSub```用户可以根据实际情况选择。另外,如果用户希望在一个过程执行完成后自动执行下一个,也可以考虑使用事件触发或者设置定时器(使用Application.OnTime),但连续执行通常按顺序调用即可。相关问题:1.如何在ExcelVBA中传递参数给被调用的过程?2.如何处理在连续执行多个过程时的错误?3.如何实现异步执行多个过程(即同时执行)?</think>### Excel VBA连续执行多个模块代码的方法 在Excel VBA中连续执行多个模块中的代码,主要有以下三种方法: #### 方法1:直接顺序调用(推荐) ```vba Sub MainProcedure() ' 调用模块1中的过程 Module1.Procedure1 ' 调用模块2中的过程 Module2.Procedure2 ' 调用模块3中的过程 Module3.Procedure3 End Sub ``` **特点**: - 最简洁直观的方式 - 要求所有过程必须是`Public`作用域 - 执行顺序明确可控 - 支持参数传递:`Module1.Calculate(10, 20)` #### 方法2:使用`Application.Run`方法 ```vba Sub RunMultiple() Application.Run "'工作簿名.xlsm'!Module1.Proc1" Application.Run "Module2.Proc2" Application.Run "Proc3" ' 省略模块名需确保过程名唯一 End Sub ``` **适用场景**: - 需要动态调用过程(过程名存储在变量中) - 跨工作簿调用过程 - 调用私有过程时:`Application.Run "Module4.PrivateProc"` #### 方法3:`CallByName`函数(面向对象) ```vba Sub CallByNameExample() Dim obj As Object Set obj = New ClassModule1 CallByName obj, "Method1", VbMethod CallByName obj, "Method2", VbMethod, 42 End Sub ``` **最佳实践**: - 主要用于类模块中的方法调用 - 支持参数传递 - 需要预先实例化对象 ### 关键注意事项 1. **作用域设置**: - 被调用的过程必须声明为`Public Sub` - 私有过程(`Private Sub`)只能在本模块内调用 2. **错误处理**: ```vba Sub SafeExecution() On Error Resume Next Module1.UnstableProc If Err.Number <> 0 Then MsgBox "模块1错误: " & Err.Description On Error GoTo 0 Module2.CriticalProc End Sub ``` 3. **执行控制**: - 使用`DoEvents`释放控制权避免界面冻结 ```vba Module1.LongOperation DoEvents ' 允许其他操作中断 Module2.ShortOperation ``` 4. **跨工作簿调用**: ```vba Application.Run "'AnotherWorkbook.xlsm'!ModuleX.ProcedureY" ``` ### 性能优化建议 - 关闭屏幕刷新提速: ```vba Application.ScreenUpdating = False Module1.BulkProcess Module2.DataExport Application.ScreenUpdating = True ``` - 使用`Call`关键字显式调用(可选): ```vba Call Module1.ValidateData ``` > **最佳实践**:对于常规需求,推荐**方法1的直接调用**方式,具有最佳可读性和执行效率。当需要动态调用或跨工作簿操作时,再考虑`Application.Run`方法[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值