辞書(連想配列)に0から始まる数値を登録する際の注意点

商品名を管理するコードがある。仮に今は、6桁の数字だとしよう。
このコードは、管理の都合上、ゼロパディングされている。
例)

  • 12345 ⇒ 012345
  • 123  ⇒ 000123

このように6桁に満たない数字は、6桁になるよう先頭に0を付される。
ゼロパディング ⇔ ゼロサプレス

今日は、この値を辞書(連想配列)で扱う際に起きた出来事から抜粋。
f:id:Infoment:20190226221237p:plain

例えば、こんな表があるとする。
f:id:Infoment:20190226221322p:plain


コードは、書式設定で6桁になっている。
f:id:Infoment:20190226221423p:plain


これを単純に辞書に登録すると、こうなる。

Sub Test()
    Dim Dict As Dictionary
    Set Dict = New Dictionary
        Dict(Range("A2").Value) = Range("B2").Value
        
        MsgBox Dict("012345")
End Sub

結果は、この通り。
f:id:Infoment:20190226221624p:plain


そりゃ、そうだ。「012345」に見せているだけで、中身は「12345」なのだから。
では、「.Text」で表示された通りの値を取得したらどうだろう。

Sub Test()
    Dim Dict As Dictionary
    Set Dict = New Dictionary
        Dict(Range("A2").Text) = Range("B2").Value
        
        MsgBox Dict("012345")
End Sub

上手く認識してくれたようだ。
f:id:Infoment:20190226221926p:plain


そこで、関数にしてみた。

Function ProductName(code As String) As String
    Dim Dict As Dictionary
    Set Dict = New Dictionary
        Dict(Range("A2").Text) = Range("B2").Value
        
        Test = Dict(code)
End Function

ところが、このユーザー定義関数をシート上で使用すると、上手くいかない。
f:id:Infoment:20190226222824p:plain


引数の型を文字列(String)にしても、受け取った際にゼロサプレスしてから文字にするため、キーと一致しないらしい。
f:id:Infoment:20190226223019p:plain


使う側にしてみれば、そのような事情に興味はない。単純に、コードが入ったセルを指定したいところだ。

ということで、受け取ったコードを一旦数値に変換し、頭に0を付してから文字列に戻してみた。

Function ProductName(code As String) As String
    Dim Dict As Dictionary
    Set Dict = New Dictionary
        Dict(Range("A2").Text) = Range("B2").Value
        
        code = CStr(Format(CInt(code), "000000"))
        ProductName = Dict(code)
End Function

f:id:Infoment:20190226223404p:plain

一応、目的の結果を得ることが出来たわけだが・・・果てしなく面倒くさい。ならば、最初からセルの書式設定を文字列にしたうえで「012345」と入力しても問題は解決する。しかし個人的には、↓ これがあまり好きではない。
f:id:Infoment:20190226224522p:plain
最初の一文字が0でなければ、もっとずっと単純になるのに。


ということで、何かコード管理する場合があって、そのコードが数値のみで構成されている場合は、無意で構わないので0以外の数値を頭に付した方がよさそうだ。こんな感じで。
f:id:Infoment:20190226223903p:plain

「どうして1000001から始まるの?」
「その方が、都合がいいから」

きっと世界中のどこかで、今もこんな会話が交わされているに違いない(憶測)。

参考まで。