Depende de quién va a desarrollar y mantener el código. Los macro escritores típicos de "Power User" que piratean pequeñas aplicaciones ad-hoc pueden confundirse al usar las clases. Pero para un desarrollo serio, las razones para usar clases son las mismas que en otros idiomas. Tiene las mismas restricciones que VB6, sin herencia, pero puede tener polimorfismo mediante el uso de interfaces.
Un buen uso de las clases es representar entidades y colecciones de entidades. Por ejemplo, a menudo veo código VBA que copia un rango de Excel en una matriz de dos dimensiones, a continuación, manipula la matriz bidimensional con un código como:
Total = 0
For i = 0 To NumRows-1
Total = Total + (OrderArray(i,1) * OrderArray(i,3))
Next i
Es más fácil de leer para copiar el rango en una colección de objetos con propiedades con el nombre apropiado, algo así como:
Total = 0
For Each objOrder in colOrders
Total = Total + objOrder.Quantity * objOrder.Price
Next i
Otro ejemplo es el uso de clases para implementar el patrón de diseño RAII (google para ello). Por ejemplo, una cosa que debo hacer es desproteger una hoja de cálculo, hacer algunas manipulaciones y luego protegerla de nuevo. Utilizar una clase asegura que la hoja de trabajo siempre estará protegido de nuevo, incluso si se produce un error en el código:
--- WorksheetProtector class module ---
Private m_objWorksheet As Worksheet
Private m_sPassword As String
Public Sub Unprotect(Worksheet As Worksheet, Password As String)
' Nothing to do if we didn't define a password for the worksheet
If Len(Password) = 0 Then Exit Sub
' If the worksheet is already unprotected, nothing to do
If Not Worksheet.ProtectContents Then Exit Sub
' Unprotect the worksheet
Worksheet.Unprotect Password
' Remember the worksheet and password so we can protect again
Set m_objWorksheet = Worksheet
m_sPassword = Password
End Sub
Public Sub Protect()
' Protects the worksheet with the same password used to unprotect it
If m_objWorksheet Is Nothing Then Exit Sub
If Len(m_sPassword) = 0 Then Exit Sub
' If the worksheet is already protected, nothing to do
If m_objWorksheet.ProtectContents Then Exit Sub
m_objWorksheet.Protect m_sPassword
Set m_objWorksheet = Nothing
m_sPassword = ""
End Sub
Private Sub Class_Terminate()
' Reprotect the worksheet when this object goes out of scope
On Error Resume Next
Protect
End Sub
entonces usted puede utilizar esto para simplificar el código:
Public Sub DoSomething()
Dim objWorksheetProtector as WorksheetProtector
Set objWorksheetProtector = New WorksheetProtector
objWorksheetProtector.Unprotect myWorksheet, myPassword
... manipulate myWorksheet - may raise an error
End Sub
cuando este Sub salidas, objWorksheetProtector queda fuera del alcance y la hoja de trabajo está protegida de nuevo.
Este es un buen ejemplo de una razón para usar clases en VBA. No estoy seguro de que alguna vez lo haga, pero sin embargo es un buen ejemplo. – cori
Realmente es bueno saberlo. –
@Joe este es un buen ejemplo. Con frecuencia tengo que usar/escribir clases en VBA. Creo que si se siente cómodo con los conceptos de programación orientada a objetos de otros lenguajes de OOP y las limitaciones de VBA, puede simplemente articular sus clases en VBA. Al final, todos estos * elementos * que utilizamos en Excel son objetos/propiedades/métodos de una estructura de clase. Tiene más sentido, es fácil de administrar, de transferencia que muchas líneas que se repiten aquí y allá :) – bonCodigo