Excel VBA – Dictonary.Exists (Словарь)?

Хотелось бы лучше понять, как сравниваются ключи типа объекта. dicOverall.exists(dic2) возвращает False а dicOverall.exists(dic1) возвращает True . Я не слишком уверен в том, как. .Exists вещи (цикл?), Но есть ли все равно, что я мог бы получить .Exists(dic2) чтобы вернуть True ? Спасибо!

 Sub test() Dim dic1 As Object Dim dic2 As Object Dim dicOverall As Object Set dic1 = CreateObject("scripting.dictionary") Set dic2 = CreateObject("scripting.dictionary") Set dicOverall = CreateObject("scripting.dictionary") dic1("Hi") = 1 dic1("Hello") = 1 dic2("Hi") = 1 dic2("Hello") = 1 dicOverall(dic1) = 1 Debug.Print dicOverall.exists(dic2) End Sub 

Я думаю, если вы это сделаете

 dicOverall(dic1) = 1 

то единственным существующим ключом в dicOverall является объект dic1 и вы спрашиваете, существует ли ключ dic2 в dicOverall ? Этот ответ не может быть true это всегда false .

dic1 и dic2 – 2 совершенно разных объекта, даже если они содержат одни и те же ключи. .exists не сравнивает содержимое этих объектов, он просто видит, что эти объекты являются разными объектами.

Пример:
Предположим, что .exists проверяет, находится ли конкретный объект в ящике, и у вас есть 2 яблока, называемых dic1 и dic2 . Если вы положите яблоко dic1 в коробку и проверьте с .exists если apple dic2 находится в коробке, вы получаете нет. .exists не проверяет, есть ли яблоко в поле, которое он проверяет, есть ли в dic2 определенное яблоко с именем dic2 . Даже если они оба яблоки и выглядят одинаково.

 Sub AppleExample() Dim apple1 As Object Dim apple2 As Object Dim box As Object Set apple1 = CreateObject("scripting.dictionary") Set apple2 = CreateObject("scripting.dictionary") Set box = CreateObject("scripting.dictionary") 'apple1 has 1 stem and a red color apple1("stem") = 1 apple1("redColor") = 1 'apple2 has 1 stem and a red color apple2("stem") = 1 apple2("redColor") = 1 'put apple1 into the box box(apple1) = 1 'check if apple2 is in the box Debug.Print box.exists(apple2) End Sub 

Если вы хотите проверить, есть ли что-то в коробке, которая выглядит как apple1 но на самом деле apple2 тогда вы должны сами проверить все свойства (стебель, цвет, …).


Если вы хотите проверить, имеют ли dic1 те же ключи, что и dic2 тогда вам нужно проверить …

  1. если dic1 и dic2 имеют одинаковое количество ключей (необходимо, если dic2 имеет все ключи от dic1 но плюс другие клавиши!)
  2. если сначала верно, то dic1 все ключи dic1 и проверьте, существует ли каждый отдельный ключ в dic2 .

Вот хороший ресурс о словарях: словарь VBA и использование класса словаря в VBA

Единственный способ, который я могу придумать, чтобы получить .Exists(dic2) чтобы вернуть True – это установить dic2 для ссылки на dic1 – поэтому под капотом dic1 и dic2 являются просто указателями на один и тот же базовый объект.

Тогда – даже если вы никогда не делаете dicOverall.Add dic2, 1 вы все равно получите True если вы выполните dicOverall.Exists(dic2) .

Это все не хватает реального приложения для жизни – но полезно, если вы играете со словарями. В этом примере кода вы увидите использование Set dic2 = dic1 чтобы они указывали на один и тот же базовый словарь. И изменение значения dic2 также меняет его в dic1 – показывая, что они указывают на одно и то же.

Тогда проверка на то, что dic2 является ключом dicOverall , вернет True :

 Option Explicit Sub Test() Dim dic1 As New Dictionary Dim dic2 As New Dictionary Dim dicOverall As New Dictionary 'add items to first dictionary dic1.Add "foo", "bar" dic1.Add "baz", "qux" 'make second refer to first Set dic2 = dic1 'add first dictionary to overall dicOverall.Add dic1, 1 'change a value in 2nd dictionary and see 1st dictionary change too Debug.Print dic1.Item("baz") dic2.Item("baz") = "hello world" Debug.Print dic1.Item("baz") 'shows 1 for both dictionaries '*even though you never added dic2 to dicOverall* Debug.Print dicOverall.Exists(dic1) Debug.Print dicOverall.Exists(dic2) End Sub 

Мой вывод отладки:

 qux hello world True True 
  • Openpyxl - чтение многих столбцов
  • Может ли AutoFilter использовать включенные и не включенные подстановочные знаки из словарных ключей?
  • VBA. Удалите дубликаты, запустив 30 минут, чтобы не задумываться, почему
  • Как добавить dict в файл csv и файл excel в python
  • Сценарий запроса запроса VBA.
  • Создание списка с вложенными словарями в Openpyxl
  • VBA. Безопасно ли удалять элементы из словаря внутри a для каждого?
  • Закажите TreeMap с помощью специализированного компаратора, такого как порядок координат Excel
  • VBA: Как преобразовать полные словарные колонки в один столбец на каждую букву?
  • Как читать Excel и делать сопоставление
  • Словарь VBA - Добавление данных
  • Interesting Posts
    Давайте будем гением компьютера.