Ricerca…


Sintassi

  • Attributo VB_Name = "ClassOrModuleName"
  • Attributo VB_GlobalNameSpace = False 'Ignorato
  • Attributo VB_Creatable = False 'Ignorato
  • Attributo VB_PredeclaredId = {True | false}
  • Attributo VB_Exposed = {True | false}
  • Attribute variableName.VB_VarUserMemId = 0 'Zero indica che questo è il membro predefinito della classe.
  • Attribute variableName.VB_VarDescription = "some string" "Aggiunge il testo alle informazioni del Visualizzatore oggetti per questa variabile.
  • Attributo procName.VB_Description = "some string" "Aggiunge il testo alle informazioni del Visualizzatore oggetti per la procedura.
  • Attributo procName.VB_UserMemId = {0 | -4}
    • '0: rende la funzione il membro predefinito della classe.
    • '-4: specifica che la funzione restituisce un enumeratore.

VB_Name

VB_Name specifica il nome della classe o del modulo.

Attribute VB_Name = "Class1"

Una nuova istanza di questa classe verrebbe creata con

Dim myClass As Class1
myClass = new Class1

VB_GlobalNameSpace

In VBA, questo attributo è ignorato. Non è stato trasferito da VB6.

In VB6, crea un'istanza globale predefinita della classe (una "scorciatoia") in modo che i membri della classe possano accedere senza utilizzare il nome della classe. Ad esempio, DateTime (come in DateTime.Now ) è in realtà parte della classe VBA.Conversion .

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

VB_Createable

Questo attributo è ignorato. Non è stato trasferito da VB6.

In VB6, è stato utilizzato in combinazione con l'attributo VB_Exposed per controllare l'accessibilità delle classi esterne al progetto corrente.

VB_Exposed=True 
VB_Creatable=True

Ne risulterebbe una Public Class , a cui si potrebbe accedere da altri progetti, ma questa funzionalità non esiste in VBA.

VB_PredeclaredId

Crea un'istanza di default globale di una classe. L'istanza predefinita è accessibile tramite il nome della classe.

Dichiarazione

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

Chiamata

Debug.Print Class1.GiveMeATwo

In qualche modo, simula il comportamento delle classi statiche in altre lingue, ma a differenza di altre lingue, puoi comunque creare un'istanza della classe.

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

VB_Exposed

Controlla le caratteristiche istanziate di una classe.

Attribute VB_Exposed = False

Rende la classe Private . Non è possibile accedere al di fuori del progetto corrente.

Attribute VB_Exposed = True

Espone la classe Public , al di fuori del progetto. Tuttavia, poiché VB_Createable viene ignorato in VBA, le istanze della classe non possono essere create direttamente. Questo è equivalente a una seguente classe VB.Net.

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

Per ottenere un'istanza dall'esterno del progetto, è necessario esporre una factory per creare istanze. Un modo per farlo è con un normale modulo Public .

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

Dato che i moduli pubblici sono accessibili da altri progetti, questo ci consente di creare nuove istanze delle nostre classi Public - Not Createable .

VB_Description

Aggiunge una descrizione testuale a un membro di classe o modulo che diventa visibile nell'Explorer oggetti. Idealmente, tutti i membri pubblici di un'interfaccia pubblica / API dovrebbero avere una descrizione.

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

Descrizione Testo in Esplora oggetti

Nota: tutti i membri di accesso di una proprietà ( Get , Let , Set ) utilizzano la stessa descrizione.

VB_ [Var] UserMemId

VB_VarUserMemId (per variabili modulo-scope) e VB_UserMemId (per procedure) gli attributi sono usati in VBA principalmente per due cose.

Specifica del membro predefinito di una classe

Una classe List che incapsulerebbe una Collection vorrebbe avere una proprietà Item , quindi il codice client può fare ciò:

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

Ma con un attributo VB_UserMemId impostato su 0 nella proprietà Item , il codice client può fare ciò:

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

Solo un membro può avere VB_UserMemId = 0 legalmente in qualsiasi classe data. Per le proprietà, specificare l'attributo nella Get accesso Get :

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

Rendere una classe iterabile con un costrutto For Each loop

Con il valore magico -4 , l'attributo VB_UserMemId indica a VBA che questo membro produce un enumeratore - che consente al codice client di eseguire ciò:

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

Il modo più semplice per implementare questo metodo è chiamando il getter di proprietà nascosto [_NewEnum] su una Collection interna / incapsulata; l'identificatore deve essere racchiuso tra parentesi quadre a causa del carattere di sottolineatura principale che lo rende un identificatore VBA illegale:

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow