2017-09-26 72 views
1

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

选项#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

保持范围尽可能小是最好的做法,选项2是更好的做法。速度 – SWa

+0

我认为如果您需要在多个潜艇中使用主控,最好打开/设置一次,保持打开状态,并在需要时访问数据。我投票支持#1。使用公共作用域将保持对象可访问。我也同意SWa的看法,但最佳做法是建议,而不是“一个适合所有人”的解决方案。 #1可能会为xlsm分配更多的内存,但是从这个角度来看,将需要更少的开启/关闭,所以处理器时间更少,速度更快。 –

+0

我开始从事VBA职业选择1,但是随着我的课程的发展,我发现我的代码页变成了小说,我的项目变得很庞大,根据选项2将变量传递到例程要好得多 - 但是,主要是因为我可以将任何工作簿传递给例程,并且不必在打开时打开并定义大量工作簿。只是感觉更容易跟踪。 – jamheadart

回答

1

德克直接回答了您的问题,但是如何获得更具弹性的第三选项?

在标准模块:

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 

它使范围小,只读,还应该你的项目被重置,将重新打开源文件 - 你的方法都不会做到这一点。

+0

我必须测试一下,但我真的很喜欢这个答案!我喜欢它避免使用全局变量,并保持整洁。 – Carbo

+0

仍然存在一个缺点:你会失去“公共变量”的速度优势,因为每个交互都会检查它是什么都没有导致延迟(不明显)。这一点,它将(再次不明显)更快地设置一个局部变量内的子/功能的属性,使用(是......不可知)更多的内存来存储一个指针:P –

+1

@DirkReichel如果我是关注指向对象的指针的开销,我不应该首先使用Excel VBA;) – SWa

1

要直接回答:

使用全局变量是在一个特殊的不引人注目的方式“更快”,因为:

你要找的只是一个指针,真正的对象。
这种方式默认情况下在使用globalVariable.Sheets(1).NamesubOrFunctionVariable.Sheets(1).Name时速度没有差异。
但是:将它传递给子/函数会创建一个指向它的新指针,这需要时间并使用内存。
仍然:这就像吹了一个房子,并问如果下降,哪个针会造成更多的噪音。对于一个人来说不应该有任何明显的差异。 ;)

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