2013-08-19 53 views
5

我一直在excel中使用VBA類模塊一段時間,但我不確定我是否正確創建它們。我通常爲該類創建模塊級變量,然後創建屬性讓和獲取函數。例如:我是否必須在VBA類對象中有重複值?

Private msRegion As String 

Property Get Region() As String 
    Region = msRegion 'Return the Region 
End Property 

Property Let Region(ByVal sRegionName As String) 
    msRegion = sRegionName 'Set the Region 
End Property 

當我看對象在本地窗口,我注意到,每個屬性我結束了與模塊作用域的變量,並通過設功能所需的變量。這似乎是一個變量重複給我。我擔心,如果我在每個對象中安裝了大量的對象,那麼在資源方面可能會很昂貴。

我試圖修改代碼,以便只有一個變量在對象類中,但到目前爲止,我只有我的痛苦的錯誤消息。

有沒有人知道在類模塊中創建不會導致重複變量的屬性的方法?

編輯:

我剛剛再看看我的當地人窗口,實現了這樣的說法對出租物業是不存在的。 2表達式看起來是私有存儲的變量,並且屬性獲得值,在這種情況下是msRegion和Region。這符合Cor_Blimey的答案。

+1

+1好問題,我也很好奇。我找到的所有示例(以及我已經實現的示例)都反映了您的代碼。我懷疑這是事情的本質,並且是正確的,但在當地人窗口中有點混淆。 –

回答

5

您是否試圖在調用該類的代碼中獲取或設置msRegion屬性?如果你這樣做,你會注意到它不可調用。

您正在構建正確的類。

本地窗口顯示所有聲明的變量,包括類中的私有varibale。

+0

感謝您提供的信息,我希望在程序結束時可以銷燬let程序的參數,但我想這不是它的工作方式。 –

4

Declan_K正確地說a)你正在做的是正確的,b)當地人窗口忽略範圍並反正顯示它們。

要加一點,爲什麼它是很好的獨立出來,並有一個公共財產,而私有成員字段:

1)您可以在獲取具有有用有限的「邏輯」 /設置/讓。也許你希望以不同的格式存儲這個值,但是總是把它存放在另一個格式中(例如把它存儲爲一個長的毫秒數,但總是以雙精度數來返回),或者你希望在存儲它之前驗證數據。

2)您定義了一個公共「接口」,它表示您的類和消費類之間的合同。因此,您應該明確區分班級的內部結構,您可以根據自己的情況隨意更改內部結構和外部接口。這在VBA中實際上可能不是問題,因爲您可能完全控制所有的消費類,並且VBA按需編譯,因此它不是將屬性更改爲屬性的問題,反之亦然,但這是一種好的做法,應該有助於執行更好的封裝。它還將幫助你記住,當你需要確定你的Addin /程序中的其他地方沒有發生突變時!

3)屬性基本上不佔用變量的額外存儲空間。具有公共領域和具有私人支持領域的財產的情況下的存儲要求基本相同。如果它對你有幫助,可以把它看作是返回私有值的「函數」或設置私有值的「子」。

4)在某些情況下,您實際上可以節省資源:考慮具有返回對象屬性的類(例如「結果」集合或其他類)。您可以將支持字段保留爲Nothing,直到實際需要對象,可以通過類中的方法或通過消費者通過屬性請求該方法。當它被請求時,你可以根據需要實例化對象。

5)用於設置器和訪問者單獨範圍:域爲私人或都是公開的,因此,如果它是公共你不能防止,例如,被製成的字段引用的新對象可以或可以不與你班級期望的狀態不一致。另一方面,你可以限制一個屬性爲只讀等。(注意,這不會阻止只讀對象的屬性發生變化 - 它只會阻止引用的更改)。同樣,按照第2點,這對你來說可能不是什麼問題,因爲它在你的項目中,並且只有VBA,但它應該有助於確保你的類的屬性(在鬆散的意義上)是整數你的班級的特點由你的班級控制。

6)其他語言還有很多其他的原因,但是VBA的確有更少的原因。

另一方面,輸出如此多的文字是一件很痛苦的事,你可能會或可能不會覺得有用!

相關問題