3

次のコードがあります。

Dim dicMyHash As Dictionary
Dim rngMyRange As Range

' A1 is empty - although the outcome is the same in any case
Set rngMyRange = Range("A1")
Set dicMyHash = New Dictionary

dicMyHash.Add Key:=rngMyRange(1), Item:=0

Debug.Print dicMyHash.Exists(rngMyRange(1).Value)   ' returns False
Debug.Print rngMyRange(1) = rngMyRange(1).Value     ' returns True

この動作はやや予想外です。バックグラウンドで型キャストが行われていますか? rngMyRange(1).Valueプロパティは を返しますがvariant、is はrngMyRange(1)です。ただし、にキャストしても同じ結果が得られます。rngMyRange.item(1)rangerngMyRange(1)Variant

また、キーの追加は値によるものです (そのため、 のコピーがrngMyRange(1)キーとして渡されます)。しかし、それでも.Existsキーが見つからない理由がわかりません..

前もって感謝します!

4

3 に答える 3

3

ここでは、3 つの異なる値が渡されます。

  1. 元の範囲。
  2. Range.Value、これはバリアントです。
  3. 辞書の内部にある (1) のコピー。

これらを等号で比較すると、すべて同じです。しかし、Dictionary.Existsそれらによると、すべて異なります。

なんで?オブジェクトで等号を使用すると、等号はオブジェクトに強制的にその既定のプロパティを呼び出します。のデフォルト プロパティはRangeですRange.Value。これが理由r = r.Valueであり、またr = r.Offset(0, 0)です。

しかし、辞書の場合、これはそれほどスマートではありません。考えてみてください:を呼び出すたびに、キーとして使用されるすべてのオブジェクトがそのデフォルト プロパティを呼び出すことにDictionary.Existsなります。これは非常に高価になる可能性があり、多くの副作用を引き起こす可能性があります. 代わりに、以下をテストします。Dictionary.Exists

  1. オブジェクトと非オブジェクトを比較していますか? 自動失敗。
  2. 2 つの非オブジェクトを比較していますか? 戻るa = b
  3. 2 つのオブジェクトを比較していますか? 戻るa Is b

一方はオブジェクトで、もう一方は非オブジェクトであるため、 Sorは と同じではありません。r.Valueまた、 のようにのコピーを作成すると、オブジェクトの内容が同じであっても、それらは 2 つの異なるオブジェクトを指しているため、それらも同じではありません。rr.Offset(0, 0)

一方、これは次のように同じオブジェクトにするため、機能します。rd.Keys(0)

Dim d As Scripting.Dictionary
Dim r As Range
Set r = [a1]
Set d = New Dictionary
d.Add r, 0
Set r = d.Keys(0)
Debug.Print d.Exists(r)
于 2013-05-24T21:12:25.573 に答える
1

あなたの状況の理由はrngMyRange、2 次元配列として認識され、両方の配列次元が辞書に渡されるためだと思います。

Dictionary に要素を追加する行を次のように変更すると、次のようになります。

dicMyHash.Add Key:=rngMyRange(1).value, Item:=0

期待どおりに機能し始めます-両方のチェックポイントが返されtrueます.

Locals Windowコードのデバッグ中に、この状況をさらに分析できます。

于 2013-05-24T20:30:28.380 に答える
0

これをどのように使用しているのかわかりませんが、これは次のように返されTrueます:

Sub test()
Dim dicMyHash As Dictionary
Dim rngMyRange As Range

Set rngMyRange = Range("A1")
Set dicMyHash = New Dictionary

dicMyHash.Add Key:=rngMyRange(1).Value, Item:=0 ' assign it with Value
Debug.Print dicMyHash.Exists(rngMyRange(1).Value)
End Sub

したがって、A1 にあるもののキーを持つアイテムが得られます。

なしでは機能しない理由Valueは、 に を割り当てているRangeからだと思いますKey。Dictionary の Item に範囲を割り当てていれば、私にはもっと理にかなっています。

于 2013-05-24T20:50:58.857 に答える