連想配列のキーの型に関する失敗談
今回は、連想配列のキーに関する失敗談。
以前、こんな処理を行ったことがある。
- 業務システムからExcelファイル①を出力。
- ①のコード列をキーに、品名をアイテムとして連想配列を作成。
- 別のExcelファイル②のコードを取得し、連想配列に存在する場合は
②の品名列にアイテムをセット。
簡単のため、今回は表①と②をテーブル化したうえで再現してみた。
Sub DictionaryTest() Dim Dict As Object Set Dict = CreateObject("Scripting.Dictionary") Dim ListRow As Excel.ListRow ' ①から辞書作成。 For Each ListRow In ActiveSheet.ListObjects(1).ListRows With ListRow Dict(.Range(1).Value) = .Range(2).Value End With Next ' ②へ値セット。 For Each ListRow In ActiveSheet.ListObjects(2).ListRows With ListRow If Dict.Exists(.Range(1).Value) Then .Range(2).Value = Dict(.Range(1).Value) End If End With Next End Sub
しかし結果、表②には何もセットされなかった。理由は至ってシンプルで、
- 表①のコード:文字列
- 表②のコード:数値
だったわけで。見た目は同じでも、連想配列は別物として認識してしまう。
出力されたものの型を意識しなかったために起きた失敗だった。
結局この時は、表②側のコードを文字列に変換することで事なきを得た。
ということで今日は「キーの型を意識しよう」というお話。
参考まで。