userforms tutorial form create vba object variables user-defined-types

tutorial - userform events excel vba



Establecer un tipo en VBA a nada? (7)

La forma estándar es restablecer cada miembro a su valor predeterminado individualmente. Esta es una limitación de los tipos definidos por el usuario en comparación con los objetos.

A riesgo de afirmar lo obvio:

With point Set .list = Nothing .name = "" .number = 0 End With

Alternativamente, puede crear una variable "en blanco" y asignarla a su variable cada vez que quiera "borrarla".

Dim point As DataPoint Dim blank As DataPoint With point Set .list = New Collection .list.Add "carrots" .name = "joe" .number = 12 End With point = blank '' point members are now reset to default values

He definido una variable con un tipo propio, por ejemplo

Dim point As DataPoint Public Type DataPoint list as Collection name as String number as Integer End Type

y quiero eliminar todos los valores del point variable a la vez. Si fuera una clase, solo usaría Set point = New DataPoint , o establecería Set point = Nothing , pero ¿cómo puedo proceder si es un tipo?


Otra opción es usar la palabra reservada "Vacío" como:

.number = Vacío

El único problema es que deberá cambiar el número de entero a variante.


Para eso es mejor usar las clases, puede declarar un módulo de clase con el nombre de su tipo, luego declarar todos sus miembros como públicos, luego automáticamente puede configurar nada y ser nuevo para crear y eliminar instancias.

la sintaxis será algo así después de crear el módulo de clase y nombrar como su tipo:

'' Public List as Collection Public Name as String Public Number as Long Private Sub Class_Initialize() ''Here you can assign default values for the public members that you created if you want End Sub


Puede beneficiarse del hecho de que las funciones en VB tienen una variable implícita que contiene el resultado, y que contiene el valor de tipo predeterminado por defecto.

public function GetBlankPoint() as DataPoint end function

Uso:

point = GetBlankPoint()


Un trazador de líneas:

Function resetDataPoint() As DataPoint: End Function

Uso:

point = resetDataPoint()


Usar clases en VBA suele ser una buena práctica en caso de que no sea una solución de un solo propósito o la clase no contenga demasiados atributos privados porque si desea cumplir con las reglas de OOP y mantener su clase segura, debe declarar todos los permisos y Obtenga propiedades para todos los atributos privados de la clase. Esto es demasiada codificación en caso de que tenga más de 50 atributos privados. Otro aspecto negativo del uso de clases en Excel es el hecho de que VBA no es totalmente compatible con el OOP. No hay polimorfismo, sobrecarga, etc.). Incluso si desea usar una herencia, debe declarar todos los atributos y métodos de la clase original en la clase heredada.

Entonces, en este caso, preferiría la solución sugerida por Jean-François Corbett o GSeng, es decir, asignar una variable vacía del mismo UDT como la variable que desea borrar o utilizar una función que a mí me parece una solución un poco más elegante porque no reservará memoria permanente para la variable emtpy de su tipo UDT.


EDITAR : ¡Maldición! Derrotado por JFC: D

Aquí hay una alternativa para lograr eso en 1 línea;)

Dim point As DataPoint Dim emptyPoint As DataPoint Public Type DataPoint list As Collection name As String number As Integer End Type Sub Sample() ''~~> Fill the point Debug.Print ">"; point.name Debug.Print ">"; point.number point.name = "a" point.number = 25 Debug.Print ">>"; point.name Debug.Print ">>"; point.number ''~~> Empty the point point = emptyPoint Debug.Print ">>>"; point.name Debug.Print ">>>"; point.number End Sub

INSTANTÁNEA