Функция Exist в словаре не работает для объекта, так как ключ создан в модуле класса. - PullRequest
0 голосов
/ 10 января 2019

В моем коде нужно хранить два значения в моем ключе, чтобы иметь возможность выполнять анализ, который мне требуется. И так как я не хотел хранить все в массиве, я решил создать объект с 2 параметрами. Но когда я запускаю функцию Exist в словаре с этим объектом «TwoInputs» в качестве типа Key, я всегда понимаю, что их Key не существует. Может кто-нибудь помочь, пожалуйста?

Я добавил «Option Compare Text» на всякий случай, но существующие все еще возвращают False. Когда я построчно запускаю код и заставляю его переходить в условие «истинно», новый ключ все еще создается, не знаю почему.

Это модуль класса, который я создал:

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 голосов
/ 10 января 2019

.Exists () сравнивает объекты по их экземплярам, ​​а не по значениям их полей. Поэтому лучше использовать примитивные типы, такие как String, Integer, Double и т. Д. В качестве ключей, а не использовать пользовательский объект в качестве ключа. Если вам действительно нужно использовать ключ-объект для каких-то целей, вы должны быть уверены, что вызываете метод .Exists () для того же объекта, который вы помещаете в словарь (например, сохраняя этот ключ в глобальной переменной).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...