Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA:将参数数组转发到应用程序。运行_Vba_Excel - Fatal编程技术网

Excel VBA:将参数数组转发到应用程序。运行

Excel VBA:将参数数组转发到应用程序。运行,vba,excel,Vba,Excel,在Excel VBA中编程时,我经常关闭计算和屏幕更新(有时还显示警报等),进行一些冗长的计算,然后将它们切换回以前的状态(不一定打开,因为这些函数可能会相互调用)。所以我想要一个标准的方法 VBA中没有lambda函数,但Application.Run可能是一个可接受的解决方案,因此我编写了以下代码: Public Function FastRun(strMacroQuoted As String, ParamArray varArgs() As Variant) As Variant

在Excel VBA中编程时,我经常关闭计算和屏幕更新(有时还显示警报等),进行一些冗长的计算,然后将它们切换回以前的状态(不一定打开,因为这些函数可能会相互调用)。所以我想要一个标准的方法

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。您正在从其他工作簿或加载项调用过程,或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。它是一个函数而不是一个子函数,因为被调用方可能(也可能不)返回一个值——我希望它尽可能通用和抽象。