Excel VBA | SQLiteにインデックスを付けてさらに検索を最適化する応用例

VBA
スポンサーリンク

SQLiteは軽量で高速なデータベースですが、郵便番号検索のようにキー検索が多い処理ではインデックスを付けることでさらに最適化できます。
ここでは「郵便番号 → 住所検索」を高速化するために、SQLiteにインデックスを付けて利用する例を紹介します。


インデックス作成SQL

-- 郵便番号テーブルの作成
CREATE TABLE PostalTable (
    PostalCode TEXT PRIMARY KEY,
    Prefecture TEXT,
    City TEXT,
    Town TEXT
);

-- 郵便番号にインデックスを付与(PRIMARY KEYでも検索高速化されるが、補助的に利用可能)
CREATE INDEX idx_postalcode ON PostalTable(PostalCode);
SQL

VBAコード例(SQLite+インデックス検索)

Sub QueryPostalSQLiteWithIndex()
    Dim conn As Object, rs As Object
    Dim dbPath As String, code As String
    
    dbPath = "C:\data\PostalCache.sqlite"
    
    ' SQLite接続(ODBCドライバ利用)
    Set conn = CreateObject("ADODB.Connection")
    conn.Open "Driver=SQLite3 ODBC Driver;Database=" & dbPath & ";"
    
    ' 顧客リストシートから郵便番号を検索
    Dim wsSource As Worksheet, wsResult As Worksheet
    Dim lastRow As Long, i As Long
    
    Set wsSource = ThisWorkbook.Sheets("顧客リスト")
    Set wsResult = ThisWorkbook.Sheets("住所結果")
    
    lastRow = wsSource.Cells(wsSource.Rows.Count, 1).End(xlUp).Row
    
    For i = 2 To lastRow
        code = Replace(wsSource.Cells(i, 1).Value, "-", "")
        
        ' インデックスを利用した検索(SQLiteが自動的に最適化)
        Set rs = conn.Execute("SELECT Prefecture, City, Town FROM PostalTable WHERE PostalCode='" & code & "'")
        
        wsResult.Cells(i, 1).Value = wsSource.Cells(i, 1).Value
        If Not rs.EOF Then
            wsResult.Cells(i, 2).Value = rs.Fields(0).Value ' 都道府県
            wsResult.Cells(i, 3).Value = rs.Fields(1).Value ' 市区町村
            wsResult.Cells(i, 4).Value = rs.Fields(2).Value ' 町域
        Else
            wsResult.Cells(i, 2).Value = "不明"
            wsResult.Cells(i, 3).Value = "不明"
            wsResult.Cells(i, 4).Value = "不明"
        End If
        rs.Close
    Next i
    
    conn.Close
End Sub
VB

実行イメージ

郵便番号都道府県市区町村町域
1000001東京都千代田区千代田
1500002東京都渋谷区渋谷
2200012神奈川県横浜市西区みなとみらい
5300001大阪府大阪市北区梅田
8100003福岡県福岡市博多区博多駅前

実務での応用

  • 大量データでも高速検索 → インデックスにより数万件以上でも即座に検索可能
  • 顧客リストの住所補完 → 郵便番号から住所を一括補完
  • 地域別集計 → 都道府県・市区町村単位で顧客数や売上を分析
  • 配送ラベル作成 → 郵便番号から住所を自動生成

💡 SQLiteにインデックスを付けることで、郵便番号検索をほぼリアルタイムで処理できるようになります。

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