連想配列のキーの型に関する失敗談

今回は、連想配列のキーに関する失敗談。
f:id:Infoment:20210814141327p:plain

以前、こんな処理を行ったことがある。

  1. 業務システムからExcelファイル①を出力。
  2. ①のコード列をキーに、品名をアイテムとして連想配列を作成。
  3. 別のExcelファイル②のコードを取得し、連想配列に存在する場合は
    ②の品名列にアイテムをセット。

f:id:Infoment:20210814142231p:plain

簡単のため、今回は表①と②をテーブル化したうえで再現してみた。

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

しかし結果、表②には何もセットされなかった。理由は至ってシンプルで、

  • 表①のコード:文字列
  • 表②のコード:数値

だったわけで。見た目は同じでも、連想配列は別物として認識してしまう。
出力されたものの型を意識しなかったために起きた失敗だった。

結局この時は、表②側のコードを文字列に変換することで事なきを得た。
f:id:Infoment:20210814144310p:plain
f:id:Infoment:20210814144339p:plain

ということで今日は「キーの型を意識しよう」というお話。

参考まで。