初始化VBA类-寻找更优雅的解决方案
我目前正在做一个项目,我想初始化两个不同的类。我正在使用collection类来存储图纸数据 首先,我想遍历类的属性;可悲的是,在VBA中似乎不可能实现这一点(如果不制作一些黑客破解的解决方案) 下面的两个函数几乎相同,但有一个特性不同。我是否可以制作一个在VBA中更可重用的函数初始化VBA类-寻找更优雅的解决方案,vba,excel,Vba,Excel,我目前正在做一个项目,我想初始化两个不同的类。我正在使用collection类来存储图纸数据 首先,我想遍历类的属性;可悲的是,在VBA中似乎不可能实现这一点(如果不制作一些黑客破解的解决方案) 下面的两个函数几乎相同,但有一个特性不同。我是否可以制作一个在VBA中更可重用的函数 Private Sub PasteCMSData() Dim PipelineCMSData As Collection Dim WonCMSData As Collection Dim I
Private Sub PasteCMSData()
Dim PipelineCMSData As Collection
Dim WonCMSData As Collection
Dim I As Integer: I = 0
Set PipelineCMSData = CollectPipeline()
Set WonSheetName = CollectWon()
End Sub
私有函数CollectPipeline()作为集合
Private Function CollectPipeline() As Collection
Const StartPos As Integer = 2
Dim I As Integer: I = 0
Dim PL As cPipeline
Dim WorkbookData As Worksheet
Set CollectPipeline = New Collection
Set WorkbookData = Workbooks(WorkbookName).Worksheets(PLSheetName)
For I = StartPos To WorkbookData.UsedRange.Rows.Count
Set PL = New cPipeline
With PL
.ProjectType = WorkbookData.Cells(I, PLProjectType)
.Segment = WorkbookData.Cells(I, PLSegment)
.Customer = WorkbookData.Cells(I, PLCustomer)
.Project = WorkbookData.Cells(I, PLProject)
.Note = WorkbookData.Cells(I, PLNote)
.CRM = WorkbookData.Cells(I, PLCRM)
.Probability = WorkbookData.Cells(I, PLProbability)
.Owner = WorkbookData.Cells(I, PLOwner)
.SalesPhase = WorkbookData.Cells(I, PLSalesPhase)
.NREPotential = WorkbookData.Cells(I, PLNREPotential)
.RoyaltyPotential = WorkbookData.Cells(I, PLRoyaltyPotential)
.Defcon = WorkbookData.Cells(I, PLDefcon)
.ProjectStart = WorkbookData.Cells(I, PLProjectStart)
.ProjectDuration = WorkbookData.Cells(I, PLProjectDuration)
End With
CollectPipeline.Add PL
Next I
End Function
Private Function CollectWon() As Collection
Const StartPos As Integer = 2
Dim I As Integer: I = 0
Dim WO As cWon
Dim WorkbookData As Worksheet
Set CollectWon = New Collection
Set WorkbookData = Workbooks(WorkbookName).Worksheets(WonSheetName)
For I = StartPos To WorkbookData.UsedRange.Rows.Count
Set WO = New cWon
With WO
.ActualCloseDate = WorkbookData.Cells(I, WOActualCloseDate)
.ProjectType = WorkbookData.Cells(I, WOProjectType)
.Segment = WorkbookData.Cells(I, WOSegment)
.Customer = WorkbookData.Cells(I, WOCustomer)
.Project = WorkbookData.Cells(I, WOProject)
.Note = WorkbookData.Cells(I, WONote)
.CRM = WorkbookData.Cells(I, WOCRM)
.Probability = WorkbookData.Cells(I, WOProbability)
.Owner = WorkbookData.Cells(I, WOOwner)
.SalesPhase = WorkbookData.Cells(I, WOSalesPhase)
.NREPotential = WorkbookData.Cells(I, WONREPotential)
.RoyaltyPotential = WorkbookData.Cells(I, WORoyaltyPotential)
.Defcon = WorkbookData.Cells(I, WODefcon)
.ProjectStart = WorkbookData.Cells(I, WOProjectStart)
.ProjectDuration = WorkbookData.Cells(I, WOProjectDuration)
End With
CollectWon.Add WO
Next I
End Function
作为集合的私有函数CollectWon()
Private Function CollectPipeline() As Collection
Const StartPos As Integer = 2
Dim I As Integer: I = 0
Dim PL As cPipeline
Dim WorkbookData As Worksheet
Set CollectPipeline = New Collection
Set WorkbookData = Workbooks(WorkbookName).Worksheets(PLSheetName)
For I = StartPos To WorkbookData.UsedRange.Rows.Count
Set PL = New cPipeline
With PL
.ProjectType = WorkbookData.Cells(I, PLProjectType)
.Segment = WorkbookData.Cells(I, PLSegment)
.Customer = WorkbookData.Cells(I, PLCustomer)
.Project = WorkbookData.Cells(I, PLProject)
.Note = WorkbookData.Cells(I, PLNote)
.CRM = WorkbookData.Cells(I, PLCRM)
.Probability = WorkbookData.Cells(I, PLProbability)
.Owner = WorkbookData.Cells(I, PLOwner)
.SalesPhase = WorkbookData.Cells(I, PLSalesPhase)
.NREPotential = WorkbookData.Cells(I, PLNREPotential)
.RoyaltyPotential = WorkbookData.Cells(I, PLRoyaltyPotential)
.Defcon = WorkbookData.Cells(I, PLDefcon)
.ProjectStart = WorkbookData.Cells(I, PLProjectStart)
.ProjectDuration = WorkbookData.Cells(I, PLProjectDuration)
End With
CollectPipeline.Add PL
Next I
End Function
Private Function CollectWon() As Collection
Const StartPos As Integer = 2
Dim I As Integer: I = 0
Dim WO As cWon
Dim WorkbookData As Worksheet
Set CollectWon = New Collection
Set WorkbookData = Workbooks(WorkbookName).Worksheets(WonSheetName)
For I = StartPos To WorkbookData.UsedRange.Rows.Count
Set WO = New cWon
With WO
.ActualCloseDate = WorkbookData.Cells(I, WOActualCloseDate)
.ProjectType = WorkbookData.Cells(I, WOProjectType)
.Segment = WorkbookData.Cells(I, WOSegment)
.Customer = WorkbookData.Cells(I, WOCustomer)
.Project = WorkbookData.Cells(I, WOProject)
.Note = WorkbookData.Cells(I, WONote)
.CRM = WorkbookData.Cells(I, WOCRM)
.Probability = WorkbookData.Cells(I, WOProbability)
.Owner = WorkbookData.Cells(I, WOOwner)
.SalesPhase = WorkbookData.Cells(I, WOSalesPhase)
.NREPotential = WorkbookData.Cells(I, WONREPotential)
.RoyaltyPotential = WorkbookData.Cells(I, WORoyaltyPotential)
.Defcon = WorkbookData.Cells(I, WODefcon)
.ProjectStart = WorkbookData.Cells(I, WOProjectStart)
.ProjectDuration = WorkbookData.Cells(I, WOProjectDuration)
End With
CollectWon.Add WO
Next I
End Function
这永远不会变得太优雅,但是在初始化变量列表上有一个改进 在保存它们的工作表上,可以将它们放在两列{UniqueKey}{Value}对中,并将该范围转换为表
Ctrl-NT
可以为表指定一些列名,如键和值,以及唯一的名称。然后在VBA中,您可以通过编程方式查找键并查找其对应的值来访问这些值。这样,表格可以重新排序,一些键可能会“丢失”,从而允许VBA代码输入预先编程的默认值
该表可以在VBA中作为ListObject
访问
在键值对的内部存储上。如果您更适合您的实现,您可能需要考虑将其存储在<代码>字典<代码>中。这样,您就可以按键查找对象,而不是像在
集合中那样只按顺序查找对象
请查看以下词典示例:
你可以
- 创建一个
CommonAttributes
类,该类存储两个类共享的数据(.ProjectType
到.ProjectDuration
)。cWon
和cPipeline
都持有此类的内部实例
- 将初始化逻辑移到类中:
CollectionWon.Add PL.LoadFromRange(I)
- 在类内进行索引值枚举
enum-WOStuff
WOActualCloseDate=1
WONREPotential=9
...
结束枚举
使LoadFromRange
解析并存储任何特定于类的数据(.ActualCloseDate
),创建CommonAttributes
的实例,并调用方法加载公共数据:
myCommonAttributes.LoadFromRange(I, [paramArray of enum indexes])
您可以向函数中添加一个参数,告诉它要创建哪种类型的对象,然后将对象变量声明为object,如果TypeOf obj是CWon
子句,则只在中指定附加属性。您还可以使用接口类并将变量声明为该类型。或者