Sök…


Syntax

  • Attribut VB_Name = "ClassOrModuleName"
  • Attribut VB_GlobalNameSpace = Falskt "Ignorerat
  • Attribut VB_Creatable = Falsk "Ignorerad
  • Attribut VB_PredeclaredId = {Sant | Falsk}
  • Attribut VB_Exposed = {Sant | Falsk}
  • AttributvariabelName.VB_VarUserMemId = 0 'Noll indikerar att detta är standardmedlem i klassen.
  • AttributvariabelName.VB_VarDescription = "någon sträng" 'Lägger till texten i objektbläsarinformationen för denna variabel.
  • Attribut procName.VB_Description = "någon sträng" 'Lägger till texten i objektbläsarinformationen för proceduren.
  • Attribut procName.VB_UserMemId = {0 | -4}
    • '0: Gör funktionen till standardmedlem i klassen.
    • '-4: Anger att funktionen returnerar en teller.

VB_Name

VB_Name anger klassen eller modulnamnet.

Attribute VB_Name = "Class1"

En ny instans av denna klass skulle skapas med

Dim myClass As Class1
myClass = new Class1

VB_GlobalNameSpace

I VBA ignoreras detta attribut. Det överfördes inte från VB6.

I VB6 skapar det en standardinstans för global klass av klassen (en "genväg") så att klassmedlemmar kan nås utan att använda klassnamnet. Till exempel är DateTime (som i DateTime.Now ) faktiskt en del av klassen VBA.Conversion .

Debug.Print VBA.Conversion.DateTime.Now
Debug.Print DateTime.Now

VB_Createable

Detta attribut ignoreras. Det överfördes inte från VB6.

I VB6 användes det i kombination med attributet VB_Exposed att kontrollera tillgängligheten för klasser utanför det aktuella projektet.

VB_Exposed=True 
VB_Creatable=True

Skulle resultera i en Public Class som kan nås från andra projekt, men den här funktionen finns inte i VBA.

VB_PredeclaredId

Skapar en global standardinstans av en klass. Standardinstansen nås via klassens namn.

Deklaration

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

Ring upp

Debug.Print Class1.GiveMeATwo

På vissa sätt simulerar detta beteendet hos statiska klasser på andra språk, men till skillnad från andra språk kan du fortfarande skapa en instans av klassen.

Dim cls As Class1
Set cls = New Class1
Debug.Print cls.GiveMeATwo

VB_Exposed

Kontrollerar instansegenskaperna för en klass.

Attribute VB_Exposed = False

Gör klassen Private . Det går inte att komma åt det utanför det aktuella projektet.

Attribute VB_Exposed = True

Exponerar klassen Public utanför projektet. Men eftersom VB_Createable ignoreras i VBA kan instanser av klassen inte skapas direkt. Detta motsvarar följande VB.Net-klass.

Public Class Foo
    Friend Sub New()
    End Sub
End Class    

För att få en instans utanför projektet måste du exponera en fabrik för att skapa instanser. Ett sätt att göra detta är med en vanlig Public modul.

Public Function CreateFoo() As Foo
    CreateFoo = New Foo
End Function

Eftersom offentliga moduler är tillgängliga från andra projekt, gör det möjligt för oss att skapa nya instanser av våra klasser som Public - Not Createable .

VB_Description

Lägger till en textbeskrivning till en klass- eller modulmedlem som blir synlig i Object Explorer. Helst bör alla offentliga medlemmar i ett offentligt gränssnitt / API ha en beskrivning.

Public Function GiveMeATwo() As Integer
    Attribute GiveMeATwo.VB_Description = "Returns a two!"        
    GiveMeATwo = 2
End Property

Beskrivning Text i Object Explorer

Obs: alla accessormedlemmar i en fastighet ( Get , Let , Set ) använder samma beskrivning.

VB_ [Var] UserMemId

VB_VarUserMemId (för VB_VarUserMemId ) och VB_UserMemId (för procedurer) attribut används i VBA mestadels för två saker.

Ange standardmedlem för en klass

En List som skulle kapsla en Collection vill ha en Item , så klientkoden kan göra detta:

For i = 1 To myList.Count 'VBA Collection Objects are 1-based
    Debug.Print myList.Item(i)
Next

Men med en VB_UserMemId attribut satt till 0 på Item egendom, kan klientkoden så här:

For i = 1 To myList.Count 'VBA Collection Objects are 1-based
    Debug.Print myList(i)
Next

Endast en medlem kan lagligen ha VB_UserMemId = 0 i en viss klass. För egenskaper anger du attributet i 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

Att göra en klass iteratabel med en For Each slingkonstruktion

Med det magiska värdet -4 berättar VB_UserMemId attributet VBA att den här medlemmen ger en uppräknare - vilket gör att klientkoden kan göra detta:

Dim item As Variant
For Each item In myList
    Debug.Print item
Next

Det enklaste sättet att implementera den här metoden är genom att ringa den dolda [_NewEnum] -egenskapens getter på en intern / inkapslad Collection ; identifieraren måste bifogas i fyrkantiga parenteser på grund av det ledande understrecket som gör det till en olaglig VBA-identifierare:

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow