2017-02-23 39 views
3

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

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 
+0

вы сначала должны добавить dic2 к dicOverall, перед тем, что он, очевидно, Безразлично 't существует в dicOverall – gizlmo

+0

Вам нужно добавить этот ключ к dic2, это то, что Exists проверяет. – SJR

+0

Добавьте эту строку: 'dicOverall (dic2) = 1' –

ответ

4

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

dicOverall(dic1) = 1 

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

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

Пример:
Скажем .exists проверяет, является ли конкретный объект находится в поле и у вас есть 2 яблока, называемых dic1 и dic2. Если вы положите яблоко dic1 в коробку и отметьте с .exists, если яблоко dic2 находится в коробке, вы получаете нет. .exists не проверяет, есть ли a яблоко в коробке проверяет, есть ли конкретное яблоко с именем 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 и проверьте, существует ли каждый ключ в dic2.

Вот хороший ресурс о словарях: VBA Dictionary и Using the Dictionary Class in VBA

+0

эй, это именно то, чего я пытался достичь - сравнить ключи для каждого словаря. Причина, по которой у меня возникает такой вопрос, заключается в том, что, если у меня есть 'apple1 =" red "и' apple2 = "red" ', две отдельные переменные должны иметь разные адреса памяти. Однако, если бы я должен был выполнить 'dic (apple1) = 1', а затем' dic.Exists (apple2) ', я считаю, что должен получить« True ». По этому расширению мне было интересно, есть ли простой способ сравнить 2 массива или словари, используя метод '.Exists'. – AiRiFiEd

+0

Нет, для сравнения 2 словарей невозможно в том виде, в котором вы его пробовали. Поэтому вам нужно пройти через словарь, как я показал в последней части моего ответа. 'dic.Exists (apple2)' будет ** никогда ** быть 'истинным', если в вашем' dic' есть только 'apple1', даже если оба они красные. –

+0

Извинения за недоразумение - в приведенных выше комментариях 'apple1' и' apple2' являются строками, а не объектами. Мне было интересно, работает ли '.Exists' для двух строковых переменных (с разными адресами памяти), почему бы не работать для 2 объектов? Так как не работает для объектов, уже доказано, что именно «.Exists» сравнивается точно? Благодарим за терпение! Edit: 'apple1 =" red "' 'apple2 =" red "' 'dicOverall (apple1) = 1'' Debug.Print dicOverall.Exists (apple2) ' – AiRiFiEd

1

Единственный способ, которым я могу думать, чтобы получить .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 
+0

, но когда вы это сделаете и добавите ключ в 'dic1', он добавляется в' dic2' тоже. Тогда у вас есть только 2 имени для одной вещи, не так ли? –

+0

Да. В моем ответе 'dic1' и' dic2' являются указателями на один и тот же словарь. Это ответ на вопрос, но он пытается понять, почему вы делаете это в реальной жизни. В противном случае вопрос OP просто получает ответ «нет», вам нужно добавить 'dic2' в' dicOverall'. Ваша точка зрения на словари, которые выглядят одинаково, но не одна и та же, - это обратный мой ответ, где я на самом деле * делаю их одинаковыми * –

+0

Да, это то, о чем я думал. Ты прав. Я просто думаю, что OP думал, что '.exists' проверяет, существуют ли все ключи' dic1' в 'dic2'. Просто хочу убедиться, что разница ясна. В вашем примере 'dic1' и' dic2' ** являются одинаковыми **, а в примере OP 'dic1' и' dic2' ** имеют одинаковое содержимое, но являются разными объектами **. –

Смежные вопросы