Excel vba:未定义属性让程序和属性获取程序未返回对象

par*_*cer 4 arrays excel vba

我有一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
Run Code Online (Sandbox Code Playgroud)

Client课堂上:

Public Property Get getLosses()
    getLosses = losses
End Property

Private losses() As Double
Run Code Online (Sandbox Code Playgroud)

如何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
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况以及如何解决?

编辑:更多的主要子:

For Each clientCopy In clientsColl
        clientCopy.setSimulationCount = globals("SIMULATION_COUNT")
        ...
        clientCopy.calculateFinancialResult
        ...
Next
Run Code Online (Sandbox Code Playgroud)

编辑:

同时一个简单的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
Run Code Online (Sandbox Code Playgroud)

Com*_*nse 5

总结评论中所说的话:

当您尝试复合属性时,您的问题(错误 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
Run Code Online (Sandbox Code Playgroud)

您的问题源于您将属性视为属性的事实。在不那么复杂(或当您的数组被明确声明为类实例数组时)级别上,由于早期绑定,它可以工作。但是当事情开始变得更复杂时 - 它失败了,因为您的财产只是另一个功能。

因此,要实现您想要的,您应该使用另一对括号显式调用它。