嘿,我一直在寻求使我的代码更整洁,更好,更高效。我也一直在寻求使其更易于使用和维护。我在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类不适用),一个子例程也不执行其他几个子例程。
将当前的“普通模块”重新格式化为新的“类模块+普通模块”(作为驱动程序)对我的处境完全有利吗?
谢谢您的任何输入。
答案 0 :(得分:2)
根据您提供的代码,使用类模块实际上没有任何意义。
类模块用于定义自定义对象。
Chip Pearson的网站上有以下主题的丰富内容:http://www.cpearson.com/excel/classes.aspx