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

我有一个噩梦般复杂的Excelmacros,我试图通过设置一系列类来简化,但是我从来没有做过面向对象编程,所以我有点不清楚如何设置东西(甚至如何制定我的问题)。 我目前有一个租赁类,它有一个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类看起来像这样:

 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这样的内置对象的方式是做什么的? 我可以将“Payments”重命名为“Lease”和“Item”作为“Payment”,但是然后添加一个Payment,我会做Lease.Add ,这不是很直观。 我宁愿使用Lease.Payments.Add添加一个付款,以保持与内置类的一致性,但我不知道如何做到这一点。

谢谢!

为您的课程创build“默认属性”的答案可以在这里find。 这有点丑,但可以做到。

除了build议您在模块中创build一个variables并将其设置为初始化之外,对于第二个问题我没有很好的答案:

 Set Payments = Lease.Payments 

对于第二部分我不认为你可以像Range对象那样做。 你可以做一个租约集合类。 假设gLeases是一个持有所有租约的公共variables。

 Dim Payments as CPayments Set Payments = gLeases.GetLeaseBySheet(ActiveSheet).Payments Debug.Print Payments(1).PaymentNumber 

我不知道现在如何填写你的租约,但是你需要全部加载它们,这样你的GetLeaseBySheet属性才能find合适的。