Excel VBA | SQLite FTSでページング検索+COUNTを組み合わせて総件数を取得する応用例

VBA
スポンサーリンク

SQLiteの FTS(Full-Text Search) では、LIMITOFFSET を使ってページング検索ができます。
さらに COUNT(*) を組み合わせることで、検索結果の総件数を取得し「全体の何件中、今何ページ目か」を表示できます。これによりユーザーに分かりやすいページングUIを提供できます。


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例(ページング+総件数)

-- 総件数を取得
SELECT COUNT(*) AS TotalCount
FROM PostalFTS
WHERE PostalFTS MATCH '東京都';

-- ページング検索(例:2ページ目、10件ずつ)
SELECT PostalCode, Prefecture, City, Town, rank
FROM PostalFTS
WHERE PostalFTS MATCH '東京都'
ORDER BY rank
LIMIT 10 OFFSET 10;
SQL

💡 これで「東京都に一致する住所は全部で何件あるか」と「そのうち2ページ目の10件」を同時に取得できます。


VBAコード例(ページング+COUNT)

Sub QueryPostalSQLiteFTSPagingWithCount()
    Dim conn As Object, rs As Object
    Dim dbPath As String, keywords As String
    Dim pageSize As Integer, pageNum As Integer
    Dim totalCount As Long
    
    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ページ目
    
    ' 総件数を取得
    Set rs = conn.Execute("SELECT COUNT(*) FROM PostalFTS WHERE PostalFTS MATCH '" & keywords & "'")
    totalCount = rs.Fields(0).Value
    rs.Close
    
    ' 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 "=== 検索結果: " & totalCount & "件中 ページ " & 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

実行イメージ

検索条件:東京都

  • 総件数:250件
  • ページサイズ:10件
  • ページ番号:2ページ目(11〜20件目)

出力例:

=== 検索結果: 250件中 ページ 2 ===
1000011 → 東京都千代田区大手町 (score=2)
1000012 → 東京都千代田区丸の内 (score=3)
...

実務での応用

  • ユーザーに総件数を提示 → 「全250件中、2ページ目を表示」などUIに活用
  • 検索結果のページング → 大量データでも快適に閲覧可能
  • 顧客リスト管理 → 郵便番号検索結果を分割表示しつつ総件数を把握
  • 分析業務 → 全件数を取得して統計処理に利用

💡 COUNT(*)LIMIT+OFFSET を組み合わせることで、検索結果の総件数を把握しつつページング表示が可能になります。

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