Excel VBA | ADOで郵便番号検索を高速化するための「インデックス作成・キャッシュ利用」応用例

Excel VBA VBA
スポンサーリンク

大量の郵便番号検索を行う場合、単純に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神奈川県横浜市西区みなとみらい

実務での応用

  • 数万件の顧客リストでも高速処理 → キャッシュ利用で検索速度が劇的に改善
  • 繰り返し検索に強い → 同じ郵便番号を何度も検索しても即応答
  • 地域別集計や配送ラベル作成 → バッチ処理で一括出力可能

💡 この「インデックス+キャッシュ」方式を使えば、大規模データでも郵便番号検索をほぼリアルタイムで処理できます。

VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました