Excel VBA:我应该使用类模块吗?



Heylo,我一直在寻求使我的代码更清晰,更好,更高效。我也一直在寻求使其更易于使用和更易于维护。我有在C/C++中面向对象编程的经验,但是我一直在避免使用Excel VBA。我一直在阅读 VBA 中的类模块,但我无法确定它们是否值得我的情况。

我有一个自定义的 Excel 加载项,它有一个普通的模块。这个模块(通常称为"Module1"(包含大约 18 个子例程,它们都做完全不同的事情。其中每个子例程都使用每个子例程中的ByVal control As IRibbonControl参数连接到自定义选项卡中的自定义按钮,并使用一些功能区 XML 来驱动布局和功能。

无论如何,作为一个例子,我已经写了我认为类模块和普通模块在我的情况下,如果我要实现它们的样子:

' Class Module: TestClass
Private sumVal As Double
Private wsNames As String
Public Sub Add(myRange as Range)
For Each myCell In myRange
sumVal = sumVal + myCell.Value
Next myCell
MsgBox "The sum of your range is: " & sumVal
End Sub
Public Sub ChangeSettings()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
MsgBox "The settings have been changed!"
End Sub
Public Sub PrintHello()
MsgBox "Hellurrr!"
End Sub
Public Sub PrintSheetNames()
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Sheets
wsNames = wsNames + ws.Name + ", "
Next ws
MsgBox "The names of all sheets in this workbook are: " & wsNames
End Sub

' Normal Module: Module1
Sub RunAdd(ByVal control As IRibbonControl)
Dim ClsObj As New TestClass
Dim theRange As Range
Set theRange = Selection
ClsObj.Add theRange
End Sub
Sub RunChangeSettings(ByVal control As IRibbonControl)
Dim ClsObj As New TestClass
ClsObj.ChangeSettings
End Sub
Sub RunPrintHello(ByVal control As IRibbonControl)
Dim ClsObj As New TestClass
ClsObj.PrintHello
End Sub
Sub RunPrintSheetNames(ByVal control As IRibbonControl)
Dim ClsObj As New TestClass
ClsObj.PrintSheetNames
End Sub

就像这个例子一样,我拥有的所有子例程本质上都是不同的。我的子例程不共享变量或属性(因此标志性的 Car 类不适用(,一个子例程也不执行其他几个子例程。

将我当前的普通模块重新格式化为新的类模块 + 普通模块(作为驱动程序(对我的情况有益吗?

提前感谢您的任何意见。

根据您提供的代码,使用类模块实际上没有意义。

类模块用于定义自定义对象。

Chip Pearson的网站有关于这个主题的好内容:http://www.cpearson.com/excel/classes.aspx

最新更新