Excel VBA | SQLite FTSでLIMIT+OFFSETを使ってページング検索を行う応用例

VBA
スポンサーリンク

SQLiteの FTS(Full-Text Search) では、検索結果に対して LIMITOFFSET を組み合わせることで ページング検索 が可能です。
これにより「検索結果を10件ずつ表示」「次ページを取得」など、ユーザーインターフェースに適した検索ができます。


FTSテーブル作成例

-- FTS5を利用した住所検索用テーブル
CREATE VIRTUAL TABLE PostalFTS USING fts5(
    PostalCode,
    Prefecture,
    City,
    Town,
    content=''
);

-- 通常のPostalTableからデータをコピー
INSERT INTO PostalFTS(PostalCode, Prefecture, City, Town)
SELECT PostalCode, Prefecture, City, Town FROM PostalTable;
SQL

検索SQL例(ページング)

-- 「東京都」を含む住所を検索し、10件ずつページング
-- 1ページ目(最初の10件)
SELECT PostalCode, Prefecture, City, Town, rank
FROM PostalFTS
WHERE PostalFTS MATCH '東京都'
ORDER BY rank
LIMIT 10 OFFSET 0;

-- 2ページ目(次の10件)
SELECT PostalCode, Prefecture, City, Town, rank
FROM PostalFTS
WHERE PostalFTS MATCH '東京都'
ORDER BY rank
LIMIT 10 OFFSET 10;

-- 3ページ目(さらに次の10件)
SELECT PostalCode, Prefecture, City, Town, rank
FROM PostalFTS
WHERE PostalFTS MATCH '東京都'
ORDER BY rank
LIMIT 10 OFFSET 20;
SQL

💡 LIMIT は取得件数、OFFSET はスキップ件数を指定します。


VBAコード例(ページング検索)

Sub QueryPostalSQLiteFTSPaging()
    Dim conn As Object, rs As Object
    Dim dbPath As String, keywords As String
    Dim pageSize As Integer, pageNum As Integer
    
    dbPath = "C:\data\PostalCache.sqlite"
    
    ' SQLite接続(ODBCドライバ利用)
    Set conn = CreateObject("ADODB.Connection")
    conn.Open "Driver=SQLite3 ODBC Driver;Database=" & dbPath & ";"
    
    ' 検索キーワード
    keywords = "東京都"
    
    ' ページサイズとページ番号
    pageSize = 10
    pageNum = 2   ' 例:2ページ目
    
    ' OFFSET計算
    Dim offsetVal As Integer
    offsetVal = (pageNum - 1) * pageSize
    
    ' ページング検索
    Set rs = conn.Execute("SELECT PostalCode, Prefecture, City, Town, rank " & _
                          "FROM PostalFTS WHERE PostalFTS MATCH '" & keywords & "' " & _
                          "ORDER BY rank LIMIT " & pageSize & " OFFSET " & offsetVal)
    
    ' 結果をImmediate Windowに表示
    Debug.Print "=== ページ " & pageNum & " の検索結果 ==="
    Do Until rs.EOF
        Debug.Print rs.Fields(0).Value & " → " & rs.Fields(1).Value & rs.Fields(2).Value & rs.Fields(3).Value & _
                    " (score=" & rs.Fields(4).Value & ")"
        rs.MoveNext
    Loop
    
    rs.Close
    conn.Close
End Sub
VB

実行イメージ

検索条件:東京都

  • 1ページ目 → 郵便番号1000001〜1000010
  • 2ページ目 → 郵便番号1000011〜1000020
  • 3ページ目 → 郵便番号1000021〜1000030

実務での応用

  • 検索結果を分割表示 → 大量データでもUIで扱いやすい
  • 顧客リストのページング → 郵便番号検索結果を10件ずつ表示
  • Webアプリ連携 → ページング機能でユーザーに快適な検索体験を提供
  • 分析業務 → 大量データを段階的に処理して負荷を軽減

💡 LIMIT+OFFSET を使えば、大量の検索結果を効率的にページング処理でき、ユーザー体験や業務効率が大幅に向上します。

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