我有一个Client
课程。在该类中,有一个数组losses
。首先,我使用clientsColl
数组创建并填充客户端。然后,对于该数组中的每个客户端,我填充其losses
数组。
然后我尝试打印调试每个客户端losses
的第一个元素。但是,它不起作用并且出现Property let procedure not defined and property get procedure did not return an object
错误。
同时如果我只是尝试为第一个客户端显示losses
的第一个元素而没有任何循环,它可以正常工作:
Dim clientsColl() As Client
clientsColl = getClients(dataWorkbook)
Dim clientCopy As Variant
Debug.Print "first: " & clientsColl(1).getLosses(1) 'works fine
For Each clientCopy In clientsColl
Debug.Print "in for each: " & clientCopy.getLosses(1) 'error here
Next
在Client
课程中:
Public Property Get getLosses()
getLosses = losses
End Property
Private losses() As Double
如何填充losses
数组:
Public Sub calculateFinancialResult()
ReDim losses(1 To simulationCount)
ReDim profits(1 To simulationCount)
Dim i As Long
For i = 1 To simulationCount
If outcomes(i) = 1 Then
losses(i) = totalLoss
...
Else
...
End If
Next
End Sub
为什么会发生这种情况以及如何解决?
编辑:更多主要子资料:
For Each clientCopy In clientsColl
clientCopy.setSimulationCount = globals("SIMULATION_COUNT")
...
clientCopy.calculateFinancialResult
...
Next
修改
同时一个简单的for
循环工作正常:
Debug.Print "first: " & clientsColl(1).getLosses(1)
For tempCount = LBound(clientsColl) To UBound(clientsColl)
Debug.Print "in for each: " & _
clientsColl(tempCount).getLosses(1)
Next
答案 0 :(得分:3)
总结评论中的内容:
当您尝试复合属性时,通常会出现您的问题(错误451)。 为了表示这种情况,我们可以使用具有属性的任何对象的任何结构。
让我们用集合数组模拟它:
Option Explicit
Sub Test()
Dim Arr As Variant
Dim Col As Collection
Dim i As Long
Dim j As Long
ReDim Arr(1 To 10)
For i = 1 To 10
Set Col = New Collection
For j = 1 To 10
Call Col.Add(j)
Next
Set Arr(i) = Col
Next
On Error Resume Next
Debug.Print Arr(1).Item(1)
Debug.Print Arr(1).Item()(1)
On Error GoTo 0
End Sub
您的问题源于您将属性视为属性。在不那么复杂的情况下(或者当你的数组被明确地声明为类实例数组)时,它会因早期绑定而起作用。但是当事情开始变得更复杂时 - 它失败了,因为你的财产只是另一个功能。
因此,为了达到你想要的效果,你应该用另一对括号明确地调用它。
答案 1 :(得分:2)
你的getLosses
属性没有参数,所以你的语法实际上是错误的,即使VBA可以在早期绑定时处理它。你应该使用:
Debug.Print "first: " & clientsColl(1).getLosses()(1) 'works fine
For Each clientCopy In clientsColl
Debug.Print "in for each: " & clientCopy.getLosses()(1) 'error here
Next
答案 2 :(得分:0)
我在使用复合属性创建自定义数组类时也遇到了这个问题。
我通过在 Property Get
代码中为返回值添加 class 语句来解决它。正如@Rory所说。
您可以在 Public Property Get getLosses() As Double
类中尝试 Client
。