Excel vba:属性let过程未定义,属性get过程未返回对象

时间:2017-11-28 10:41:06

标签: arrays excel vba 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

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

3 个答案:

答案 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