在Excel VBA中编程时,我经常关闭Calculation和ScreenUpdating(有时也会显示DisplayAlerts等),进行一些冗长的计算,并将它们切换回以前的状态(不一定是因为这些函数可能互相调用) 。所以我想有一个标准的方法。
VBA中没有lambda函数,但Application.Run可能是一个可接受的解决方案,所以我来到这段代码:
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个参数更好(更整洁)的解决方案?
答案 0 :(得分:2)
为什么你打电话给Application.Run
并不明显。我猜有两种可能性:1。你从另一个工作簿或加载项调用一个过程,或者2.由于某种原因,你需要通过它的名称调用当前项目中的过程,传递给一个字符串。
假设您希望坚持通过ParamArray
将所有参数传递到例程然后调用Application.Run
的结构,那么您的'run'过程需要Variant
}作为其参数而不是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
我怀疑可能有更好的方法来完成您的任务,如果您能提供更多详细信息,我们可以为您提供更多帮助。主要问题是为什么需要通过Application.Run
调用您的例程,您的代码位于何处以及varArgs
数组中包含的变量是什么?