Excelが大好きだ!

Excel大好き経理マンがExcelの事を書き綴っていきます。


スポンサードリンク

ExcelからSQLite3を操作する方法(5.データの抽出)

前回まででSQLiteデータベースにMP3タグの情報が蓄積された状態になっています。

今回は蓄積された情報をSQLiteデータベースから抽出をしてExcelへ転記していきます。

現在の状態はこのような感じです。

f:id:ExcelLover:20180922235520j:plain

ワークシートのオブジェクト名をデフォルトから変更しています。

オブジェクト名でWorksheetを指定しておくと、ワークシート名を変えた場合でもコードの変更をせずに済むようになるので大変便利です。

デフォルトでは「Sheet1」等のオブジェクト名になっているので、分かりやすいものに変えておきましょう。

SQLのSelect文で簡単抽出

Sub Select_Music()
          Dim SQLiteDB_Handle As Long
          Dim SQLiteFullPath As String
          Dim myStmtHandle As Long
          Dim mySQL As String
          Dim returnValue As Long
          
Application.ScreenUpdating = False
          wsMusicData.Cells.Clear
          SQLite3dll_Connect
          SQLiteFullPath = ThisWorkbook.Path & "\MusicDatabase.db3"
          SQLite3Open SQLiteFullPath, SQLiteDB_Handle
          
          mySQL = "select * from MusicDatabase"
          SQLite3PrepareV2 SQLiteDB_Handle, mySQL, myStmtHandle
          returnValue = SQLite3Step(myStmtHandle)
          
          Dim colCount As Long
          Dim i As Long
          
'①ヘッダー転記
          colCount = SQLite3ColumnCount(myStmtHandle)
          For i = 0 To colCount - 1
               Cells(1, i + 1).Value = SQLite3ColumnName(myStmtHandle, i)
          Next i
          
          Dim n As Long
          n = 2
          
'②1行ずつ処理範囲を移動
          Do Until returnValue = SQLITE_DONE Or returnValue = SQLITE_MISUSE
               
               Dim colType As Long
               Dim colValue As Variant
               
'③1列ずつ転記
               For i = 0 To colCount - 1
                    colType = SQLite3ColumnType(myStmtHandle, i)
                    colValue = ColumnValue(myStmtHandle, i, colType)
                    Cells(n, i + 1).Value = colValue
               Next i
               returnValue = SQLite3Step(myStmtHandle)
               n = n + 1
               Debug.Print returnValue
          Loop
          SQLite3Finalize myStmtHandle
          SQLite3Close SQLiteDB_Handle
Application.ScreenUpdating = True
End Sub
'---------------------------
Function ColumnValue(ByVal stmtHandle As Long, ByVal ZeroBasedColIndex As Long, ByVal SQLiteType As Long) As Variant
    Select Case SQLiteType
        Case SQLITE_INTEGER:
            ColumnValue = SQLite3ColumnInt32(stmtHandle, ZeroBasedColIndex)
        Case SQLITE_FLOAT:
            ColumnValue = SQLite3ColumnDouble(stmtHandle, ZeroBasedColIndex)
        Case SQLITE_TEXT:
            ColumnValue = SQLite3ColumnText(stmtHandle, ZeroBasedColIndex)
        Case SQLITE_BLOB:
            ColumnValue = SQLite3ColumnText(stmtHandle, ZeroBasedColIndex)
        Case SQLITE_NULL:
            ColumnValue = Null
    End Select
End Function

データの抽出についてもデータの挿入と同じようにSQL文で出力データを指定します。

SQLiteの操作方法に関しても

・SQLite3Open

・SQLite3PrepareV2

・SQLite3Step

までの処理は指定するSQL文が異なる以外はデータの挿入と全く同じ手順です。

SQL文について細かく説明しませんが、今回記載している

"select * from MusicDatabase"

というSQL文は「MusicDatabase」というテーブルの全データをそのまま抽出するという意味になります。

ヘッダー行の抽出

では早速データの抽出を行います。

SQL文に問題がなければSQLite3Stepを実行した時点で抽出条件に合致したデータが1行抽出されています。

この状態でSQLite3ColumnCountを実行すると抽出したデータの列数を取得できます。

※コード中①

その後は列数を利用してループ処理でSQLite3ColumnNameでヘッダー行を取得してセルに転記します。

データの抽出はループ処理

上述の通り、SQLite3Stepを実行すると条件に合致したデータの1行目だけが抽出された状態になっています。

このため

・抽出した1行のデータをExcelに転記

・再びSQLite3Stepを実行して次の行のデータを抽出する

・終了フラグが立つまで上記2つを繰り返す

という処理の流れになります。

終了フラグの判定はSQLite3Stepの返り値が「SQLITE_DONE(=101)」になっていると全ての行を抽出し終わった状態(EOF)です。

※コード中②

データの抽出方法

実際のデータの抽出はSQLite3demoに用意されている

ColumnValue」を使用して抽出します。

データの抽出に関してもヘッダーの時と同じでループ処理で1列ずつ取得してExcelに転記していきます。

※コード中③

後処理

終了フラグが立った後はループ処理を抜けて後処理で

・SQLite3Finalize myStmtHandle
・SQLite3Close SQLiteDB_Handle

以上2つを実行してデータの抽出処理は完了です。

データベースに取り込んだデータは無事にExcelに転記されたでしょうか?

まとめ

今回までで

SQLite3データベースの作成

・MP3タグの抽出

・データベースへのデータ挿入

・データベースからのデータ抽出

までのMP3ファイルのデータ操作関連が終了しました。

抽出に関してはSQL文を修正すれば自分の思った通りのデータが抽出できますが、本連載ではパスいたします。

またユーザーインターフェースについてもユーザーフォームを作り込んでいけば良いのですが、これについてもパスします。

(個人的に利用する際は作ろうとは思いますが

次回以降は抽出したデータを利用してMP3ファイルを実際に再生してみようと思います。

※今回作ってみてSQLiteExcelからの操作に興味を持ったのでその辺りもうちょっと調べてみたいですね