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

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