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
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