Buscar..
Sintaxis
- Atributo VB_Name = "ClassOrModuleName"
- Atributo VB_GlobalNameSpace = False 'Ignored
- Atributo VB_Creatable = Falso 'Ignorado
- Atributo VB_PredeclaredId = {True | Falso}
- Atributo VB_Exposed = {True | Falso}
- Atributo variableName.VB_VarUserMemId = 0 'Cero indica que este es el miembro predeterminado de la clase.
- Atributo variableName.VB_VarDescription = "alguna cadena" 'Agrega el texto a la información del Examinador de objetos para esta variable.
- Atributo procName.VB_Description = "alguna cadena" 'Agrega el texto a la información del Examinador de objetos para el procedimiento.
- Atributo procName.VB_UserMemId = {0 | -4}
- '0: hace que la función sea el miembro predeterminado de la clase.
- '-4: Especifica que la función devuelve un Enumerador.
VB_Name
VB_Name especifica la clase o el nombre del módulo.
Attribute VB_Name = "Class1"
Una nueva instancia de esta clase sería creada con
Dim myClass As Class1
myClass = new Class1
VB_GlobalNameSpace
En VBA, este atributo se ignora. No fue portado desde VB6.
En VB6, crea una instancia global predeterminada de la clase (un "acceso directo") para que se pueda acceder a los miembros de la clase sin usar el nombre de la clase. Por ejemplo, DateTime
(como en DateTime.Now
) es en realidad parte de la clase VBA.Conversion
.
Debug.Print VBA.Conversion.DateTime.Now
Debug.Print DateTime.Now
VB_Createable
Este atributo se ignora. No fue portado desde VB6.
En VB6, se usó en combinación con el atributo VB_Exposed
para controlar la accesibilidad de clases fuera del proyecto actual.
VB_Exposed=True
VB_Creatable=True
Resultaría en una Public Class
, a la que se podría acceder desde otros proyectos, pero esta funcionalidad no existe en VBA.
VB_PredeclaredId
Crea una instancia global predeterminada de una clase. Se accede a la instancia predeterminada a través del nombre de la clase.
Declaración
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
Llamada
Debug.Print Class1.GiveMeATwo
De alguna manera, esto simula el comportamiento de las clases estáticas en otros idiomas, pero a diferencia de otros idiomas, aún puede crear una instancia de la clase.
Dim cls As Class1
Set cls = New Class1
Debug.Print cls.GiveMeATwo
VB_Expuesto
Controla las características de creación de instancias de una clase.
Attribute VB_Exposed = False
Hace que la clase sea Private
. No se puede acceder fuera del proyecto actual.
Attribute VB_Exposed = True
Expone la clase de Public
, fuera del proyecto. Sin embargo, dado que VB_Createable
se ignora en VBA, las instancias de la clase no se pueden crear directamente. Esto es equivalente a la siguiente clase VB.Net.
Public Class Foo
Friend Sub New()
End Sub
End Class
Para obtener una instancia externa al proyecto, debe exponer una fábrica para crear instancias. Una forma de hacerlo es con un módulo Public
regular.
Public Function CreateFoo() As Foo
CreateFoo = New Foo
End Function
Dado que los módulos públicos son accesibles desde otros proyectos, esto nos permite crear nuevas instancias de nuestras clases Public - Not Createable
.
VB_Descripción
Agrega una descripción de texto a un miembro de clase o módulo que se hace visible en el Explorador de objetos. Idealmente, todos los miembros públicos de una interfaz / API pública deberían tener una descripción.
Public Function GiveMeATwo() As Integer
Attribute GiveMeATwo.VB_Description = "Returns a two!"
GiveMeATwo = 2
End Property
Nota: todos los miembros de acceso de una propiedad ( Get
, Let
, Set
) usan la misma descripción.
VB_ [Var] UserMemId
VB_VarUserMemId
(para variables de alcance de módulo) y VB_UserMemId
(para procedimientos) se usan en VBA principalmente para dos cosas.
Especificando el miembro predeterminado de una clase
Una clase de List
que encapsularía una Collection
desearía tener una propiedad de Item
, por lo que el código del cliente puede hacer esto:
For i = 1 To myList.Count 'VBA Collection Objects are 1-based
Debug.Print myList.Item(i)
Next
Pero con un atributo VB_UserMemId
establecido en 0 en la propiedad Item
, el código del cliente puede hacer esto:
For i = 1 To myList.Count 'VBA Collection Objects are 1-based
Debug.Print myList(i)
Next
Solo un miembro puede tener legalmente VB_UserMemId = 0
en cualquier clase dada. Para propiedades, especifique el atributo en el Get
acceso 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
Hacer una clase iteratable con una construcción de bucle For Each
Con el valor mágico -4
, el atributo VB_UserMemId
le dice a VBA que este miembro produce un enumerador, lo que permite que el código del cliente haga esto:
Dim item As Variant
For Each item In myList
Debug.Print item
Next
La forma más fácil de implementar este método es llamar al captador de propiedades ocultas [_NewEnum]
en una Collection
interna / encapsulada; el identificador debe estar entre corchetes debido al subrayado principal que lo convierte en un identificador de VBA ilegal:
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