初始化VBA类 – 寻找更优雅的解决scheme

我目前正在做一个项目,我想要初始化两个不同的类。 我正在使用集合类来存储图纸数据。

首先我想遍历类的属性; 可悲的是,在VBA中似乎不可能(没有制造一些黑客攻击的解决scheme)。

下面的两个函数几乎是一样的,一个属性的差异。 我能以某种方式创build一个在VBA中更加可重用的函数吗?

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()作为集合

 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 

你可以;

  • 创build一个CommonAttributes类,用于存储两个类共享的数据( .ProjectType.ProjectDuration )。 cWoncPipeline拥有这个类的内部实例。

  • 将初始化逻辑移入类: CollectionWon.Add PL.LoadFromRange(I)

  • 在类中创build索引值枚举;

    enum WOStuff WOActualCloseDate = 1 WONREPotential = 9 ... end enum

使LoadFromRangeparsing并存储任何类特定的数据( .ActualCloseDate ),创build一个CommonAttributes实例并调用一个方法来加载公共数据:

 myCommonAttributes.LoadFromRange(I, [paramArray of enum indexes]) 

这永远不会太优雅,但是在初始化variables列表上有一个改进。

在他们保存的表单中,可以将它们放在一个双列{UniqueKey} {Value}对中,并将该范围转换成一个表格Ctrl-NT

该表可以给出一些列名称,如键和值,以及一个唯一的名称。 然后在VBA中,通过以编程方式查找Key并find其相应的值,即可访问这些值。 这样,表格可以重新sorting,有些键可以“错过”,允许VBA代码以预编程的默认值进行泵送。

该表可以作为ListObject在VBA中访问。


在Key-Value对的内部存储上。 你可能要考虑将它存储在一个Dictionary如果这更适合你的实现。 这样你就可以通过按键来查找对象,而不是像Collection一样按顺序查找。

看看这里看一个词典的例子:

VBA是否有字典结构?