如何在VBA中为自定义集合类指定默认属性?

时间:2014-08-12 18:05:03

标签: excel vba class excel-vba collections

我有一套噩梦般复杂的Excel宏,我试图通过设置一系列类来简化,但我以前从未做过面向对象的编程,所以我可以关于如何设置(甚至如何制定我的问题)还不清楚。我目前有一个租赁类,它有一个Payments属性,如下所示:

Option Explicit
Private oPayments As New Payments

Public Property Get Payments() As Payments
Set Payments = oPayments
End Property

Public Property Let Payments(param_Payments As Payments)
Set oPayments = param_Payments
End Property

我还有一个支付类,其中包含支付号码和Payments类,它将保存Payment类的实例。 Payments类如下所示:

Option Explicit
Private Payments As New Collection

Sub Add(param_Number As String)
Dim NewPayment As Payment
Set NewPayment = New Payment
NewPayment.PaymentNumber = param_Number
Payments.Add NewPayment
End Sub

Property Get Count() As Long
Count = Payments.Count
End Property

Property Get Item(Index As Variant) As Payment
Set Item = Payments(Index)
End Property

这一切都运作良好,但它有点笨拙,因为为了指定付款,我需要使用Lease.Payments.Item(1).PaymentNumber。我怎么能设置好所以我可以使用Lease.Payments(1).PaymentNumber?更好的是,因为每个工作表只有一个租约,我可以设置它以便我只说Payments(1).PaymentNumber它默认为活动工作表上的租约,就像Range这样的内置对象的方式做?我可以重命名"付款"作为" Lease"和"项目"作为"付款",但随后添加付款,我会Lease.Add,这不是非常直观的。我宁愿使用Lease.Payments.Add添加付款,以使内容与内置类保持一致,但我不知道该怎么做。

谢谢!

2 个答案:

答案 0 :(得分:1)

可以找到为您的班级创建“默认媒体资源”的答案here。这有点难看,但可以做到。

除了建议您在模块中创建变量并将其设置为初始化时,我对第二个问题没有很好的答案:

Set Payments = Lease.Payments

答案 1 :(得分:1)

对于第二部分,我不认为你可以像Range对象那样做。您可以制作租赁集合课程。假设gLeases是一个包含所有租约的公共变量。

Dim Payments as CPayments

Set Payments = gLeases.GetLeaseBySheet(ActiveSheet).Payments

Debug.Print Payments(1).PaymentNumber

我现在不知道如何填写您的租约,但您需要将它们全部加载,以便您的GetLeaseBySheet属性可以找到正确的。