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

Descripción del texto en el Explorador de objetos

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


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow