Szukaj…


Składnia

  • Atrybut VB_Name = "ClassOrModuleName"
  • Atrybut VB_GlobalNameSpace = False 'Ignorowany
  • Atrybut VB_Creatable = False 'Ignorowany
  • Atrybut VB_PredeclaredId = {True | Fałszywy}
  • Atrybut VB_Exposed = {True | Fałszywy}
  • Atrybut zmiennaName.VB_VarUserMemId = 0 'Zero wskazuje, że jest to domyślny element członkowski klasy.
  • Atrybut variableName.VB_VarDescription = "some string" 'Dodaje tekst do informacji o przeglądarce obiektów dla tej zmiennej.
  • Atrybut procName.VB_Description = "some string" 'Dodaje tekst do informacji o przeglądarce obiektów dla procedury.
  • Atrybut procName.VB_UserMemId = {0 | -4}
    • „0: Ustawia funkcję jako domyślny element członkowski klasy.
    • „-4: Określa, że funkcja zwraca moduł wyliczający.

VB_Name

VB_Name określa nazwę klasy lub modułu.

Attribute VB_Name = "Class1"

Zostanie utworzone nowe wystąpienie tej klasy

Dim myClass As Class1
myClass = new Class1

VB_GlobalNameSpace

W VBA ten atrybut jest ignorowany. Nie został przeniesiony z VB6.

W wersji VB6 tworzy domyślną globalną instancję klasy („skrót”), dzięki czemu członkowie klasy mogą być dostępni bez użycia nazwy klasy. Na przykład DateTime (jak w DateTime.Now ) jest faktycznie częścią klasy VBA.Conversion .

Debug.Print VBA.Conversion.DateTime.Now
Debug.Print DateTime.Now

VB_Createable

Ten atrybut jest ignorowany. Nie został przeniesiony z VB6.

W VB6 był używany w połączeniu z atrybutem VB_Exposed do kontroli dostępności klas poza bieżącym projektem.

VB_Exposed=True 
VB_Creatable=True

Spowodowałoby to utworzenie Public Class , do której można by uzyskać dostęp z innych projektów, ale ta funkcjonalność nie istnieje w VBA.

VB_PredeclaredId

Tworzy globalne domyślne wystąpienie klasy. Dostęp do domyślnej instancji można uzyskać poprzez nazwę klasy.

Deklaracja

VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = "Class1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit

Public Function GiveMeATwo() As Integer
    GiveMeATwo = 2
End Function

Połączenie

Debug.Print Class1.GiveMeATwo

W pewnym sensie symuluje to zachowanie klas statycznych w innych językach, ale w przeciwieństwie do innych języków, nadal można utworzyć instancję klasy.

Dim cls As Class1
Set cls = New Class1
Debug.Print cls.GiveMeATwo

VB_Exposed

Kontroluje właściwości instancji klasy.

Attribute VB_Exposed = False

Sprawia, że klasa jest Private . Nie można uzyskać do niego dostępu poza bieżącym projektem.

Attribute VB_Exposed = True

Odsłania klasę Public poza projektem. Ponieważ jednak VB_Createable jest ignorowane w VBA, instancji klasy nie można utworzyć bezpośrednio. Jest to równoważne z następującą klasą VB.Net.

Public Class Foo
    Friend Sub New()
    End Sub
End Class    

Aby uzyskać instancję spoza projektu, musisz udostępnić fabrykę, aby utworzyć instancje. Jednym ze sposobów osiągnięcia tego jest zwykły moduł Public .

Public Function CreateFoo() As Foo
    CreateFoo = New Foo
End Function

Ponieważ moduły publiczne są dostępne z innych projektów, pozwala nam to tworzyć nowe instancje naszych klas Public - Not Createable do utworzenia.

VB_Description

Dodaje opis tekstowy do elementu klasy lub modułu, który staje się widoczny w Eksploratorze obiektów. Najlepiej byłoby, gdyby wszyscy członkowie publiczni interfejsu publicznego / API mieli opis.

Public Function GiveMeATwo() As Integer
    Attribute GiveMeATwo.VB_Description = "Returns a two!"        
    GiveMeATwo = 2
End Property

Opis Tekst w Eksploratorze obiektów

Uwaga: wszyscy członkowie akcesora właściwości ( Get , Let , Set ) używają tego samego opisu.

VB_ [Var] UserMemId

VB_VarUserMemId (dla zmiennych o zasięgu modułu) i VB_UserMemId (dla procedur) są używane w VBA głównie do dwóch rzeczy.

Określanie domyślnego elementu klasy

Klasa List , która hermetyzowałaby Collection , chciałaby mieć właściwość Item , aby kod klienta mógł to zrobić:

For i = 1 To myList.Count 'VBA Collection Objects are 1-based
    Debug.Print myList.Item(i)
Next

Ale z atrybutem VB_UserMemId ustawionym na 0 we właściwości Item kod klienta może to zrobić:

For i = 1 To myList.Count 'VBA Collection Objects are 1-based
    Debug.Print myList(i)
Next

Tylko jeden członek może legalnie mieć VB_UserMemId = 0 w dowolnej klasie. W przypadku właściwości określ atrybut w Get accessor:

Option Explicit
Private internal As New Collection

Public Property Get Count() As Long
    Count = internal.Count
End Property

Public Property Get Item(ByVal index As Long) As Variant
Attribute Item.VB_Description = "Gets or sets the element at the specified index."
Attribute Item.VB_UserMemId = 0
'Gets the element at the specified index.
    Item = internal(index)    
End Property

Public Property Let Item(ByVal index As Long, ByVal value As Variant)
'Sets the element at the specified index.    
    With internal
        If index = .Count + 1 Then
            .Add item:=value
        ElseIf index = .Count Then
            .Remove index
            .Add item:=value
        ElseIf index < .Count Then
            .Remove index
            .Add item:=value, before:=index
        End If
    End With
End Property

Tworzenie iterowalnej klasy za pomocą konstrukcji pętli For Each

Przy magicznej wartości -4 atrybut VB_UserMemId informuje VBA, że ten element zwraca VB_UserMemId wyliczający - który pozwala to zrobić kodowi klienta:

Dim item As Variant
For Each item In myList
    Debug.Print item
Next

Najprostszym sposobem na zaimplementowanie tej metody jest wywołanie metody [_NewEnum] właściwości hidden [_NewEnum] w Collection wewnętrznej / zamkniętej; identyfikator musi być ujęty w nawiasy kwadratowe ze względu na wiodący znak podkreślenia, który czyni go niedozwolonym identyfikatorem VBA:

Public Property Get NewEnum() As IUnknown
Attribute NewEnum.VB_Description = "Gets an enumerator that iterates through the List."
Attribute NewEnum.VB_UserMemId = -4
Attribute NewEnum.VB_MemberFlags = "40" 'would hide the member in VB6. not supported in VBA.
'Gets an enumerator that iterates through the List.
    Set NewEnum = internal.[_NewEnum]    
End Property


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow