【发布时间】:2021-09-23 09:25:17
【问题描述】:
我有一个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
【问题讨论】:
-
您是否尝试过单步执行并查看每个数组的上限是多少?您是否在 Client 的初始化事件中填充损失?
-
@Harassed Dad
losses在循环前几行填充。问题是,Debug只打印first: 0。这意味着,至少对于第一个客户端,数组的第一个元素存在。同时出现了来自for each循环的no 调试打印 - 虽然我们确定至少对于一个客户端来说它应该已经出现。 -
"损失在循环前几行填充。"您确定它实际上填充了所有客户端吗?如果那里有错误,它会解释它。 F8 是你的朋友。
-
尝试将
clientCopy声明为Client。您不仅可以使用Variants迭代for each。也解决了问题。 -
因为它类似于早/晚绑定问题,
vba只是不知道对clientCopy.getLosses(1)的期望,其中两个变量(clientCopy和getLosses)都是Variants.如果您仍想执行这样的循环,请在循环中尝试此语句 (Debug.Print clientCopy.getLosses()(1))(或将clientCopy.getLosses()的结果存储在内部某处)。