Diferencias entre Property Let y Set
Al crear una clase en VBA y manejar propiedades (variables miembro), existen los métodos Property Get, Set y Let.
En general, en otros lenguajes de programación, solo se utilizan Getter y Setter para establecer propiedades (variables miembro).
Por lo tanto, puede resultar extraño ver la definición de propiedades en VBA por primera vez.
En este artículo, resumimos las diferencias entre Property Set y Property Let en VBA.
Diferencias entre Property Set y Property Let
En resumen,
- Si necesitas usar Set al asignar una variable, usa Set
- De lo contrario, usa Let
Esta es una forma sencilla de recordarlo.
Explicación
Al asignar un valor a una variable de tipo referencia, debes usar Set, de lo contrario, obtendrás un error.
En una hoja de cálculo, sería algo como:
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)
Esto también se aplica a las propiedades en una clase.
Al establecer un valor en una propiedad de una clase,
'_Módulo Class1_
Private m_ws As Worksheet
'_La clase Worksheet es de tipo referencia, por lo que se define con Set_
Public Property Set ws(ByRef received As Worksheet)
'_También necesitas usar Set al establecer la propiedad_
Set m_ws = received
End Property
'_Módulo estándar_
Dim c1 As Class1
Set c1 = New Class1
'_También necesitas usar Set al llamar a la propiedad_
Set c1.ws = ThisWorkbook.Worksheets(1)
Si falta un solo Set, obtendrás un error.
Es un poco molesto, pero puedes entenderlo como que el concepto de Set al definir variables en VBA también se aplica a las propiedades.
Prueba de ejecución
'_Módulo Class1_
Private m_ws As Worksheet
Public Property Set ws(ByRef received As Worksheet)
Set m_ws = received
End Property
Public Property Get ws() As Worksheet
Set ws = m_ws
End Property
'_Módulo estándar_
Public Sub test()
Dim c1 As Class1
Set c1 = New Class1
Set c1.ws = ThisWorkbook.Worksheets(1)
Debug.Print c1.ws.Cells(1, 1).Value
End Sub
El valor de la primera celda de la primera hoja del libro se mostrará en la ventana inmediata.
¿No se puede usar Let en su lugar?
Sí, se puede.
En el ejemplo anterior,
'_Módulo Class1_
Private m_ws As Worksheet
'_Cambia Set por Let, el resto permanece igual_
Public Property Let ws(ByRef received As Worksheet)
'_Incluso con Let, necesitas usar Set al establecer la propiedad_
Set m_ws = received
End Property
'_Módulo estándar_
Dim c1 As Class1
Set c1 = New Class1
'_No necesitas usar Set al llamar a la propiedad_
c1.ws = ThisWorkbook.Worksheets(1)
Obtendrás el mismo resultado.
Por lo tanto, en realidad, solo necesitas Get y Let para establecer propiedades (variables miembro).
Puede haber casos excepcionales donde esto no sea posible, pero no está claro por qué VBA tiene esta flexibilidad…
Finalmente
Puede que algunos piensen que VBA es algo del pasado, pero en la era del SaaS, hay formas modernas de usar Excel.
Una de ellas es utilizar APIs de servicios en la nube desde VBA.
Hemos presentado algunos ejemplos en nuestro sitio web, así que si estás interesado, échales un vistazo.