Suche…
Syntax
- Attribut VB_Name = "ClassOrModuleName"
- Attribut VB_GlobalNameSpace = False 'wird ignoriert
- Attribut VB_Creatable = False 'Ignoriert
- Attribut VB_PredeclaredId = {True | Falsch}
- Attribut VB_Exposed = {True | Falsch}
- Attribut variableName.VB_VarUserMemId = 0 'Null bedeutet, dass dies das Standardmitglied der Klasse ist.
- Attribut variableName.VB_VarDescription = "some string" 'Fügt den Text zu den Objektbrowserinformationen für diese Variable hinzu.
- Attribut procName.VB_Description = "some string" 'Fügt den Text der Object Browser-Information für die Prozedur hinzu.
- Attribut procName.VB_UserMemId = {0 | -4}
- '0: Macht die Funktion zum Standardmitglied der Klasse.
- '-4: Gibt an, dass die Funktion einen Enumerator zurückgibt.
VB_Name
VB_Name gibt den Klassen- oder Modulnamen an.
Attribute VB_Name = "Class1"
Eine neue Instanz dieser Klasse würde mit erstellt
Dim myClass As Class1
myClass = new Class1
VB_GlobalNameSpace
In VBA wird dieses Attribut ignoriert. Es wurde nicht von VB6 übertragen.
In VB6 wird eine globale Standardinstanz der Klasse erstellt (eine "Verknüpfung"), sodass auf Klassenmitglieder ohne Verwendung des Klassennamens zugegriffen werden kann. Beispielsweise ist DateTime
(wie in DateTime.Now
) tatsächlich Teil der VBA.Conversion
Klasse.
Debug.Print VBA.Conversion.DateTime.Now
Debug.Print DateTime.Now
VB_Createable
Dieses Attribut wird ignoriert. Es wurde nicht von VB6 übertragen.
In VB6 wurde es in Verbindung mit dem Attribut VB_Exposed
, um die Zugänglichkeit von Klassen außerhalb des aktuellen Projekts zu steuern.
VB_Exposed=True
VB_Creatable=True
Dies würde zu einer Public Class
, auf die von anderen Projekten aus zugegriffen werden kann. Diese Funktionalität ist jedoch in VBA nicht vorhanden.
VB_PredeclaredId
Erstellt eine globale Standardinstanz einer Klasse. Auf die Standardinstanz wird über den Namen der Klasse zugegriffen.
Erklärung
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
Anruf
Debug.Print Class1.GiveMeATwo
In gewisser Weise simuliert dies das Verhalten statischer Klassen in anderen Sprachen. Im Gegensatz zu anderen Sprachen können Sie jedoch immer noch eine Instanz der Klasse erstellen.
Dim cls As Class1
Set cls = New Class1
Debug.Print cls.GiveMeATwo
VB_Exposed
Steuert die Instanzierungsmerkmale einer Klasse.
Attribute VB_Exposed = False
Macht die Klasse Private
. Es kann nicht außerhalb des aktuellen Projekts zugegriffen werden.
Attribute VB_Exposed = True
Macht die Klasse Public
außerhalb des Projekts verfügbar. Da VB_Createable
jedoch in VBA ignoriert wird, können Instanzen der Klasse nicht direkt erstellt werden. Dies entspricht einer folgenden VB.Net-Klasse.
Public Class Foo
Friend Sub New()
End Sub
End Class
Um eine Instanz von außerhalb des Projekts zu erhalten, müssen Sie eine Fabrik zum Erstellen von Instanzen verfügbar machen. Eine Möglichkeit hierzu ist ein reguläres Public
Modul.
Public Function CreateFoo() As Foo
CreateFoo = New Foo
End Function
Da öffentliche Module von anderen Projekten aus zugänglich sind, können wir neue Instanzen unserer Public - Not Createable
Klassen Public - Not Createable
.
VB_Beschreibung
Fügt einer Klasse oder einem Modulmitglied eine Textbeschreibung hinzu, die im Objekt-Explorer sichtbar wird. Idealerweise sollten alle öffentlichen Mitglieder einer öffentlichen Schnittstelle / API eine Beschreibung haben.
Public Function GiveMeATwo() As Integer
Attribute GiveMeATwo.VB_Description = "Returns a two!"
GiveMeATwo = 2
End Property
Hinweis: Alle Accessor-Mitglieder einer Eigenschaft ( Get
, Let
, Set
) verwenden dieselbe Beschreibung.
VB_ [Var] UserMemId
VB_VarUserMemId
(für VB_VarUserMemId
) und VB_UserMemId
(für Prozeduren) werden in VBA hauptsächlich für zwei VB_UserMemId
verwendet.
Angeben des Standardmitglieds einer Klasse
Eine List
, die eine Collection
kapseln würde, würde eine Item
Eigenschaft haben, sodass der Clientcode Folgendes tun kann:
For i = 1 To myList.Count 'VBA Collection Objects are 1-based
Debug.Print myList.Item(i)
Next
VB_UserMemId
ein VB_UserMemId
Attribut für die Item
Eigenschaft auf 0 gesetzt ist, kann der Clientcode VB_UserMemId
tun:
For i = 1 To myList.Count 'VBA Collection Objects are 1-based
Debug.Print myList(i)
Next
Nur ein Member kann in einer bestimmten Klasse legal VB_UserMemId = 0
haben. Geben Sie für Eigenschaften das Attribut im Get
Accessor an:
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
Eine Klasse mit einem For Each
Schleifenkonstrukt iterierbar machen
Mit dem magischen Wert -4
teilt das VB_UserMemId
Attribut VBA mit, dass dieses Member einen Enumerator liefert - was dem Client-Code VB_UserMemId
ermöglicht:
Dim item As Variant
For Each item In myList
Debug.Print item
Next
Die einfachste Methode zum Implementieren dieser Methode ist das Aufrufen des hidden- [_NewEnum]
Eigenschafts für eine interne / gekapselte Collection
. Der Bezeichner muss in eckige Klammern eingeschlossen werden, da der führende Unterstrich ihn zu einem unzulässigen VBA-Bezeichner macht:
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