辞書(連想配列)に0から始まる数値を登録する際の注意点
商品名を管理するコードがある。仮に今は、6桁の数字だとしよう。
このコードは、管理の都合上、ゼロパディングされている。
例)
- 12345 ⇒ 012345
- 123 ⇒ 000123
このように6桁に満たない数字は、6桁になるよう先頭に0を付される。
※ゼロパディング ⇔ ゼロサプレス
今日は、この値を辞書(連想配列)で扱う際に起きた出来事から抜粋。
例えば、こんな表があるとする。
コードは、書式設定で6桁になっている。
これを単純に辞書に登録すると、こうなる。
Sub Test() Dim Dict As Dictionary Set Dict = New Dictionary Dict(Range("A2").Value) = Range("B2").Value MsgBox Dict("012345") End Sub
結果は、この通り。
そりゃ、そうだ。「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
上手く認識してくれたようだ。
そこで、関数にしてみた。
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
ところが、このユーザー定義関数をシート上で使用すると、上手くいかない。
引数の型を文字列(String)にしても、受け取った際にゼロサプレスしてから文字にするため、キーと一致しないらしい。
使う側にしてみれば、そのような事情に興味はない。単純に、コードが入ったセルを指定したいところだ。
ということで、受け取ったコードを一旦数値に変換し、頭に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
一応、目的の結果を得ることが出来たわけだが・・・果てしなく面倒くさい。ならば、最初からセルの書式設定を文字列にしたうえで「012345」と入力しても問題は解決する。しかし個人的には、↓ これがあまり好きではない。
最初の一文字が0でなければ、もっとずっと単純になるのに。
ということで、何かコード管理する場合があって、そのコードが数値のみで構成されている場合は、無意で構わないので0以外の数値を頭に付した方がよさそうだ。こんな感じで。
「どうして1000001から始まるの?」
「その方が、都合がいいから」
きっと世界中のどこかで、今もこんな会話が交わされているに違いない(憶測)。
参考まで。