我有一套噩梦般复杂的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
添加付款,以使内容与内置类保持一致,但我不知道该怎么做。
谢谢!
答案 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属性可以找到正确的。