VBA => Attribute

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

Beschreibungstext im Objekt-Explorer

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 Modified text is an extract of the original Stack Overflow Documentation Lizenziert unter CC BY-SA 3.0 Nicht angeschlossen an Stack Overflow

Từ khóa » Visual Basic Attribute Vb_name