When to use a Class in VBA?

后端 未结 12 1199
情歌与酒
情歌与酒 2020-12-02 07:04

When is it appropriate to use a class in Visual Basic for Applications (VBA)?

I\'m assuming the accelerated development and reduction of introducing bugs is a common

12条回答
  •  醉话见心
    2020-12-02 07:43

    It depends on who's going to develop and maintain the code. Typical "Power User" macro writers hacking small ad-hoc apps may well be confused by using classes. But for serious development, the reasons to use classes are the same as in other languages. You have the same restrictions as VB6 - no inheritance - but you can have polymorphism by using interfaces.

    A good use of classes is to represent entities, and collections of entities. For example, I often see VBA code that copies an Excel range into a two-dimensional array, then manipulates the two dimensional array with code like:

    Total = 0
    For i = 0 To NumRows-1
        Total = Total + (OrderArray(i,1) * OrderArray(i,3))
    Next i
    

    It's more readable to copy the range into a collection of objects with appropriately-named properties, something like:

    Total = 0
    For Each objOrder in colOrders
        Total = Total + objOrder.Quantity * objOrder.Price
    Next i
    

    Another example is to use classes to implement the RAII design pattern (google for it). For example, one thing I may need to do is to unprotect a worksheet, do some manipulations, then protect it again. Using a class ensures that the worksheet will always be protected again even if an error occurs in your code:

    --- 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
    

    You can then use this to simplify your code:

    Public Sub DoSomething()
       Dim objWorksheetProtector as WorksheetProtector
       Set objWorksheetProtector = New WorksheetProtector
       objWorksheetProtector.Unprotect myWorksheet, myPassword
    
       ... manipulate myWorksheet - may raise an error
    
    End Sub 
    

    When this Sub exits, objWorksheetProtector goes out of scope, and the worksheet is protected again.

提交回复
热议问题