【ExcelVBA】SQLiteのテーブルのフィールド名を取得するには

この記事では、SQLiteのテーブルのフィールド名を取得する方法についてご説明します。

【動画】SQLiteのテーブルのフィールド名を取得する実際の動き

本題に入る前に、まずは次の動画をご覧ください。


Connectionインスタンスの生成してSQLiteのデータベースへの接続情報を用意したらConnectionインスタンスのConnectionStringプロパティに代入し、Openメソッドを実行することで、マクロがSQLiteのデータベースに接続しています。

マクロがSQLiteのデータベースに接続したら、フィールド名を取得したいテーブルに対してSELECT文を実行します。

SELECT文を実行後のRecordsetのFieldsプロパティのNameプロパティからフィールド名を取得することができます。

「sqlite_master」のテーブルに対して、接続したデータベース名(「B2」のセルに入力されたデータベース名)にあるテーブルを全て取得します。

マクロ作成の流れ

STEP.1
Connectionインスタンスを生成する
Connectionインスタンスを生成します。
STEP.2
SQLiteへの接続情報を取得する
SQLiteへの接続情報を取得します。
STEP.3
STEP.2の接続情報をOpenメソッドの引数に指定してOpenメソッドを実行する
STEP.2の接続情報をOpenメソッドの引数に指定してOpenメソッドを実行します。
実行すると、ExcelのマクロがSQLiteのデータベースに接続されます。
STEP.4
フィールド名を取得したいテーブルに対してSELECT文を実行する
フィールド名を取得したいテーブルに対してSELECT文を実行します。
STEP.5
SELECT文を実行後のRecordsetのFieldsプロパティのNameプロパティからフィールド名を取得する
SELECT文を実行後のRecordsetのFieldsプロパティのNameプロパティからフィールド名を取得します。

ExcelファイルとSQLiteのデータベースの例

今回は次のExcelファイルを用意しました。

A2の黄色いセルにはSQLiteのデータベースファイルの置き場を、A5

また、今回は以下のSQLiteのデータベースに「syain」というテーブルを用意しました。

テーブル「syain」には、4つのフィールドが存在しています。

マクロを実行すると、以下の通り「syain」のテーブルのフィールドがExcelのシートに出力されています。

コードの例

Option Explicit

Private Sub btn_exec_Click()

    Dim cn      As ADODB.Connection     'Connection用変数
    Dim rs      As ADODB.Recordset      'レコードセット用変数
    Dim cnt     As Integer              'カウンタ
    Dim ws      As Worksheet            'ワークシート変数
    Dim tblName As String               'テーブル名を格納する変数
    
    'データを出力する行位置を取得する
    Const bgnRow As Long = 8
    
    'シートを取得する
    Set ws = Worksheets("work")
    
    'セルをクリアする
    ws.Range("A" & bgnRow & ":B1000").ClearContents
    
    'テーブル名を取得する
    tblName = ws.Range("tblName").Value

    'Connectionオブジェクトのインスタンスを生成する
    Set cn = CreateObject("ADODB.connection")
    
    'SQLiteへの接続情報を取得する
    cn.ConnectionString = "DRIVER=SQLite3 ODBC Driver;Database=" & _
                           ws.Range("dbName").Value
                          
    'コネクションを開く
    cn.Open

    'Recordsetオブジェクトのインスタンスを生成する
    Set rs = CreateObject("ADODB.Recordset")

    'フィールド名を取得するため1件だけデータを取得する
    rs.Open "SELECT * FROM syain LIMIT 1", cn

    'フィールドの数だけ処理を繰り返すFor文
    For cnt = 0 To rs.Fields.Count - 1
    
        'フィールド名をシートに出力する
        ws.Range("A" & bgnRow + cnt).Value = cnt + 1
        
        'フィールド名をシートに出力する
        ws.Range("B" & bgnRow + cnt).Value = rs.Fields(cnt).Name
        
    Next cnt

    '後処理
    rs.Close
    cn.Close
    Set rs = Nothing
    Set cn = Nothing
    
End Sub

注目すべきコード①

最初に見て頂きたいのは24行目です。

    'Connectionオブジェクトのインスタンスを生成する
    Set cn = CreateObject("ADODB.connection")

コードの説明

以上のコードは、マクロがSQLiteのデータベースに接続するための接続情報を取得して接続するコードです。

このインスタンスがないとマクロがSQLiteのデータベースに接続することができないので必ず生成しておきます。

注目すべきコード②

次に見て頂きたいのは24行目から25行目です。

    'SQLiteへの接続情報を取得する
    cn.ConnectionString = "DRIVER=SQLite3 ODBC Driver;Database=" & _
                           ws.Range("dbName").Value

コードの説明

以上のコードは、マクロがSQLiteのデータベースに接続するための接続情報を用意するコードです。

接続情報のDriverには、マクロがSQLiteのデータベースに接続するのに必要なODBCドライバーの情報を指定します。

「SQLite3 ODBC Driver」は下のODBC データソースアドミニストレーター上で表示されているSQLiteのドライバの名前を指定します。

また、SQLiteのデータベースファイルのフルパスも指定します。

今回はB2のセル(今回はセルの名前を「dbName」としています)を接続情報で指定しています。

注目すべきコード③

次に見て頂きたいのは28行目です。

    'コネクションを開く
    cn.Open

コードの説明

以上のコードは、ConnectionインスタンスのOpenメソッドを実行して、マクロがSQLiteのデータベースに接続する処理のコードです。

Connectionインスタンスには「注目すべきコード②」で説明した通り、マクロがSQLiteのデータベースに接続するための接続情報をConnectionStringプロパティに代入しているので、ここではOpenメソッドを実行することでマクロがSQLiteのデータベースに接続されます。

注目すべきコード④

次に見て頂きたいのは34行目から37行目です。

    'Recordsetオブジェクトのインスタンスを生成する
    Set rs = CreateObject("ADODB.Recordset")

    'フィールド名を取得するため1件だけデータを取得する
    rs.Open "SELECT * FROM syain LIMIT 1", cn

コードの説明

以上のコードは、Recordsetオブジェクトのインスタンスを生成して、フィールド名を取得するため1件だけデータを取得する処理のコードです。

フィールド名を取得するには、表に対して一度SELECT文を実行する必要があります。(SELECT文を実行せずに、列の型だけを直接取得することはできないため)

SELECT文を実行すると、recordsetにデータが取得されて、その中のNameプロパティからフィールド名を取得することができます。

注目すべきコード⑤

次に見て頂きたいのは40行目から48行目です。

    'フィールドの数だけ処理を繰り返すFor文
    For cnt = 0 To rs.Fields.Count - 1
    
        'フィールド名をシートに出力する
        ws.Range("A" & bgnRow + cnt).Value = cnt + 1
        
        'フィールド名をシートに出力する
        ws.Range("B" & bgnRow + cnt).Value = rs.Fields(cnt).Name
        
    Next cnt

コードの説明

以上のコードは、項番とテーブル「syain」のフィールド名を取得してExcelのシートに出力する処理のコードです。

コードの詳細

40行目のコードは、フィールドの数だけ処理を繰り返すFor文です。

43行目のコードでは、カウンタの値を項番に見立ててA列のセルにその値を出力しています。

46行目のコードでは、RecordsetのFieldsプロパティのNameプロパティから取得したフィールド名をB列のセルに出力しています。

動作確認

ExcelファイルとSQLiteのデータベースの例」をご覧ください。

【注意】参照設定が必要です

一つ注意点があるのですが、先ほどのコードを動かすには参照設定が必要です。

参照設定の一覧(下の画像を参考)から次の項目(ライブラリ)にチェックを付けて「OK」ボタンをクリックします。

  1. Microsoft ActiveX Data Objects 2.8 Library(msado28.tlb)

なぜ必要かというと、Excelのマクロのコードの7行目の「ADODB.Connection」というオブジェクトが「msado28.tlb」というファイルを参照するからです。

    Dim cn      As ADODB.Connection     'Connection用変数
    Dim rs      As ADODB.Recordset      'レコードセット用変数

この参照設定をしないと下の画像のエラーが出ますので必ず行う必要があります。

ここでは「msado28.tlb」とは何者かについては記事の本題から逸れてしまうので詳細は割愛しますが、マクロで「ADODB.Connection」「ADODB.Recordset」というオブジェクトを使う場合は参照設定しないと動かない、程度に思って頂ければと思います。

最後に

この記事では、SQLiteのテーブルのフィールド名を取得する方法についてご説明しました。

SQLiteのテーブルのフィールド名を取得したい時には本記事を参考にしてみてくださいね。

プログラミングのスキルを習得するなら

プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。

プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。

→ TechAcademyの「1週間 無料体験」はこちら