Excel VBA:将ParamArray转发到Application.Run

时间:2017-06-24 13:54:22

标签: excel vba excel-vba

在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个参数更好(更整洁)的解决方案?

1 个答案:

答案 0 :(得分:2)

为什么你打电话给Application.Run并不明显。我猜有两种可能性:1。你从另一个工作簿或加载项调用一个过程,或者2.由于某种原因,你需要通过它的名称调用当前项目中的过程,传递给一个字符串。

假设您希望坚持通过ParamArray将所有参数传递到例程然后调用Application.Run的结构,那么您的'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数组中包含的变量是什么?

相关问题