大量の郵便番号検索を行う場合、単純にCSVへ毎回SQLを投げると処理が遅くなります。
そこで インデックス的な仕組み と キャッシュ利用 を組み合わせることで、検索速度を大幅に改善できます。
コード例(キャッシュ+インデックス風利用)
Option Explicit
' 郵便番号検索をキャッシュするDictionary
Dim postalCache As Object
Sub InitPostalCache()
Dim conn As Object, rs As Object
Dim filePath As String
filePath = "C:\data\KEN_ALL.CSV"
' キャッシュ用Dictionaryを初期化
Set postalCache = CreateObject("Scripting.Dictionary")
' 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"""
' 郵便番号と住所を全件読み込み(インデックス的に保持)
Set rs = conn.Execute("SELECT F3, F6, F7, F8 FROM [" & Mid(filePath, InStrRev(filePath, "\") + 1) & "]")
Do Until rs.EOF
Dim code As String
code = Replace(rs.Fields(0).Value, "-", "")
If Not postalCache.Exists(code) Then
postalCache.Add code, Array(rs.Fields(1).Value, rs.Fields(2).Value, rs.Fields(3).Value)
End If
rs.MoveNext
Loop
rs.Close
conn.Close
End Sub
Function GetAddressByPostalCode(code As String) As String
code = Replace(code, "-", "")
If postalCache.Exists(code) Then
Dim addrParts As Variant
addrParts = postalCache(code)
GetAddressByPostalCode = addrParts(0) & addrParts(1) & addrParts(2)
Else
GetAddressByPostalCode = "不明"
End If
End Function
Sub BatchPostalLookup()
Dim wsSource As Worksheet, wsResult As Worksheet
Dim lastRow As Long, i As Long
' キャッシュ初期化(最初に一度だけ)
If postalCache Is Nothing Then InitPostalCache
Set wsSource = ThisWorkbook.Sheets("顧客リスト")
Set wsResult = ThisWorkbook.Sheets("住所結果")
lastRow = wsSource.Cells(wsSource.Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
wsResult.Cells(i, 1).Value = wsSource.Cells(i, 1).Value
wsResult.Cells(i, 2).Value = GetAddressByPostalCode(wsSource.Cells(i, 1).Value)
Next i
End Sub
VB解説
- キャッシュ(Dictionary)
- 郵便番号をキーに住所(都道府県+市区町村+町域)を保持
- 一度読み込めば以降はメモリ検索で高速処理
- インデックス的利用
- 郵便番号をキーにしたハッシュ検索 → 実質インデックスと同じ効果
GetAddressByPostalCode- 郵便番号を渡すと即座に住所を返す関数
実行イメージ
顧客リストシート(入力)
| 郵便番号 |
|---|
| 100-0001 |
| 1500002 |
| 2200012 |
住所結果シート(出力)
| 郵便番号 | 住所 |
|---|---|
| 100-0001 | 東京都千代田区千代田 |
| 1500002 | 東京都渋谷区渋谷 |
| 2200012 | 神奈川県横浜市西区みなとみらい |
実務での応用
- 数万件の顧客リストでも高速処理 → キャッシュ利用で検索速度が劇的に改善
- 繰り返し検索に強い → 同じ郵便番号を何度も検索しても即応答
- 地域別集計や配送ラベル作成 → バッチ処理で一括出力可能
💡 この「インデックス+キャッシュ」方式を使えば、大規模データでも郵便番号検索をほぼリアルタイムで処理できます。


