Zoeken…
Syntaxis
- Attribuut VB_Name = "ClassOrModuleName"
- Attribuut VB_GlobalNameSpace = False 'Genegeerd
- Attribuut VB_Creatable = False 'Genegeerd
- Attribuut VB_PredeclaredId = {True | false}
- Attribuut VB_Exposed = {True | false}
- Attribuut variableName.VB_VarUserMemId = 0 'Nul geeft aan dat dit het standaardlid van de klasse is.
- Attribuut variableName.VB_VarDescription = "some string" 'Voegt de tekst toe aan de objectbrowserinformatie voor deze variabele.
- Attribuut procName.VB_Description = "some string" 'Voegt de tekst toe aan de Object Browser-informatie voor de procedure.
- Attribuut procName.VB_UserMemId = {0 | -4}
- '0: maakt van de functie het standaardlid van de klasse.
- '-4: geeft aan dat de functie een teller retourneert.
VB_Name
VB_Name geeft de naam van de klasse of module aan.
Attribute VB_Name = "Class1"
Een nieuw exemplaar van deze klasse zou worden gemaakt met
Dim myClass As Class1
myClass = new Class1
VB_GlobalNameSpace
In VBA wordt dit kenmerk genegeerd. Het werd niet overgedragen van VB6.
In VB6 maakt het een standaard globaal exemplaar van de klasse (een "snelkoppeling"), zodat toegang tot klassenleden kan worden verkregen zonder de klassenaam te gebruiken. DateTime
(zoals in DateTime.Now
) maakt bijvoorbeeld eigenlijk deel uit van de klasse VBA.Conversion
.
Debug.Print VBA.Conversion.DateTime.Now
Debug.Print DateTime.Now
VB_Createable
Dit kenmerk wordt genegeerd. Het werd niet overgedragen van VB6.
In VB6 werd het gebruikt in combinatie met het kenmerk VB_Exposed
om de toegankelijkheid van klassen buiten het huidige project te beheren.
VB_Exposed=True
VB_Creatable=True
Zou resulteren in een Public Class
, die toegankelijk zou zijn vanuit andere projecten, maar deze functionaliteit bestaat niet in VBA.
VB_PredeclaredId
Creëert een globale standaardinstantie van een klasse. De standaardinstantie is toegankelijk via de naam van de klasse.
Verklaring
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
telefoontje
Debug.Print Class1.GiveMeATwo
In sommige opzichten simuleert dit het gedrag van statische klassen in andere talen, maar in tegenstelling tot andere talen kunt u nog steeds een instantie van de klasse maken.
Dim cls As Class1
Set cls = New Class1
Debug.Print cls.GiveMeATwo
VB_Exposed
Regelt de instance-eigenschappen van een klasse.
Attribute VB_Exposed = False
Maakt de klas Private
. Het is niet toegankelijk buiten het huidige project.
Attribute VB_Exposed = True
Toont de klasse Public
ly, buiten het project. Omdat VB_Createable
echter in VBA wordt genegeerd, kunnen instanties van de klasse niet rechtstreeks worden gemaakt. Dit komt overeen met een van de volgende VB.Net-klassen.
Public Class Foo
Friend Sub New()
End Sub
End Class
Om een instantie van buiten het project te krijgen, moet u een fabriek vrijgeven om instanties te maken. Een manier om dit te doen is met een reguliere Public
module.
Public Function CreateFoo() As Foo
CreateFoo = New Foo
End Function
Aangezien openbare modules toegankelijk zijn vanuit andere projecten, kunnen we hiermee nieuwe instanties van onze klassen Public - Not Createable
.
VB_Description
Voegt een tekstbeschrijving toe aan een klasse- of modulelid dat zichtbaar wordt in de Objectverkenner. Idealiter zouden alle openbare leden van een openbare interface / API een beschrijving moeten hebben.
Public Function GiveMeATwo() As Integer
Attribute GiveMeATwo.VB_Description = "Returns a two!"
GiveMeATwo = 2
End Property
Opmerking: alle accessor-leden van een eigenschap ( Get
, Let
, Set
) gebruiken dezelfde beschrijving.
VB_ [Var] UserMemId
VB_VarUserMemId
(voor modulebereikvariabelen) en VB_UserMemId
(voor procedures) attributen worden in VBA meestal voor twee dingen gebruikt.
Het standaardlid van een klasse opgeven
Een List
klasse die een zou inkapselen Collection
zou willen een hebben Item
pand, dus de klant code dit kunt doen:
For i = 1 To myList.Count 'VBA Collection Objects are 1-based
Debug.Print myList.Item(i)
Next
Maar met een VB_UserMemId
kenmerk ingesteld op 0 op de eigenschap Item
, kan de clientcode dit doen:
For i = 1 To myList.Count 'VBA Collection Objects are 1-based
Debug.Print myList(i)
Next
Slechts één lid kan legaal VB_UserMemId = 0
in een bepaalde klasse hebben. Geef voor eigenschappen het kenmerk op in de 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
Een klasse itereerbaar maken met een For Each
Every-lusconstructie
Met de magische waarde -4
, vertelt het kenmerk VB_UserMemId
aan VBA dat dit lid een enumerator oplevert - waarmee de clientcode dit kan doen:
Dim item As Variant
For Each item In myList
Debug.Print item
Next
De eenvoudigste manier om deze methode te implementeren is door de verborgen [_NewEnum]
property getter aan te roepen op een interne / ingekapselde Collection
; de identifier moet tussen vierkante haken staan vanwege het toonaangevende onderstrepingsteken waardoor het een illegale VBA-identifier is:
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