【ExcelVBA】Accessのテーブルの列名を取得するには

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

【動画】Accessのテーブルの列名を取得する実際の動き

本題に入る前に、まずは次のツイートをご覧ください。

Accessのテーブルの列名をマクロが取得しています。

SQL Serverのテーブルの列名を取得する方法

SQL Serverのテーブルの列名を取得するには、次の流れの通りにコードを書いていきます。

Excelのマクロ

STEP.1
Accessへの接続情報取得
Accessに接続するための接続情報を取得します。
STEP.2
Accessに接続
STEP.2の接続情報をもとにAccessに接続します。
STEP.3
Recordsetオブジェクトのインスタンスの生成
Recordsetオブジェクトのインスタンスを生成します。
このインスタンスは、Accessのテーブルデータの参照・挿入に必要です。
STEP.4
Recordsetオブジェクトに接続先情報を設定
RecordsetオブジェクトのActiveConnectionプロパティに、STEP.1で取得した接続先情報が設定されているConnectionオブジェクトのインスタンスを設定します。
この設定により、Recordsetオブジェクトを開いたり操作することができるようになります。
STEP.5
列名を取得
列名を取得します。
列名の取得は、recordsetオブジェクトFieldsコレクションのItemプロパティのNameプロパティから列名を取得することができます。

コードの例

Excelのマクロのコード(例)

    Dim DBName      As String               'データベース名
    Dim connDB      As String               'データベース接続情報
    Dim tblNM       As String               'テーブル名
    Dim sqlStr      As String               'SQL文
    Dim cnt         As Long                 'カウンタ
    Dim adoCON      As New ADODB.Connection 'Connection用変数
    Dim adoRS       As ADODB.Recordset      'レコードセット用変数
        
    'カレントディレクトリのデータベースパスを取得
    DBName = ActiveWorkbook.Path & "\" & "0068.mdb"
 
    'データベース接続情報の取得
    adoCON.ConnectionString = "provider=Microsoft.ACE.OLEDB.12.0;" _
                            & "Data Source=" _
                            & DBName & ""
    
    'Accessに接続する
    adoCON.Open connDB
 
    'Recordsetオブジェクトのインスタンスを生成する
    Set adoRS = CreateObject("ADODB.Recordset")
    
    'クライアントサイドカーソルに変更
    adoRS.CursorLocation = 3
    
    '先ほど取得したデータベース接続情報が設定されているadoCONをActiveConnectionプロパティに設定し、
    'ConnectionオブジェクトとRecordsetオブジェクトを関連付ける
    '⇒Recordsetオブジェクトを開いたり操作するのに必要な設定
    adoRS.ActiveConnection = adoCON
 
    'データを取得するテーブル名を取得
    tblNM = "tbl_data_list_ac"
    
    'カーソルを開く
    adoRS.Open tblNM, adoCON        

    For cnt = 0 To adoRS.Fields.Count - 1

        '列名をセルに設定する
        Range("F" & cnt + 2).Value = adoRS.Fields.Item(cnt).Name

    Next
            
    '各終了処理
    adoRS.Close
    If Not adoRS Is Nothing Then Set adoRS = Nothing
    If Not adoCON Is Nothing Then Set adoCON = Nothing

コードの解説

注目すべきコード①

最初に見て頂きたいのは32行目から42行目です。

    'データを取得するテーブル名を取得
    tblNM = "tbl_data_list_ac"
    
    'カーソルを開く
    adoRS.Open tblNM, adoCON        

    For cnt = 0 To adoRS.Fields.Count - 1

        '列名をセルに設定する
        Range("F" & cnt + 2).Value = adoRS.Fields.Item(cnt).Name

    Next

32行目のテーブルtbl_data_list_acを、35行目のrecordsetオブジェクトのOpenメソッドに指定してOpenメソッドを実行することで列名を取得することができます。

40行目のrecordsetオブジェクトFieldsコレクションのItemプロパティのNameプロパティから列名を取り出すことができます。

上記のコードでは、取り出した列名をExcelのF列のセルに設定しています。

ちなみに上記で取得した列名のテーブル定義は次の画像の通りです。

テーブルの定義

注目すべきコード②

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

    'Accessに接続する
    adoCON.Open connDB

ConnectionオブジェクトのOpenメソッドを使ってAccessに接続しています。

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

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

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

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

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

    Dim adoCON      As New ADODB.Connection 'Connection用変数
    Dim adoRS       As ADODB.Recordset      'レコードセット用変数

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

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

最後に

本記事では、Accessのテーブルの列名を取得する方法についてご説明しました。

recordsetのopenメソッドにテーブル名を引数に指定して実行後、recordsetオブジェクトFieldsコレクションのItemプロパティのNameプロパティから列名を取得することができます。

Accessのテーブルの列名を取得したい時に本記事を参考にしていただけたら幸いです。

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

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

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

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