Это зависит от того, кто собирается разрабатывать и поддерживать код. Типичные авторы макросов «Опытный пользователь», взламывающие небольшие специальные приложения, могут быть смущены использованием классов. Но для серьезного развития причины использования классов такие же, как и в других языках. У вас те же ограничения, что и у VB6 - без наследования - но вы можете иметь полиморфизм с помощью интерфейсов.
Хорошо использовать классы для представления сущностей и коллекций сущностей. Например, я часто вижу код VBA, который копирует диапазон Excel в двумерный массив, а затем манипулирует двумерным массивом с помощью кода:
Total = 0
For i = 0 To NumRows-1
Total = Total + (OrderArray(i,1) * OrderArray(i,3))
Next i
Более читабельно копировать диапазон в коллекцию объектов с соответствующими именами, что-то вроде:
Total = 0
For Each objOrder in colOrders
Total = Total + objOrder.Quantity * objOrder.Price
Next i
Другим примером является использование классов для реализации шаблона проектирования RAII (Google для него). Например, одна вещь, которая мне может понадобиться, это снять защиту листа, выполнить некоторые манипуляции, а затем снова защитить его. Использование класса гарантирует, что лист всегда будет снова защищен, даже если в вашем коде произойдет ошибка:
--- 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
Затем вы можете использовать это для упрощения вашего кода:
Public Sub DoSomething()
Dim objWorksheetProtector as WorksheetProtector
Set objWorksheetProtector = New WorksheetProtector
objWorksheetProtector.Unprotect myWorksheet, myPassword
... manipulate myWorksheet - may raise an error
End Sub
При выходе из этой подпрограммы objWorksheetProtector выходит из области действия, и рабочая таблица снова защищается.