Excel VBA:将ParamArray转发到Application.Run

在Excel VBA中进行编程时,我经常closuresCalculation和ScreenUpdating(有时也包括DisplayAlerts等),做一些冗长的计算,并将它们切换回以前的状态(因为这些函数可能互相调用,所以不一定会打开)。 所以我想为此有一个标准的方法。

在VBA中没有lambda函数,但Application.Run可能是一个可接受的解决scheme,所以我来到这个代码:

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设置的限制。

我的问题是:有没有更好的(整洁)解决scheme,而不是一个接一个写30个参数?

为什么要调用Application.Run并不明显。 我想有两种可能性:1.你从另一个工作簿或加载项调用一个过程,或者2.出于某种原因,你需要调用当前项目中的一个过程的名字,作为一个string。

假设你想坚持通过一个ParamArray传递所有参数到一个例程,然后调用Application.Run ,你的“运行”过程将需要有一个Variant作为它的参数,而不是一个ParamArrayParamArray是一个数组, 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数组中包含的variables是什么?

将parameter passing给子过程可以通过ByRef或ByVal完成,但是将parameter passing给函数始终是ByVal。 ByRef似乎是一个更好的select。

 Option Explicit Sub main() Dim a As Long, arr As Variant ReDim arr(4) For a = LBound(arr) To UBound(arr) arr(a) = a Next a upByTen arr For a = LBound(arr) To UBound(arr) Debug.Print arr(a) Next a End Sub Sub upByTen(ByRef myArr As Variant) Dim i As Long For i = LBound(myArr) To UBound(myArr) myArr(i) = myArr(i) + 10 Next i End Sub 'results from Immediate window 10 11 12 13 14