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
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