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

Beschrijving Tekst in Object Explorer

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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow