私は先日StackOverflowでこの答えに出くわし、それに注意を向けたいと思いました(私の強調):
「不足している」キーのアイテムを返そうとした時計を持っていたときに、デバッグ中にこの問題が明らかになりました。 。実際、私が文字通り[scriptingdictonaryObject] .exists()condtionalを監視していたとき、さらにイライラしたデバッグでも同じ問題が発生しました。 時計のために「不足している」キーを追加することをお勧めします 。時計を取り外し、代わりに実行中に配列をコピーするための一時的なワークシートを作成すると、不要なキーは追加されなくなりました。.add()が呼び出される前にアイテムを追加するディクショナリオブジェクトMS Scripting Runtimeライブラリのディクショナリオブジェクトを使用して、一連の配列を格納し、必要に応じて配列セルに対して操作を実行しています。プロセスを通過するためのforループがあります... スタックオーバーフローriddley_w
ここで何が起こっているのですか?
辞書オブジェクトの「機能」の1つは、暗黙的に実行されることです。 .Addメソッドを呼び出す必要なしに新しいアイテムを作成します明示的に 。暗黙的と明示的の違いは何ですか?
注:Dictionaryオブジェクトを早期に使用するには、「Microsoft ScriptingRuntime」への参照が必要です(詳細はこちら)。
Dim MyDict As New Dictionary
'Explicit add
MyDict.Add "KeyA", "Item A"
'Implicit add
MyDict.Item("KeyB") = "Item B"
Debug.Print MyDict("KeyA"); vbNewLine; MyDict("KeyB")
暗黙的に関するドキュメントの関連部分は次のとおりです。 キーの作成:
備考
キーの場合 アイテムを変更しても見つかりません 、新しいキー 指定されたnewitemで作成されます 。 キーの場合 既存のアイテム、新しいキーを返そうとしたときに、が見つかりません が作成され、対応するアイテムは空のままになります。
問題を再現して、物事が横向きになっている場所を正確に確認しましょう。
次のサンプルルーチンを作成します。
Sub WatchOut()
Dim MyDict As Dictionary
Set MyDict = New Dictionary
Debug.Print "KeyA exists? "; MyDict.Exists("KeyA")
End Sub
上記のルーチンをイミディエイトウィンドウから実行すると、Falseが返されます:
WatchOut
KeyA exists? False
それでは、「KeyA」アイテムの時計を追加しましょう:
ウォッチアウトを実行してみましょう 再びルーチン:
WatchOut
KeyA exists? False
ここまでは順調ですね。結局、これは問題ではないかもしれません。
停止を追加しましょう コードを強制的に中断するステートメント:
Sub WatchOut()
Dim MyDict As Dictionary
Set MyDict = New Dictionary
Stop
Debug.Print "KeyA exists? "; MyDict.Exists("KeyA")
End Sub
それでは、ウォッチアウトを実行してみましょう ルーチン:
WatchOut
KeyA exists? True
あはは!ウォッチとデバッガーへの侵入の組み合わせは、「バグ」を強制的に表示するのに十分です。 バグを入れました デバッガーで実際に予想される動作であるため、皮肉の引用符で囲みます。しかし、それは開発者にとってほぼ間違いなく予期しない動作です。
(停止について特別なことは何もないことに注意してください この動作を引き起こすコマンド。 停止を削除できます コードにブレークポイントを設定して行えば、同じ動作が発生します。)
この種のことがデバッグ中に髪の毛を抜く原因となる可能性がある場所を確認できます。通常の実行中とデバッグ中のプログラムの動作が異なる場合はいつでも、1つの悪化するデバッグセッションが発生します。
問題を再現する手順:
- 特定の辞書アイテムのウォッチを作成する
- コードの実行中にデバッガーに侵入します
これはおそらく1人か2人の開発者だけを助けるでしょう。ただし、開発者の時間を節約できる可能性があります。 欲求不満の。そして、私が正直なところ、私は誰よりもそれらの開発者の1人である可能性が高いです;-)