日本郵便が公開している KEN_ALL.CSV(全国郵便番号簿)を利用すれば、郵便番号から 都道府県・市区町村・町域 を正確に判定できます。
ADO(ActiveX Data Objects)を使うと、CSVを「テーブル」として高速に検索できるため、大量データでも効率的に処理可能です。
コード例(ADO+郵便番号→住所3分割)
Sub PostalCodeToFullAddressWithADO()
Dim conn As Object, rs As Object
Dim filePath As String, code As String
' CSVファイルのパス(日本郵便公式のKEN_ALL.CSVをダウンロードして指定)
filePath = "C:\data\KEN_ALL.CSV"
' ADO接続を作成
Set conn = CreateObject("ADODB.Connection")
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Left(filePath, InStrRev(filePath, "\")) & ";" & _
"Extended Properties=""text;HDR=No;FMT=Delimited"""
' A列の郵便番号を判定してB〜D列に住所を出力
Dim lastRow As Long, i As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To lastRow
code = Replace(Cells(i, 1).Value, "-", "") ' ハイフン削除
' SQLで郵便番号を検索(KEN_ALL.CSVの仕様)
' fields(2)=郵便番号, fields(6)=都道府県, fields(7)=市区町村, fields(8)=町域
Set rs = conn.Execute("SELECT F6, F7, F8 FROM [" & Mid(filePath, InStrRev(filePath, "\") + 1) & "] WHERE F3='" & code & "'")
If Not rs.EOF Then
Cells(i, 2).Value = rs.Fields(0).Value ' 都道府県
Cells(i, 3).Value = rs.Fields(1).Value ' 市区町村
Cells(i, 4).Value = rs.Fields(2).Value ' 町域
Else
Cells(i, 2).Value = "不明"
Cells(i, 3).Value = "不明"
Cells(i, 4).Value = "不明"
End If
rs.Close
Next i
conn.Close
End Sub
VB解説
- KEN_ALL.CSVの仕様
F3→ 郵便番号F6→ 都道府県名F7→ 市区町村名F8→ 町域名
- ADO接続 → CSVをSQLで検索できるため高速
- 郵便番号を正規化 → ハイフン削除、7桁に統一
- 結果をB〜D列に出力 → 都道府県・市区町村・町域を分割して保存
実行イメージ
| A列(郵便番号) | B列(都道府県) | C列(市区町村) | D列(町域) |
|---|---|---|---|
| 1000001 | 東京都 | 千代田区 | 千代田 |
| 1500002 | 東京都 | 渋谷区 | 渋谷 |
| 2200012 | 神奈川県 | 横浜市西区 | みなとみらい |
| 5300001 | 大阪府 | 大阪市北区 | 梅田 |
| 8100003 | 福岡県 | 福岡市博多区 | 博多駅前 |
実務での応用
- 顧客リストの郵便番号から住所を一括補完
- 配送ラベル作成 → 郵便番号から住所を自動生成
- 地域別集計 → 都道府県・市区町村・町域単位で顧客数や売上を分析
- 不正データ検出 → 存在しない郵便番号を「不明」として抽出
💡 この「ADO+郵便番号辞書」の完全版を使えば、全国規模の顧客データを高速に住所補完・分割できます。


