Excelで郵便番号を入力したら、自動で住所(都道府県・市区町村・町域)を表示したい。そんな業務はとても多いですよね。
そこで本記事では、日本郵便が公開している郵便番号データベース(CSV) を使い、 郵便番号から住所を検索する ExcelVBA マクロをご紹介します。
名簿作成、顧客管理、帳票入力など、 あらゆる事務作業に役立つ実用的なマクロです。
また別の記事で、住所から都道府県だけを自動抽出するマクロを紹介しています。
こちらもぜひご覧ください。

目次
1. 郵便番号データの入手方法
日本郵便公式ページから無料でダウンロードできます。
ダウンロード後、ZIP を解凍すると KEN_ALL.CSV(全国版)が入っています。
KEN_ALL.CSV の構造
1列目:全国地方公共団体コード
2列目:旧郵便番号
3列目:郵便番号(7桁)
4列目:都道府県名
5列目:市区町村名
6列目:町域名
…(以下略)

今回使うのは、 郵便番号、都道府県、市区町村、町域 の4つです。
2. Excelシートの準備
次のようなシートを用意します。
①「住所検索」シート(メイン画面)
シート名を「住所検索」に変更して、A列に郵便番号を入力してください。B列にはマクロで住所が自動反映されますので、B1だけに「住所(自動)」と入力してください。

②「KEN_ALL」シート(住所DB)
KEN_ALL.CSV をこのシートに貼り付けます。

データが数十万行ありますが、VBAなら高速検索できます。
3. 郵便番号→住所検索マクロ(コピペOK)
以下を標準モジュールに貼り付けます。

Option Explicit
' 郵便番号(7桁)から住所を検索する関数
Function GetAddressFromPostcode(postcode As String) As String
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim pc As String
Dim pref As String, city As String, town As String
Set ws = Worksheets("KEN_ALL")
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
' 郵便番号の桁調整(例:1000001 → "1000001")
postcode = Replace(postcode, "-", "")
If Len(postcode) <> 7 Then Exit Function
For i = 1 To lastRow
pc = CStr(ws.Cells(i, 3).Value)
If pc = postcode Then
pref = ws.Cells(i, 7).Value
city = ws.Cells(i, 8).Value
town = ws.Cells(i, 9).Value
GetAddressFromPostcode = pref & city & town
Exit Function
End If
Next i
End Function
' メイン処理:A列の郵便番号からB列へ住所を反映
Sub FillAddress()
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim postcode As String
Set ws = Worksheets("住所検索")
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
postcode = CStr(ws.Cells(i, 1).Value)
ws.Cells(i, 2).Value = GetAddressFromPostcode(postcode)
Next i
MsgBox "住所検索が完了しました!", vbInformation
End Sub
4. コード解説
① CSV の住所データを Excel に貼るだけで利用可能
プログラム内に住所データを埋め込まず、 日本郵便提供の CSV をそのまま使えるのでメンテナンスが簡単です。
② 郵便番号の 7 桁一致で検索
If pc = postcode Then
郵便番号は重複しないため、 1件一致したら即終了で高速です。
③ 関数化して再利用しやすく
Function GetAddressFromPostcode()
他のVBA処理からも呼び出し可能で、拡張性が高い構造にしています。
④ ハイフン付きにも対応
postcode = Replace(postcode, "-", "")
「100-0001」でも問題なく検索できます。
5. 応用テクニック
① 住所を「都道府県/市区町村/町域」に分けて書き込む
下記のようにすると、列ごとに書き分けられます。
※表示列は変更されている場合がありますので、都度適切な列番号を設定ください。
Cells(i, 7).Value = pref
Cells(i, 8).Value = city
Cells(i, 9).Value = town
② 複数一致する場合の処理(町域が複雑な地域)
北海道・沖縄などで町域が複数パターンある場合に備えて、 候補を一覧で返す関数も作れます。
③ 入力時に自動変換(Worksheet_Change でリアルタイム処理)
郵便番号を入力した瞬間に住所が出るようにできます。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
Target.Offset(0, 1).Value = GetAddressFromPostcode(Target.Value)
End If
End Sub
6. 実行方法
- 日本郵便サイトから KEN_ALL.CSV をダウンロード
- Excel の「郵便番号DB」シートに CSV の内容を貼り付け
- 標準モジュールにマクロを貼り付け
- 「住所検索」シートの A 列に郵便番号を入力
- FillAddress マクロを実行
これだけで、郵便番号から住所を自動検索できるシステムが完成します。
まとめ:VBAなら住所検索が一瞬でできる
今回紹介した「郵便番号→住所検索マクロ」は、 以下のような使い方に最適です。
- 名簿入力の効率化
- 請求書・発送伝票作成
- 顧客データの住所補完
- システムへの住所入力補助
日本郵便の公式データを使うので精度が高く、 毎月更新されても簡単に差し替えできる柔軟な仕組みです。
さらに「逆引き検索(住所→郵便番号)」や 「市区町村ごとの自動分類」なども実装できますので、 必要であれば別記事で解説します!


コメント