MS Excel VBA:在Subs之间使用公共变量或传递变量是否更快?

时间:2017-09-26 16:40:38

标签: excel-vba vba excel

我不是最精明的VBA编码器,所以我很感激你的意见!我有多个模块,其中每个模块都需要访问一个工作簿(Master.xlsm)。 1)使用公共变量在其他模块中访问此工作簿或2)在使用它的每个子中打开它是否更快?

选项#1

我将工作簿设置为公共变量,并在使用Auto_Open打开工作簿时分配它。

Public wbk_MASTER As Workbook

Sub Auto_Open()

    Set wbk_MASTER = Workbooks.Open("C:\Master.xlsm")

End Sub

选项#2

或者,在每个使用Master.xlsm的子中,我只是传递它:

Sub DoSomething(wbk_master as Workbook)

    ' do something

End Sub

假设这个子看起来像子调用的那样:

Sub CallDoSomething()

    Dim wbk_master as Workbook
    Set wbk_master = Workbooks.Open("C:\Master.xlsm")

    Call DoSomething(wbk_master)

End Sub

请注意,像DoSomething这样的多个潜艇。如果它有所不同,我也希望在Master.xlsm中包含重要工作表的变量,甚至是特定范围的值。

就个人而言,我认为选项#1更清洁,但速度更快?

2 个答案:

答案 0 :(得分:1)

直接回答:

使用全局变量更快"以一种特别不明显的方式,因为:

你所看到的只是指向真实物体的指针 这种方式默认使用globalVariable.Sheets(1).NamesubOrFunctionVariable.Sheets(1).Name的速度没有差异 但是:将它传递给子/函数会创建一个指向它的新指针,这需要时间并使用内存 还是:这就像炸毁一个房子,并询问哪个针头掉落时会产生更多噪音。人类永远不应该有任何明显的差异。 ;)

只是寻找指针的使用,使用数字/字符串/数组/非指针对象可能会创建数据的完整副本(如果使用ByVal而不是ByRef)影响。

答案 1 :(得分:1)

Dirk直接回答了你的问题,然而第三种选择更具弹性?

在标准模块中:

Public Property Get SourceWorkbook() as Workbook

    Static wkb_Master As Workbook

    If wkb_Master is Nothing Then Set wkb_Master = Workbooks.Open("C:\Master.xlsm")

    Set SourceWorkbook = wkb_Master

End Property

然后可以使用它:

Sub test()

    SourceWorkbook.Sheets(1).Name

End Sub

它使范围变小且只读,此外,如果您的项目被重置,将重新打开源文档 - 您的方法都不会这样做。