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

Excel VBA:我应该使用类模块吗?,vba,excel,class,module,Vba,Excel,Class,Module,Heylo,我一直在努力使我的代码更干净、更好、更高效。我也一直希望它更易于使用和维护。我有在C/C++中进行面向对象编程的经验,但我一直避免使用Excel VBA。我已经读了很多关于VBA中的类模块的书,但我无法确定它们是否适合我的情况 我有一个自定义Excel加载项,它有一个普通模块。这个模块(一般称为“Module1”)包含大约18个子例程,它们都做完全不同的事情。每个子例程都连接到自定义选项卡中的自定义按钮,使用每个子例程中的ByVal控件作为IRibbonControl参数,以及一些功

Heylo,我一直在努力使我的代码更干净、更好、更高效。我也一直希望它更易于使用和维护。我有在C/C++中进行面向对象编程的经验,但我一直避免使用Excel VBA。我已经读了很多关于VBA中的类模块的书,但我无法确定它们是否适合我的情况


我有一个自定义Excel加载项,它有一个普通模块。这个模块(一般称为“Module1”)包含大约18个子例程,它们都做完全不同的事情。每个子例程都连接到自定义选项卡中的自定义按钮,使用每个子例程中的
ByVal控件作为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
像这个例子一样,我所有的子程序本质上都是不同的。我的子例程不共享变量或属性(因此图标车类不适用),一个子例程也不执行其他几个子例程

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


提前感谢您的任何意见。

根据您提供的代码,使用类模块是没有意义的

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


Chip Pearson的网站在这个主题上有很好的内容:

根据您提供的代码,使用类模块是没有意义的

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


Chip Pearson的网站在这一主题上有很好的内容:

“18个子例程,它们都做完全不同的事情”似乎并不是一组令人信服的代码来创建一个类。在这里,你可能从一个类中得到的只是增加的复杂性。“18个子例程,它们都做完全不同的事情”似乎并不是一组令人信服的代码来创建一个类。很可能你从一个类中得到的只是增加了复杂性。