Recherche…


Syntaxe

  • Attribut VB_Name = "ClassOrModuleName"
  • Attribut VB_GlobalNameSpace = Faux 'Ignoré
  • Attribut VB_Creatable = Faux 'Ignoré
  • Attribut VB_PredeclaredId = {True | Faux}
  • Attribut VB_Exposed = {True | Faux}
  • Attribut variableName.VB_VarUserMemId = 0 'Zéro indique qu'il s'agit du membre par défaut de la classe.
  • Attribut variableName.VB_VarDescription = "une chaîne" 'Ajoute le texte aux informations de l'explorateur d'objets pour cette variable.
  • Attribut procName.VB_Description = "some string" 'Ajoute le texte aux informations de l'explorateur d'objets pour la procédure.
  • Attribut procName.VB_UserMemId = {0 | -4}
    • '0: fait de la fonction le membre par défaut de la classe.
    • '-4: Spécifie que la fonction retourne un énumérateur.

VB_Name

VB_Name spécifie le nom de la classe ou du module.

Attribute VB_Name = "Class1"

Une nouvelle instance de cette classe serait créée avec

Dim myClass As Class1
myClass = new Class1

VB_GlobalNameSpace

Dans VBA, cet attribut est ignoré. Il n'a pas été transféré de VB6.

Dans VB6, il crée une instance globale par défaut de la classe (un "raccourci") pour que les membres de la classe puissent être accédés sans utiliser le nom de la classe. Par exemple, DateTime (comme dans DateTime.Now ) fait en réalité partie de la classe VBA.Conversion .

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

VB_Createable

Cet attribut est ignoré. Il n'a pas été transféré de VB6.

Dans VB6, il était utilisé en combinaison avec l'attribut VB_Exposed pour contrôler l'accessibilité des classes en dehors du projet en cours.

VB_Exposed=True 
VB_Creatable=True

Vous obtiendrez une Public Class accessible à partir d'autres projets, mais cette fonctionnalité n'existe pas dans VBA.

VB_PredeclaredId

Crée une instance par défaut globale d'une classe. L'instance par défaut est accessible via le nom de la classe.

Déclaration

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

Appel

Debug.Print Class1.GiveMeATwo

À certains égards, cela simule le comportement des classes statiques dans d'autres langages, mais contrairement à d'autres langages, vous pouvez toujours créer une instance de la classe.

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

VB_Exposed

Contrôle les caractéristiques d'instanciation d'une classe.

Attribute VB_Exposed = False

Rend la classe Private . Il est impossible d'y accéder en dehors du projet en cours.

Attribute VB_Exposed = True

Expose la classe en Public , en dehors du projet. Cependant, VB_Createable étant ignoré dans VBA, les instances de la classe ne peuvent pas être créées directement. Cela équivaut à la classe VB.Net suivante.

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

Pour obtenir une instance en dehors du projet, vous devez exposer une fabrique pour créer des instances. Pour ce faire, vous pouvez Public module Public standard.

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

Les modules publics étant accessibles à partir d'autres projets, cela nous permet de créer de nouvelles instances de nos classes Public - Not Createable .

VB_Description

Ajoute une description textuelle à un membre de la classe ou du module qui devient visible dans l'Explorateur d'objets. Idéalement, tous les membres publics d'une interface / API publique devraient avoir une description.

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

Texte de description dans l'Explorateur d'objets

Remarque: tous les membres accesseurs d'une propriété ( Get , Let , Set ) utilisent la même description.

VB_ [Var] UserMemId

VB_VarUserMemId (pour les variables de portée de module) et VB_UserMemId (pour les procédures) sont utilisés dans VBA principalement pour deux choses.

Spécifier le membre par défaut d'une classe

Une classe de List qui encapsulerait une Collection voudrait avoir une propriété Item , donc le code client peut le faire:

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

Mais avec un attribut VB_UserMemId défini sur 0 dans la propriété Item , le code client peut le faire:

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

Un seul membre peut légalement avoir VB_UserMemId = 0 dans une classe donnée. Pour les propriétés, spécifiez l'attribut dans l'accesseur 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

Rendre une classe itérable avec une construction de boucle For Each

Avec la valeur magique -4 , l'attribut VB_UserMemId indique à VBA que ce membre génère un énumérateur - ce qui permet au code client de le faire:

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

La meilleure façon de mettre en œuvre cette méthode est en appelant le caché [_NewEnum] propriété getter sur une interne / encapsulé Collection ; l'identifiant doit être placé entre crochets à cause du trait de soulignement principal qui en fait un identifiant VBA illégal:

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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow