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

时间:2018-09-13 19:20:21

标签: excel vba excel-vba class module

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

我有一个具有常规模块的自定义Excel加载项。该模块(通常称为“ Module1”)包含大约18个子例程,它们均具有完全不同的功能。每个子例程都使用每个子例程中的ByVal control As IRibbonControl参数以及一些Ribbon 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类不适用),一个子例程也不执行其他几个子例程。

将当前的“普通模块”重新格式化为新的“类模块+普通模块”(作为驱动程序)对我的处境完全有利吗?

谢谢您的任何输入。

1 个答案:

答案 0 :(得分:2)

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

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

Chip Pearson的网站上有以下主题的丰富内容:http://www.cpearson.com/excel/classes.aspx