Sök…
Syntax
- Attribut VB_Name = "ClassOrModuleName"
- Attribut VB_GlobalNameSpace = Falskt "Ignorerat
- Attribut VB_Creatable = Falsk "Ignorerad
- Attribut VB_PredeclaredId = {Sant | Falsk}
- Attribut VB_Exposed = {Sant | Falsk}
- AttributvariabelName.VB_VarUserMemId = 0 'Noll indikerar att detta är standardmedlem i klassen.
- AttributvariabelName.VB_VarDescription = "någon sträng" 'Lägger till texten i objektbläsarinformationen för denna variabel.
- Attribut procName.VB_Description = "någon sträng" 'Lägger till texten i objektbläsarinformationen för proceduren.
- Attribut procName.VB_UserMemId = {0 | -4}
- '0: Gör funktionen till standardmedlem i klassen.
- '-4: Anger att funktionen returnerar en teller.
VB_Name
VB_Name anger klassen eller modulnamnet.
Attribute VB_Name = "Class1"
En ny instans av denna klass skulle skapas med
Dim myClass As Class1
myClass = new Class1
VB_GlobalNameSpace
I VBA ignoreras detta attribut. Det överfördes inte från VB6.
I VB6 skapar det en standardinstans för global klass av klassen (en "genväg") så att klassmedlemmar kan nås utan att använda klassnamnet. Till exempel är DateTime
(som i DateTime.Now
) faktiskt en del av klassen VBA.Conversion
.
Debug.Print VBA.Conversion.DateTime.Now
Debug.Print DateTime.Now
VB_Createable
Detta attribut ignoreras. Det överfördes inte från VB6.
I VB6 användes det i kombination med attributet VB_Exposed
att kontrollera tillgängligheten för klasser utanför det aktuella projektet.
VB_Exposed=True
VB_Creatable=True
Skulle resultera i en Public Class
som kan nås från andra projekt, men den här funktionen finns inte i VBA.
VB_PredeclaredId
Skapar en global standardinstans av en klass. Standardinstansen nås via klassens namn.
Deklaration
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
Ring upp
Debug.Print Class1.GiveMeATwo
På vissa sätt simulerar detta beteendet hos statiska klasser på andra språk, men till skillnad från andra språk kan du fortfarande skapa en instans av klassen.
Dim cls As Class1
Set cls = New Class1
Debug.Print cls.GiveMeATwo
VB_Exposed
Kontrollerar instansegenskaperna för en klass.
Attribute VB_Exposed = False
Gör klassen Private
. Det går inte att komma åt det utanför det aktuella projektet.
Attribute VB_Exposed = True
Exponerar klassen Public
utanför projektet. Men eftersom VB_Createable
ignoreras i VBA kan instanser av klassen inte skapas direkt. Detta motsvarar följande VB.Net-klass.
Public Class Foo
Friend Sub New()
End Sub
End Class
För att få en instans utanför projektet måste du exponera en fabrik för att skapa instanser. Ett sätt att göra detta är med en vanlig Public
modul.
Public Function CreateFoo() As Foo
CreateFoo = New Foo
End Function
Eftersom offentliga moduler är tillgängliga från andra projekt, gör det möjligt för oss att skapa nya instanser av våra klasser som Public - Not Createable
.
VB_Description
Lägger till en textbeskrivning till en klass- eller modulmedlem som blir synlig i Object Explorer. Helst bör alla offentliga medlemmar i ett offentligt gränssnitt / API ha en beskrivning.
Public Function GiveMeATwo() As Integer
Attribute GiveMeATwo.VB_Description = "Returns a two!"
GiveMeATwo = 2
End Property
Obs: alla accessormedlemmar i en fastighet ( Get
, Let
, Set
) använder samma beskrivning.
VB_ [Var] UserMemId
VB_VarUserMemId
(för VB_VarUserMemId
) och VB_UserMemId
(för procedurer) attribut används i VBA mestadels för två saker.
Ange standardmedlem för en klass
En List
som skulle kapsla en Collection
vill ha en Item
, så klientkoden kan göra detta:
For i = 1 To myList.Count 'VBA Collection Objects are 1-based
Debug.Print myList.Item(i)
Next
Men med en VB_UserMemId
attribut satt till 0 på Item
egendom, kan klientkoden så här:
For i = 1 To myList.Count 'VBA Collection Objects are 1-based
Debug.Print myList(i)
Next
Endast en medlem kan lagligen ha VB_UserMemId = 0
i en viss klass. För egenskaper anger du attributet i 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
Att göra en klass iteratabel med en For Each
slingkonstruktion
Med det magiska värdet -4
berättar VB_UserMemId
attributet VBA att den här medlemmen ger en uppräknare - vilket gör att klientkoden kan göra detta:
Dim item As Variant
For Each item In myList
Debug.Print item
Next
Det enklaste sättet att implementera den här metoden är genom att ringa den dolda [_NewEnum]
-egenskapens getter på en intern / inkapslad Collection
; identifieraren måste bifogas i fyrkantiga parenteser på grund av det ledande understrecket som gör det till en olaglig VBA-identifierare:
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