2017-01-10 5 views
0

私はもっと複雑なコードと辞書を完全に理解していないので、本当に基本的でシンプルなテストシートを作成して、どのように動作するかを把握しました。列a-cの上にある「first」、「do」、「alpha」という3つの項目のみが表示されます(ネストされた辞書を理解することが最終的に目的でした。辞書キーをセルにできないのはなぜですか?

コードはでした:

Sub testing() 

Dim dict As New Scripting.Dictionary 

dict.Add Key:=Cells(1, 1), Item:=Cells(1, 2) 
MsgBox dict(Cells(1, 1)) 

End Sub 

これは動作しませんでした。しかし、変数temp = Cells(1, 1)を追加して、それが現れたところでCells(1, 1)の代わりに使用したとき、それは機能しました。

なぜキーはセルではありませんか?誰かが私に

dict.Add Key:=Cells(1, 1), Item:=(1, 2) 

temp = Cells(1, 1) 

dict.Add Key:=temp, Item:=(1, 2) 

の違いは何であるか理解するのに役立つことはできますか?項目は、キーではなく、セルにすることができますか?

+1

両方のセルの終わりに '.value'を入れます。(1,1) –

+0

はい、辞書はデータを格納するときに非常に適応します。 'Value'がなければ、範囲オブジェクトを格納します。 – cyboashu

+0

ああ!私はこの機能について聞いていませんでした。だから '.value'は' .value'が付けられているものの中の文字列を返します。 –

答えて

0

あなたできるキーと、(.Cellsによって返された範囲を含む)の両方の値として使用オブジェクト、このコードが示すように:実際には

Public Sub Example() 
    Dim dict As New Scripting.Dictionary 
    dict.Add Sheet1.Cells(1, 1), Sheet1.Cells(1, 1) 
    dict.Add Sheet1.Cells(1, 2), Sheet1.Cells(1, 1) 

    Dim x As Variant 
    For Each x In dict.Keys 
     Debug.Print TypeName(x) 'Prints Range 
    Next 

    For Each x In dict.Items 
     Debug.Print TypeName(x) 'Prints Range 
    Next 
End Sub 

、上記のコードが「作品」 - あなただけですMsgBoxであなたが期待しているものが見えません。このコード行では...

MsgBox dict(Cells(1, 1)) 

... MsgBoxへの最初のパラメータはVariantあるが、それは最終的にStringを表示できるようにする必要があります。パラメータとしてオブジェクトを受け取った場合、デフォルトメンバー(この場合は.Value)を呼び出します。 tempを使用して、第二の例について

MsgBox dict(Cells(1, 1).Value) 

、私はそれが宣言されていない(と暗黙的Variant)またはいくつかの他の強く型付けされた値のいずれかであることを仮定している:それはあなたのコードと等価であることを意味します。一時はRange(またはObject)、それは正確では同じ働きとして宣言されている場合は

Dim temp As Variant 
temp = Cells(1, 1).Value 
dict.Add temp, Cells(1, 2) '<--- temp is whatever the type of Cells(1, 1).Value is. 

:あなたの割り当ては同等ですので、その場合には、割り当ては暗黙のうちに、Cells(1, 1)のデフォルトメンバーを呼び出しています独自のセルオブジェクトのユニークな細胞よりも異なっていることに注意してください

Dim temp As Range 
Set temp = Cells(1, 1) 
dict.Add temp, Cells(1, 2) '<--- temp is a Range. 

:上Sub Example()

Public Sub Example2() 
    Dim dict As New Scripting.Dictionary 
    Cells(1, 1).Value = "Foo" 
    Cells(1, 2).Value = "Foo" 

    'This is fine - the keys are unique cell references: 
    dict.Add Cells(1, 1), Empty 
    dict.Add Cells(1, 2), Empty '<-- No runtime error 

    Set dict = New Scripting.Dictionary 

    'This is an error - the keys are identical values: 
    dict.Add Cells(1, 1).Value, Empty 
    dict.Add Cells(1, 2).Value, Empty '<-- Runtime error 457, key already exists. 
End Sub 
+0

だから私は正しく理解している - 辞書(セル)に保存するときに1つのデータ型としてキーを使用したが、msgboxが呼び出されたときに別のデータ型にデフォルトで設定されているため、表示されません。テキストが同一であっても、データ型は異なりますか?それで、tempを使用することは、意図的に別のデータ型として辞書に保存することによって、間違いなく無関心なブリッジの一種でした。同時に、同じmsgboxのデフォルトは? –

+0

@GrahamPerry - いいえそれは同じタイプ( 'Range')です。オブジェクトを 'MsgBox'することはできないので、デフォルトのメンバ - ' .Value'を呼び出します。 'temp'への割り当ては、あなたがその前に' Set'を使わなかったので全く同じことをしました。 'Set'キーワードなしの' Variant'への代入は、値代入であり、参照代入ではありません。 – Comintern

+0

私は今もっと混乱していると思います。 'Cells(1,1)'は範囲オブジェクトです。 tempは(nは宣言されていない)バリアントなので、暗黙的に 'Cells(1,1).Value'に設定されます。 rangeはオブジェクト(?)なので、msgboxは '.value'を追加して' Cells(1、1).Value'を返すことでこれを修正しようとします。それは同じ結果だからだが、そうでなければうまくいくので、明らかにそれは当てはまりません。 –

関連する問題