字典中的现有功能不适用于对象,因为在类模块中创建了Key

时间:2019-01-10 13:40:43

标签: excel vba

在我的代码中,需要在我的密钥中存储两个值才能进行我需要的分析。而且由于我不想将所有内容存储在数组中,因此我决定创建一个具有2个参数的对象。但是,当我使用对象“ TwoInputs”作为键的类型运行字典的Exist函数时,我总是得到它们的键不存在。有人可以帮忙吗?

我添加了“ Option Compare Text”,以防万一,但是仍然存在False。 当我逐行运行代码并强制其达到“ true”条件时,仍会创建一个新的Key,不知道为什么。

这是我创建的类模块:

Private acc As Double
Private act As Variant




'Account property

Public Property Get Account() As Double
    Account = acc
End Property
Public Property Let Account(Value As Double)
    acc = Value
End Property


'Activity property

Public Property Get Activity() As Variant
    Activity = act
End Property
Public Property Let Activity(Value As Variant)
    act = Value
End Property

在普通模块中,我编写了一个函数,用于基于两个条目创建TwoInputs对象:

Public Function cTwoInputs(Account As Double, Activity As Variant) As TwoInputs

Set cTwoInputs = New TwoInputs
cTwoInputs.Account = Account
cTwoInputs.Activity = Activity


End Function

然后,我创建一个子目录,如果要添加密钥中的2条信息,请在其中添加它们:

While dataSheet.Range("dataAgent").Offset(j, 0).Value <> "Project ID:" And dataSheet.Range("dataAgent").Offset(j, 0).Row <= lRow
                If dataSheet.Range("dataAgent").Offset( j, 0).Value = "Activity ID:" Then
                    actName = dataSheet.Range("dataAgent").Offset(j, 1).Value
                End If
                If (dataSheet.Range("dataAgent").Offset(j, 0).Value = "XXXXX" Or dataSheet.Range("dataAgent").Offset(j, 0).Value = "") Then
                    KeyExist.Account = dataSheet.Range("dataAccount").Offset(j , 0).Value
                    KeyExist.Activity = actName
                    If dicBudget.Exists(KeyExist) Then
                        dicBudget(KeyExist) = dicBudget(KeyExist) + dataSheet.Range("dataBudget").Offset(j , 0).Value
                    Else
                        dicBudget.Add cTwoInputs(dataSheet.Range("dataAccount").Offset(j, 0).Value, actName), dataSheet.Range("dataBudget").Offset( j, 0).Value
                    End If
                End If
                j = j + 1
            Wend

1 个答案:

答案 0 :(得分:0)

.Exists()方法按实例而不是字段值比较对象。 因此,最好将原始类型(如String,Integer,Double等)用作键,而不要使用自定义对象作为键。如果确实需要出于某种目的使用对象键,则必须确保在放入字典的同一对象上调用.Exists()方法(例如,通过将该键存储在全局变量中)。