2017-09-26 33 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)可能會產生影響。