變數
範圍
可以宣告變數(增加可見性級別):
- 在程式級別,在任何程式中使用
Dim
關鍵字; 一個區域性變數。 - 在模組級別,在任何型別的模組中使用
Private
關鍵字; 一個私人領域。 - 在例項級別,在任何型別的類模組中使用
Friend
關鍵字; 一個朋友的領域。 - 在例項級別,在任何型別的類模組中使用
Public
關鍵字; 一個公共領域。 - 在全域性範圍內,在標準模組中使用
Public
關鍵字 ; 一個全域性變數。
應始終使用儘可能小的範圍宣告變數:首選將引數傳遞給過程,而不是宣告全域性變數。
有關更多資訊,請參閱訪問修飾符 。
區域性變數
使用 Dim
關鍵字宣告一個區域性變數 :
Dim identifierName [As Type][, identifierName [As Type], ...]
宣告語法的 [As Type]
部分是可選的。指定時,它設定變數的資料型別,該型別確定將為該變數分配多少記憶體。這宣告瞭一個 String
變數:
Dim identifierName As String
如果未指定型別,則型別隱式為 Variant
:
Dim identifierName 'As Variant is implicit
VBA 語法還支援在單個語句中宣告多個變數:
Dim someString As String, someVariant, someValue As Long
請注意,必須為每個變數指定 [As Type]
(除了’Variant’之外)。這是一個相對常見的陷阱:
Dim integer1, integer2, integer3 As Integer 'Only integer3 is an Integer.
'The rest are Variant.
靜態變數
區域性變數也可以是 Static
。在 VBA 中,Static
關鍵字用於使變數記住它具有的值,上次呼叫過程時:
Private Sub DoSomething()
Static values As Collection
If values Is Nothing Then
Set values = New Collection
values.Add "foo"
values.Add "bar"
End If
DoSomethingElse values
End Sub
這裡的 values
系列被宣告為 Static
local; 因為它是一個物件變數,它被初始化為 Nothing
。宣告後面的條件驗證物件引用之前是否為 Set
- 如果它是第一次執行該過程,則集合將被初始化。DoSomethingElse
可能正在新增或刪除專案,並且下次呼叫 DoSomething
時它們仍然會在集合中。
替代
VBA 的
Static
關鍵字很容易被誤解 - 特別是經常使用其他語言的經驗豐富的程式設計師。在許多語言中,static
用於使類成員(欄位,屬性,方法,…)屬於型別而不是例項。static
上下文中的程式碼不能引用例項上下文中的程式碼。VBAStatic
關鍵字意味著完全不同的東西。
通常,Static
本地也可以作為 Private
,模組級變數(欄位)實現 - 但是這挑戰了應該以儘可能小的範圍宣告變數的原則; 相信你的直覺,使用你喜歡的任何一個 - 兩者都會起作用……但是使用 Static
而不瞭解它的作用可能會導致有趣的錯誤。
昏暗與私人
Dim
關鍵字在程式和模組級別是合法的; 它在模組級別的使用等同於使用 Private
關鍵字:
Option Explicit
Dim privateField1 As Long 'same as Private privateField2 as Long
Private privateField2 As Long 'same as Dim privateField2 as Long
Private
關鍵字僅在模組級別合法; 這邀請保留 Dim
用於區域性變數並使用 Private
宣告模組變數,特別是使用對比的 Public
關鍵字,無論如何必須使用它來宣告公共成員。或者在任何地方使用 Dim
- 重要的是一致性 :
私人領域
- 請使用
Private
宣告模組級變數。 - 請使用
Dim
宣告一個區域性變數。 - 請勿使用
Dim
宣告模組級變數。
無處不在
- 請使用
Dim
宣告任何私人/本地。 - 請勿使用
Private
宣告模組級變數。 - 避免宣告
Public
欄位。*
*一般來說,無論如何都應該避免宣稱 Public
或 Global
欄位。
欄位
在模組級別的宣告部分中,在模組級別宣告的變數是一個欄位。在標準模組中宣告的 Public
欄位是全域性變數 :
Public PublicField As Long
可以從任何地方訪問具有全域性範圍的變數,包括將引用其宣告的專案的其他 VBA 專案。
要建立變數 global / public,但僅在專案中可見,請使用 Friend
修飾符:
Friend FriendField As Long
這在載入項中尤其有用,其中的意圖是其他 VBA 專案引用載入項專案並且可以使用公共 API。
Friend FriendField As Long 'public within the project, aka for "friend" code
Public PublicField As Long 'public within and beyond the project
朋友欄位在標準模組中不可用。
例項欄位
在模組級宣告的變數,在宣告部分在一個類模組的主體的頂部(包括 ThisWorkbook
,ThisDocument
,Worksheet
,UserForm
和類模組 ),是一個例項欄位 :只要有一個它只存在例項的上課。
'> Class1
Option Explicit
Public PublicField As Long
'> Module1
Option Explicit
Public Sub DoSomething()
'Class1.PublicField means nothing here
With New Class1
.PublicField = 42
End With
'Class1.PublicField means nothing here
End Sub
封裝欄位
例項資料通常保留為 Private
,並且被稱為封裝。可以使用 Property
程式公開私有欄位。要公開公開私有變數而不給呼叫者提供寫訪問權,類模組(或標準模組)實現了 Property Get
成員:
Option Explicit
Private encapsulated As Long
Public Property Get SomeValue() As Long
SomeValue = encapsulated
End Property
Public Sub DoSomething()
encapsulated = 42
End Sub
類本身可以修改封裝的值,但呼叫程式碼只能訪問 Public
成員(如果呼叫者在同一個專案中,則訪問 Friend
成員)。
允許呼叫者修改:
- 一個封裝的值,一個模組暴露了
Property Let
成員。 - 封裝物件引用,模組公開
Property Set
成員。