前回まででSQLiteデータベースにMP3タグの情報が蓄積された状態になっています。
今回は蓄積された情報をSQLiteデータベースから抽出をしてExcelへ転記していきます。
現在の状態はこのような感じです。
ワークシートのオブジェクト名をデフォルトから変更しています。
オブジェクト名で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ファイルを実際に再生してみようと思います。