首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >何时在VBA中使用Class?

何时在VBA中使用Class?
EN

Stack Overflow用户
提问于 2018-09-13 00:53:13
回答 2查看 0关注 0票数 0

何时在Visual Basic for Applications(VBA)中使用类是否合适?

我假设加速开发和减少引入错误是大多数支持OOP的语言的常见好处。但是对于VBA,是否有特定的标准?

EN

回答 2

Stack Overflow用户

发布于 2018-09-13 09:05:46

这取决于谁将开发和维护代码。典型的“高级用户”宏编写者通过使用类可能会混淆小型ad-hoc应用程序。但是对于认真的开发,使用类的原因与其他语言相同。你有与VB6相同的限制 - 没有继承 - 但你可以通过使用接口来实现多态性。

类的良好用途是表示实体和实体集合。例如,我经常看到将Excel范围复制到二维数组中的VBA代码,然后使用以下代码操作二维数组:

代码语言:javascript
复制
Total = 0
For i = 0 To NumRows-1
    Total = Total + (OrderArray(i,1) * OrderArray(i,3))
Next i

将范围复制到具有适当命名属性的对象集合中更具可读性,如:

代码语言:javascript
复制
Total = 0
For Each objOrder in colOrders
    Total = Total + objOrder.Quantity * objOrder.Price
Next i

另一个例子是使用类来实现RAII设计模式(google for it)。例如,我可能需要做的一件事是取消保护工作表,进行一些操作,然后再次保护它。使用类可确保即使代码中发生错误,工作表也将再次受到保护:

代码语言:javascript
复制
--- 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

然后,您可以使用它来简化代码:

代码语言:javascript
复制
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超出范围,工作表再次受到保护。

票数 0
EN

Stack Overflow用户

发布于 2018-09-13 10:12:13

我认为标准与其他语言相同

如果你需要将几个数据和一些方法联系起来,并且还专门处理在创建/终止对象时发生的事情,那么类是理想的

如果你打开一个表格并且其中一个程序需要花费很长时间才会触发一些程序,你可能会决定要在每个阶段计时......

您可以创建一个秒表类,其中包含用于启动和停止的明显函数的方法,然后您可以添加一个函数来检索到目前为止的时间并使用表示正在计时的进程名称的参数在文本文件中报告它。你可以编写逻辑来记录最慢的调查表现。

然后,您可以添加一个进度条对象,其中包含打开和关闭它的方法,并显示当前操作的名称,以及以ms为单位的时间和基于先前存储的报告的剩余可能时间等

另一个例子可能是,如果您不喜欢Access的用户组垃圾,您可以创建自己的User类,其中包含用于登录和注销的方法以及用于组级用户访问控制/审核/记录某些操作/跟踪错误等的功能

当然你可以使用一组不相关的方法和大量的变量传递来做到这一点,但是将它全部封装在一个类中对我来说似乎更好。

你迟早会接近VBA的极限,但它是一种非常强大的语言,如果你的公司将它与你联系起来,你实际上可以从中获得一些好的,复杂的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100000758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档