何时在Visual Basic for Applications(VBA)中使用类是否合适?
我假设加速开发和减少引入错误是大多数支持OOP的语言的常见好处。但是对于VBA,是否有特定的标准?
发布于 2018-09-13 09:05:46
这取决于谁将开发和维护代码。典型的“高级用户”宏编写者通过使用类可能会混淆小型ad-hoc应用程序。但是对于认真的开发,使用类的原因与其他语言相同。你有与VB6相同的限制 - 没有继承 - 但你可以通过使用接口来实现多态性。
类的良好用途是表示实体和实体集合。例如,我经常看到将Excel范围复制到二维数组中的VBA代码,然后使用以下代码操作二维数组:
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 for it)。例如,我可能需要做的一件事是取消保护工作表,进行一些操作,然后再次保护它。使用类可确保即使代码中发生错误,工作表也将再次受到保护:
--- 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
当此Sub退出时,objWorksheetProtector超出范围,工作表再次受到保护。
发布于 2018-09-13 10:12:13
我认为标准与其他语言相同
如果你需要将几个数据和一些方法联系起来,并且还专门处理在创建/终止对象时发生的事情,那么类是理想的
如果你打开一个表格并且其中一个程序需要花费很长时间才会触发一些程序,你可能会决定要在每个阶段计时......
您可以创建一个秒表类,其中包含用于启动和停止的明显函数的方法,然后您可以添加一个函数来检索到目前为止的时间并使用表示正在计时的进程名称的参数在文本文件中报告它。你可以编写逻辑来记录最慢的调查表现。
然后,您可以添加一个进度条对象,其中包含打开和关闭它的方法,并显示当前操作的名称,以及以ms为单位的时间和基于先前存储的报告的剩余可能时间等
另一个例子可能是,如果您不喜欢Access的用户组垃圾,您可以创建自己的User类,其中包含用于登录和注销的方法以及用于组级用户访问控制/审核/记录某些操作/跟踪错误等的功能
当然你可以使用一组不相关的方法和大量的变量传递来做到这一点,但是将它全部封装在一个类中对我来说似乎更好。
你迟早会接近VBA的极限,但它是一种非常强大的语言,如果你的公司将它与你联系起来,你实际上可以从中获得一些好的,复杂的解决方案。
https://stackoverflow.com/questions/-100000758
复制相似问题