Excel VBA | キャッシュをファイルに保存して再利用する応用例

Excel VBA VBA
スポンサーリンク

大量の郵便番号データを扱う場合、毎回CSVを読み込むのは非効率です。
そこで キャッシュをファイルに保存して再利用 すれば、次回以降は高速に検索できます。
ここでは VBA を使って Dictionaryキャッシュをテキストファイルに保存/読み込みする例を紹介します。


コード例(キャッシュ保存+再利用)

Option Explicit

Dim postalCache As Object

' キャッシュを初期化(ファイルから読み込み)
Sub LoadPostalCache()
    Dim fso As Object, ts As Object, line As String, parts As Variant
    
    Set postalCache = CreateObject("Scripting.Dictionary")
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    ' キャッシュファイルが存在する場合は読み込み
    If fso.FileExists("C:\data\PostalCache.txt") Then
        Set ts = fso.OpenTextFile("C:\data\PostalCache.txt", 1, False)
        Do Until ts.AtEndOfStream
            line = ts.ReadLine
            parts = Split(line, "|")
            If UBound(parts) >= 3 Then
                postalCache(parts(0)) = Array(parts(1), parts(2), parts(3))
            End If
        Loop
        ts.Close
    End If
End Sub

' キャッシュをファイルに保存
Sub SavePostalCache()
    Dim fso As Object, ts As Object, key As Variant, addrParts As Variant
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.OpenTextFile("C:\data\PostalCache.txt", 2, True)
    
    For Each key In postalCache.Keys
        addrParts = postalCache(key)
        ts.WriteLine key & "|" & addrParts(0) & "|" & addrParts(1) & "|" & addrParts(2)
    Next key
    
    ts.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 LoadPostalCache
    
    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
    
    ' 更新されたキャッシュを保存
    SavePostalCache
End Sub
VB

解説

  • キャッシュファイル形式郵便番号|都道府県|市区町村|町域 のテキスト形式
  • LoadPostalCache → ファイルからキャッシュを読み込む
  • SavePostalCache → Dictionaryをファイルに保存
  • GetAddressByPostalCode → 郵便番号をキーに住所を返す
  • BatchPostalLookup → 顧客リストを一括処理し、結果を別シートに出力

実行イメージ

PostalCache.txt(保存ファイル)

1000001|東京都|千代田区|千代田
1500002|東京都|渋谷区|渋谷
2200012|神奈川県|横浜市西区|みなとみらい

住所結果シート(出力)

郵便番号住所
100-0001東京都千代田区千代田
1500002東京都渋谷区渋谷
2200012神奈川県横浜市西区みなとみらい

実務での応用

  • 初回のみCSVを読み込み、以降はキャッシュファイルを利用 → 高速化
  • キャッシュファイルを共有 → チーム全員で同じ住所辞書を利用可能
  • 定期更新 → 日本郵便の最新CSVを読み込んでキャッシュを更新

💡 この方法を使えば「郵便番号検索を高速化しつつ、再利用可能なキャッシュ」を構築できます。

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