我不是最精明的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更清洁,但速度更快?
答案 0 :(得分:1)
直接回答:
使用全局变量更快"以一种特别不明显的方式,因为:
你所看到的只是指向真实物体的指针
这种方式默认使用globalVariable.Sheets(1).Name
或subOrFunctionVariable.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
它使范围变小且只读,此外,如果您的项目被重置,将重新打开源文档 - 您的方法都不会这样做。