会員名簿や顧客リストの住所を正規化したい場合、Excelを使って郵便番号から住所を調べると簡単だ。手動入力した住所の誤りなどを簡単にチェックできる。その方法を紹介しよう。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
対象:Office 2013/2016/2019/365
会員名簿や顧客リストのような住所を含む表を「Microsoft Excel(エクセル)」で扱う場合、郵便番号から住所の一部を推定できると便利なことも多い。例えば、郵便番号から調べた住所の一部と手動入力した住所を比較することで、間違いを発見できることがある。
また、郵便番号を記載することで都道府県名を省略できるため、入力された住所が省略形になっていることもある。郵便番号は、地域に対して割り振られるため、完全な住所にはなり得ないが、都道府県、市町村などの大きな地域は郵便番号から判定することができる。このため、リストを都道府県別に分類することは可能だ。また、ソフトウェア開発は必要になるが、郵便番号から住所の一部を検索できるようにすれば、住所入力を簡易化することも不可能ではない。
ここでは、日本郵便が公開している郵便番号データを使って、Excelで郵便番号から住所の一部を検索する方法を解説する。また、Excelの新機能であるXLOOKUP関数を取り上げ、合わせて従来のVLOOKUPとの比較を行う。XLOOKUPは、Office 365(サブスクリプション版)で最新のアップデートを適用していれば利用できる。一方、Office 2016など買い切り版では利用できない点に注意してほしい。
なお、Excelには、Office 2007/2010向けに郵便番号変換ウィザードなどが提供されていたことがあったが、既に配布は終了しており、Office 2013以降のバージョンでは利用できない(インターネットにあるMicrosoft以外のダウンロードサイトにあるものは、マルウェアが含まれている可能性が高いので注意)。また、IMEにも郵便番号から住所への変換辞書が含まれることがあるが、後述するように郵便番号に関しては、毎月何らかの更新があり、配布タイミングによっては、旧データを使うことになる可能性がある。
下記の日本郵便のサイトから郵便番号データをダウンロードする。CSV形式ファイルを入手できるので、これをそのままExcelに読み込ませることができる。だが、郵便番号データは、幾つか種類があり、適切なものをダウンロードする必要がある。まずは、この郵便番号データに関して説明しておく。
日本郵便が提供する郵便番号データには、大きく分けて住所用と事業所用の2種類がある。前者は全国の地域に対して割り振られているもので、後者は大量の郵便物を扱う日本郵便が言うところの「大口事業所」に対して割り振られている郵便番号だ。
一般に住所を扱うデータの中には、個人でありながら事業所となる勤務先の住所を登録している可能性や、工場敷地内の寮といった可能性もあるため、原則、両方を検索対象にする必要がある。もちろん処理するデータの中に、事業所の郵便番号が絶対に含まれないというのであれば、住所用の郵便番号データだけを扱うことも可能だ。ただし、ここでは両方を対象としているとして解説を進める。
住所用の郵便番号データは、複数のファイルで提供されている。1つは、読み仮名データの形式の違いである。「読み仮名データの促音・拗音を小書きで表記しないもの」と「読み仮名データの促音・拗音を小書きで表記するもの」である。小書きで表記しない場合は「北海道」の読み仮名が「ホツカイドウ」になり、小書き表記する場合は「ホッカイドウ」になる。
郵便番号データには、住所の読み仮名がローマ字になっているものもある。このために、都合3種類の形式があるのだが、住所の読み仮名を利用しないのであれば、どれを使っても問題はない。ここでは、片仮名を小書きするタイプのファイルを使うと仮定する。
また、住所用は都道府県別と全国のファイルがある。Excelを含め最近のPCでは、サイズの大きな全国のファイルでも問題なく読み込めるため、全国用のものを利用する。事業所用のデータには、地域別ファイルはなく1種類だ。
郵便番号は、毎月、月末頃に更新が行われる(原則平日)。市町村の統廃合など、これまでのところほぼ毎月何らかの更新がある。大口事業所も、一日当たりの郵便量など一定の条件を満たせば、誰でも郵便番号の割り当てを受けられ、逆に条件を満たさなくなれば、割り当てが廃止される。このため、やはり毎月更新が行われているようだ。
この更新には、「新規追加」と「廃止」があり、それぞれ別ファイルになっている。全国の郵便番号データでも1MB程度の容量なので、最新ファイルを全国まとめてダウンロードしてもたいした負荷にはならない。
1つ郵便番号を扱う場合に注意が必要なのは、郵便番号データの保持方式である。郵便番号は先頭に「0(ゼロ)」を持つため、これを数値として保持してしまうと、先頭の「0」がない状態となる。文字列として保持すると、先頭に「0」を持つことが可能になる。
例えば、住所用の全国データ(CSVファイル)に入っている札幌市の郵便番号「0010000」は、数値としてセルに格納すると「10000」となる。Excelは、直接CSVファイルを読み込んだ場合、数値のみからなる文字列は、数値に自動変換するため、郵便番号データにある先頭部分の「0」が全て消える。ただし、読み込み時にファイル拡張子をCSVからTXTに変更すると、読み込み時に「テキストファイルのインポートウィザード」(区切り位置の機能と同じ)が起動され、セルに読み込む前に列が数値なのか文字列なのかを指定することが可能だ。
ただし郵便番号では、先頭の「0」を省略した場合でも、他の郵便番号と一致することはないため、郵便番号を全て数値のまま扱ってもほとんど問題は起きないはずである。ただし、既に入力したデータで郵便番号を文字列として扱っていて、先頭にゼロが入っているような場合、CSVファイルの郵便番号を数値として読み込んでしまうと、比較計算で一致しない可能性がある。郵便番号を数値として扱うか、文字列として扱うかは全てのExcel作業で統一しておいた方がよい。
郵便番号CSVファイルには、ヘッダ部分が含まれておらず、そのフィールド構成は、別途Webページに紹介されている。
簡単にまとめると、住所用の郵便番号データは、下表のようになっている。
# | 列 | 内容 | データ形式 |
---|---|---|---|
1 | A | 該当地域の全国地方公共団体コード | 半角数字(JISX0401、X0402) |
2 | B | (旧)郵便番号(5桁) | 半角数字 |
3 | C | 郵便番号(7桁) | 半角数字 |
4 | D | 都道府県名 | 半角カタカナ |
5 | E | 市区町村名 | 半角カタカナ |
6 | F | 町域名 | 半角カタカナ |
7 | G | 都道府県名 | 漢字 |
8 | H | 市区町村名 | 漢字 |
9 | I | 町域名 | 漢字 |
10 | J | 町域が2つ以上の郵便番号で表される | 「1」は該当、「0」は該当せず |
11 | K | 小字ごとに番地が起番 | 「1」は該当、「0」は該当せず |
12 | L | 丁目を有する町域 | 「1」は該当、「0」は該当せず |
13 | M | 1つの郵便番号で2つ以上の町域を表す | 「1」は該当、「0」は該当せず |
14 | N | 更新の表示 | 「0」は変更なし、「1」は変更あり、「2」廃止 |
15 | O | 変更理由 | 「0」は変更なし、「1」は市政・区政・町政・分区・政令指定都市施行、「2」は住居表示の実施、「3」は区画整理、「4」は郵便区調整等、「5」は訂正、「6」は廃止(廃止データのみ使用) |
住所用の郵便番号データのフォーマット |
また事業所用の郵便番号データは、下表のようになっている。
# | 列 | 内容 | データ形式 |
---|---|---|---|
1 | A | 該当地域の全国地方公共団体コード | JISX0401、X0402/半角数字 |
2 | B | 大口事業所名(カナ) | 半角カタカナ |
3 | C | 大口事業所名(漢字) | 漢字 |
4 | D | 都道府県名(漢字) | 漢字 |
5 | E | 市区町村名(漢字) | 漢字 |
6 | F | 町域名(漢字) | 漢字 |
7 | G | 小字名、丁目、番地など(漢字) | 漢字 |
8 | H | 郵便番号(大口事業所個別番号) | 半角数字 |
9 | I | 旧郵便番号 | 半角数字 |
10 | J | 取扱局 | 漢字 |
11 | K | 個別番号の種別の表示 | 「0」大口事業所、「1」私書箱 |
12 | L | 複数番号の有無 | 「0」複数番号無し、「1」複数番号を設定している場合の個別番号の1、「2」複数番号を設定している場合の個別番号の2、「3」複数番号を設定している場合の個別番号の3 |
13 | M | 修正コード(1byte) | 「0」修正なし、「1」新規追加、「5」廃止 |
事業所用の郵便番号データのフォーマット |
郵便番号データでは、現在の郵便番号は3列目、都道府県の漢字表記は7列目である。また、10列目以降は、同一の町域に複数の郵便番号がある、1つの郵便番号が複数の町域に対応するなどの特殊な条件を示す論理値(「1」が「True」、「0」が「False」)になっている。都道府県レベルの処理ならば気にする必要はないが、住所を細かく見ていく場合には、これらのフラグの値にも注意する必要がある。郵便番号から住所を調べる場合に特に注意するのは、下表の3点だ。
列 | 注意点 |
---|---|
11列 | 小字ごとに番地が起番されている町域 |
12列 | 丁目を有する町域の場合 |
13列 | 1つの郵便番号で2以上の町域を表す場合 |
郵便番号から住所を調べる際に注意する |
これらは、郵便番号から調べることができる町域以下に複数の住所名が含まれていることを示す。住所の照合を行うような場合には、このフラグを見て、複数の候補を見つける必要がある。また、事業所データの構造では、7桁郵便番号よりも前の列(列番号の小さい側。PC画面のExcelウィンドウを見たときには左側。以下同様)に住所や事業所名などがあるため、VLOOKUPを使うならば郵便番号の列が住所などより前の列になるように移動させる必要がある(VLOOKUP関数の使い方については、Tech TIPS「ExcelのVLOOKUP関数の最も簡単な使い方」参照のこと)。
まずは、どのバージョンのExcelでも利用できるVLOOOKUP関数を使って、郵便番号から都道府県を検索させてみる。例としては都道府県だが、結果列の位置を変更することで、他の情報も取り出せる。
事前準備として、日本郵便のサイトからデータをダウンロードして、Excelに読み込ませ、XLSXファイルとして保存しておく。XLSX形式とすることで、次回以降の読み込みを高速化できる。これを「YUBIN.xlsx」とする。保存場所は、適当で構わないが、Excelは外部参照を絶対パスで記憶するため、できれば、郵便番号検索を利用するブックと同じフォルダがよい。
また、前述のように郵便番号データは毎月更新されるものであるため、処理対象のデータとは別のブックファイルにしておいた方が取り扱いはラクになり、複数のブックで行う作業で、郵便番号データを共有して同じ数式を利用できる。
郵便番号データをExcelに読み込ませたら、参照を簡略化するため列Cから列Oまでを選択し、「zip_addr」という名前を定義しておく(セルの範囲に名前を定義する方法は、Tech TIPS「Excelの『名前の定義』でセルの範囲に名前を付ける」参照のこと)。このようにすることで後からの参照が楽になる。
同じようにC列に「zip」、G列に「prf」、H列に「city」などの名前を付けておくとよい。名前を付けるのは必須ではないが、後で参照するときにシート名が入るため、セル範囲のままだと名前が煩雑になることと、「C」や「D」といった列の番号では、対象データが分かりにくく、エラーのときに対処が面倒になる。LOOKUP系のコマンドを使う場合や、他のブックから参照される場合には、名前を付けておくと引数が分かりやすくなる。
全国データのみを使って、郵便番号から都道府県を調べてみる。検索対象のデータは、「TEST.xlsx」に入っているとする(前述の「YUBIN.xlsx」は開いたままにしておく)。このとき郵便番号は、「C列」にあるとする。なお、この「TEST.xlsx」と前述の「YUBIN.xlsx」は同じフォルダに置いた方がよい。
セル「D2」に都道府県を表示させるには、以下のような数式を使う。最初の引数が「$C2」と列のみ絶対参照になっているのは、このあと右側のセルに数式をオートフィルなどでコピーして市区町村などの住所などを検索させることを想定している。このようにするとオートフィルで右側のセルに数式をコピーしたときに同じセルを検索対象のままにすることができる。
=VLOOKUP($C2,YUBIN.xlsx!zip_addr,5,FALSE)
後は、必要に応じてセル「D2」と同じ数式を下にコピーすれば、都道府県を検索できる。なお、「行5」と「行6」が「#N/A」となっているのは、ここに事業所用の郵便番号が入っていたため、住宅用の郵便番号データから住所を探すことができなかったためだ。これについては後で対処する。
同じものをXLOOKUP関数で記述してみよう。
=XLOOKUP($C2,YUBIN.xlsx!zip,YUBIN.xlsx!prf)
同じように名前を使った。この例では、VLOOKUP関数もXLOOKUP関数もそうそう大きな違いはない。
どちらの場合でも、調査対象の郵便番号に事業所が含まれていると、結果は「#N/A」エラーになってしまう。ただしXLOOKUPの場合には、見つからなかった場合に返す文字列を4番目の引数で指定できる。後で、エラーになった行をフィルターで抜き出すような場合は、適当な文字列を指定しておくと便利だ。
=XLOOKUP($C2,YUBIN.xlsx!zip,YUBIN.xlsx!prf,,"No DATA")
なお、XLOOKUPに関しては、以下にヘルプページがある。
結果を「#N/A」エラーにしないためには、全国データで検索ができなかったら、事業所データの検索結果を返すようにすればよい。そこで、次に事業所に対応しよう。まずは、CSVファイルをExcelで読み込む。読み込んだら、ワークシートを先ほどの郵便番号ブック(YUBIN.xlsx)にコピー(または移動)する。
ワークシートのコピーは、コピーしたいワークシートを選択した状態で、[ホーム]タブの[セル]グループにある[書式]−[シートの移動またはコピー]で行う。キーボードショートカットを使うのであれば、[Alt]+[H]キーに続けて、[O]キー、[M]キーを押す。
これで「シートの移動またはコピー」ダイアログが開く。マウスを使う場合には、シートタブの上で右クリックするとメニューに同項目が表示される。ダイアログでは、「移動先ブック名」で「YUBIN.xlsx」を選び、挿入先は「(末尾へ移動)」を選ぶ。[コピーを作成する]をチェックするとコピー、しなければワークシートが移動する。これでYUBIN.xlsxに「JIGYOSYO」ワークシートタブが追加されたはずだ。1つのブックにまとめたのは、両方を同時に検索に利用するため、複数のブックに分かれていると、開くのが面倒になるからだ。
では、XLOOKUPで事業所データをアクセスしてみる。
=XLOOKUP($C2,[YUBIN.xlsx]JIGYOSYO!$H:$H,[YUBIN.xlsx]JIGYOSYO!$D:$D)
2つ目、3つ目の引数が少々ややこしいが、YUBIN.xlsxの「JIGYOSYO」ワークシートタブにある「H列」と「D列」を表している。そこで、YUBIN.xlsxの「JIGYOSYO」ワークシートタブにある「H列」と「D列」にそれぞれ、「jzip」「jprf」という名前を付ける。そうすると、上記の式は、以下のように簡略化できる。
=XLOOKUP($C2,YUBIN.xlsx!jzip,YUBIN.xlsx!jprf)
事業所用の検索が可能になるなら、先ほどの郵便番号データの検索とIF関数で組み合わせることで両方の検索を行わせることができる。
=IF(ISNA(XLOOKUP($C2,YUBIN.xlsx!zip,YUBIN.xlsx!prf)),XLOOKUP($C2,YUBIN.xlsx!jzip,YUBIN.xlsx!jprf),XLOOKUP($C2,YUBIN.xlsx!zip,YUBIN.xlsx!prf))
さて、同じことをVLOOKUP関数で行う場合、どうしても「JIGYOSHO」データの列を入れ替える必要がある。そこで、既に作成した「JIGYOSYO」ワークシートタブをコピーして、VLOOKUP関数用の事業所データを作る。そのタブ名は「V-JIGYOSYO」とする。シートタブのコピーには、前述の「シートの移動またはコピー」が利用できる。シートタブを作成したら、タブの名前を変更後、「列H」を「列B」の位置へ移動させる。その後、「列B」〜「列H」までを選択し、「zip_jigyosho」と名前を付ける。この状態で、以下のVLOOKUP関数で、事業所データ内の検索が可能になる。
=VLOOKUP($C2,YUBIN.xlsx!zip_jigyosho,3,FALSE)
このようにVLOOKUP関数では、検索列を必ず結果列より前の列にする必要があり、場合によっては、対象データの列を移動させなければならない。この点、XLOOKUP関数は、対象データの構造がどうなっていても、そのままで検索を行える。この差は大きい。
郵便番号データでいえば、毎月のように更新が行われるため、作業頻度にもよるが、最悪、毎月データを更新しなければならない。このとき、列の入れ替え作業があるとないとでは大きな違いだ。
Excelの「名前」は、その範囲に値を貼り付けても位置としてはそのまま残る。このため、YUBIN.xlsxを更新するとき、列の入れ替えがなければ、CSVファイルをExcelで開いて、[Ctrl]+[A]キーで表全部を選択した後にコピーしてYUBIN.xlsxに貼り付ける形でデータを更新できる。
しかし、列が入れ替わっている場合には、単純なコピー&ペーストではデータを更新できない。このあたりになると、VBAでスクリプトを作るかどうかというレベルの話になってしまう。
なお、更新は面倒になるが、2つのワークシートで、同様の項目を保持する列位置を合わせて1つの表にしてしまうことも不可能ではない。ただし、VLOOKUPを使うときと同様、大口事業所データはつなげる前に列を入れ替えておく必要がある。そして、買い切り版のOffice 2016などでXLOOKUPが利用できない場合は、どちらにしても列の組み替えは必要になる。だとしたら、表を1つにまとめてしまってもいいだろう。
今回は評価できなかったが、XLOOKUP関数では、検索対象データがソートされている場合、バイナリサーチを使って高速な検索が可能になる。数万件の郵便番号など検索件数が多い場合、その再計算時間が問題になることもあるだろう。
Copyright© Digital Advantage Corp. All Rights Reserved.