變數

範圍

可以宣告變數(增加可見性級別):

  • 在程式級別,在任何程式中使用 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 上下文中的程式碼不能引用例項上下文中的程式碼。VBA Static 關鍵字意味著完全不同的東西。

通常,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 欄位。*

*一般來說,無論如何都應該避免宣稱 PublicGlobal 欄位。

欄位

在模組級別的宣告部分中,在模組級別宣告的變數是一個欄位。在標準模組中宣告的 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

朋友欄位在標準模組中不可用。

例項欄位

在模組級宣告的變數,在宣告部分在一個類模組的主體的頂部(包括 ThisWorkbookThisDocumentWorksheetUserForm類模組 ),是一個例項欄位 :只要有一個它只存在例項的上課。

'> 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 成員。