Excel VBA:将参数数组转发到应用程序。运行
在Excel VBA中编程时,我经常关闭计算和屏幕更新(有时还显示警报等),进行一些冗长的计算,然后将它们切换回以前的状态(不一定打开,因为这些函数可能会相互调用)。所以我想要一个标准的方法 VBA中没有lambda函数,但Application.Run可能是一个可接受的解决方案,因此我编写了以下代码:Excel VBA:将参数数组转发到应用程序。运行,vba,excel,Vba,Excel,在Excel VBA中编程时,我经常关闭计算和屏幕更新(有时还显示警报等),进行一些冗长的计算,然后将它们切换回以前的状态(不一定打开,因为这些函数可能会相互调用)。所以我想要一个标准的方法 VBA中没有lambda函数,但Application.Run可能是一个可接受的解决方案,因此我编写了以下代码: Public Function FastRun(strMacroQuoted As String, ParamArray varArgs() As Variant) As Variant
Public Function FastRun(strMacroQuoted As String, ParamArray varArgs() As Variant) As Variant
Dim blnOldScreenUpdating As Boolean: blnOldScreenUpdating = Application.ScreenUpdating
Application.ScreenUpdating = False
Dim clcOldCalculation As XlCalculation: clcOldCalculation = Application.Calculation
Application.Calculation = xlCalculationManual
FastRun = Application.Run(strMacroQuoted, varArgs(0))
Application.Calculation = clcOldCalculation
Application.ScreenUpdating = blnOldScreenUpdating
End Function
我可以给varArgs中的所有参数一个接一个地运行(从0到29),因此我的FastRun不会将参数数量限制在Run设置的限制之外
我的问题是:有没有更好的(更整洁的)解决方案,比一个接一个地编写30个参数更好?不清楚为什么要调用
应用程序。运行。我想有两种可能:1。您正在从其他工作簿或加载项调用过程,或2。由于某种原因,您需要在当前项目中调用一个过程,该过程的名称作为字符串传递
假设您希望坚持通过ParamArray
将所有参数传递到例程中,然后该例程调用应用程序。Run
,那么您的“Run”过程需要有一个变量作为其参数,而不是ParamArray
。ParamArray
是一个数组,Variant
在传递时会解释为数组。因此,您的代码如下所示:
Public Sub Main1()
CallingRoutine "MyRoutine", 1, 2, 3
End Sub
Public Sub CallingRoutine(routineName As String, ParamArray varArgs() As Variant)
Application.Run routineName, varArgs
End Sub
Public Sub MyRoutine(arr As Variant)
Debug.Print "Item 0 ="; arr(0)
Debug.Print "Item 1 ="; arr(1)
Debug.Print "Item 1 ="; arr(2)
End Sub
我想可能有更好的方法来完成你的任务,如果你能提供更多的细节,我们可能会帮助你更多。主要问题是为什么需要通过应用程序调用例程。运行
,代码位于何处,以及varArgs
数组中包含哪些变量?原因是第二个:我想按过程的名称调用该过程。正如我写的,我希望有一个标准的方式来“加速”潜艇。我不想限制可以传递的参数的数量,我希望有整洁的代码,而不逐个枚举30个参数。它引入了一个约束:被调用的sub必须以变量数组的形式接收其参数,因此在编写sub时,我必须记住,我可能希望稍后通过FastRun调用它。但是我没有找到一个更好的解决方案,这是VBA的典型特征。我认为你可能在做VBA的弊病。从外部来看,它看起来好像你来自C语言背景,因为你的编码结构看起来隐约让人联想到这一点(例如,我不明白为什么FastRun
是一个函数,它不返回任何东西-在VBA中,这不应该是一个子函数吗?在VBA中,希望通过字符串名调用同一项目中的例程是不寻常的). 我禁不住想,有更好的方法来组织整个任务,也许更适合VBA编码结构。如果你能给我们一些细节的话,我会很乐意帮忙的。是的,我认为C++优于VBA。它是一个函数而不是一个子函数,因为被调用方可能(也可能不)返回一个值——我希望它尽可能通用和抽象。