2017-02-23 60 views
3

想更好地瞭解如何比較對象類型的鍵。 dicOverall.exists(dic2)返回FalsedicOverall.exists(dic1)返回True。我不太確定.Exists比較東西(循環?),但是有無論如何,我可以得到.Exists(dic2)返回True?謝謝!Excel VBA - Dictonary.Exists(Dictionary)?

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,在此之前,它顯然沒有按不存在於dicOverall中 – gizlmo

+0

您需要將該密鑰添加到dic2,這就是Exists正在檢查的內容。 – SJR

+0

添加此行:'dicOverall(dic2)= 1' –

回答

4

我想,如果你這樣做

dicOverall(dic1) = 1 

然後在dicOverall現有的唯一關鍵是對象dic1,你問,如果存在dicOverall關鍵dic2?這個答案不能是true它總是false

dic1dic2是2個完全不同的對象,即使它們包含相同的鍵。 .exists不比較這些對象的內容,它只是看到這些對象是不同的對象。

例子:
比方說.exists檢查是否有具體的目標是在一個盒子裏,你有2個蘋果稱爲dic1dic2。如果你把蘋果dic1放入盒子,並檢查.exists如果蘋果dic2是在框中,你會得到一個沒有。 .exists不檢查是否有蘋果在框中檢查是否有具體蘋果名爲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. 如果dic1dic2具有鍵(必要的相同的計數,如果dic2具有從所有鍵dic1但加上其他密鑰!)
  2. 如果第一個是真的,然後遍歷所有密鑰dic1並檢查每個單個密鑰是否存在dic2

下面是關於字典一個很好的資源:VBA DictionaryUsing the Dictionary Class in VBA

+0

嘿,這正是我想要實現的 - 比較每個字典的關鍵字。我有這樣一個問題的原因是,假設我有'apple1 =「red」'和'apple2 =「red」',那麼2個獨立的變量應該有不同的內存地址。但是,如果我要做'dic(apple1)= 1'和隨後的'dic.Exists(apple2)',我相信我應該得到'真實'。通過這個擴展,我想知道是否有一種簡單的方法通過利用'.Exists'方法來比較2個數組或字典。 – AiRiFiEd

+0

不,比較2個字典的內容是不可能的,就像你嘗試過的那樣。因此,您必須像我在答案的最後部分所顯示的那樣遍歷字典。 'dic.Exists(apple2)'如果在'dic'中只有'apple1',即使它們都是紅色,也不會**爲'true'。 –

+0

道歉混淆 - 在上面的評論中'apple1'和'apple2'是字符串而不是對象。我想知道是否'.Exists'工作2個字符串變量(具有不同的內存地址),爲什麼不能用於2個對象?由於沒有爲對象工作已經被證明,'.Exists'究竟是什麼比較?感謝您對此查詢的耐心等待!編輯:'apple1 =「red」''apple2 =「red」''dicOverall(apple1)= 1''Debug.Print dicOverall.Exists(apple2)' – AiRiFiEd

1

我能想到的唯一辦法讓.Exists(dic2)返回True是設置dic2dic1 - 所以在引擎蓋dic1dic2只是指向相同的基礎對象。

然後 - 即使你永遠不會做dicOverall.Add dic2, 1如果你做dicOverall.Exists(dic2),你仍然會得到True

這完全是缺乏現實生活中的應用程序 - 但如果你正在玩字典的話很有用。在這個示例代碼中,您將看到使用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'檢查'dic2'中是否存在'dic1'的所有關鍵字。只是想確保差異是明確的。在你的例子中,'dic1'和'dic2' **是相同的**,在例子中'dic1'和'dic2' **具有相同的內容但是不同的對象**。 –