教えて!ExcelVBA!

ExcelVBAの基礎知識・書き方について紹介します。

【ExcelVBA 外部アプリケーション連携】(Access連携)Accessテーブルデータを取り込むにはどうすればいいの?教えて!

f:id:m_kbou:20200514110907p:plain

AccessテーブルデータをExcelシートへ取り込む方法について説明します。ExcelとAccessとの連携によるデータのやり取りでは基本中の基本操作となります。是非一連の流れを理解して活用してみて下さい。

 

 

構文

記述方法は以下の通りとなります。

①データベースへの接続
Set[変数1]= OpenDatabase(”[データベースの登録パス]”)

②テーブルへの接続
Set[変数2]=[変数1].OpenRecordset(”[SQL文]”)

-----------------------------

[変数2].MoveFirst
Do Until ([変数2].EOF)
 [取り込むシート名及びセル名] = [変数2]![項目名]
 [変数2].MoveNext
Loop

-----------------------------
②テーブルの切断
[変数2].Close
Set[変数2]= Nothing

①データベースの切断
[変数1].Close
Set[変数1]= Nothing

[説明]:

テーブルのデータを取り込むには

-------------------------------
[変数2].MoveFirst
Do Until ([変数2].EOF)
 [取り込むシート名及びセル名] = [変数2]![項目名]
 [変数2].MoveNext
Loop
-------------------------------

と記述します。

[変数2].MoveFirstは、テーブル([変数2])の中に登録されている最初のデータ(MoveFirst)に移動する指定となります。次のDo Until ([変数2].EOF)~Loopでは、テーブル([変数2])の中にある最後のデータ(EOF)に移動するまで処理を繰り返す指定となります。この繰り返し処理の中で[取り込むシート名及びセル名] = [変数2]![項目名]を実行する事になります。[変数2]![項目名]は、テーブル([変数2])に含まれるテーブルの項目名([項目名])を意味しており、この項目名に対するデータを指定したシートのセル([取り込むシート名及びセル名])にセットします。[変数2].MoveNextでは、テーブル([変数2])中の次のデータ(MoveNext)に移動させる指定となります。内容を纏めると、「テーブル([変数2])に登録されているデータを最初から最後まで読み込み、指定したシートのセル([取り込むシート名及びセル])に取り込んで下さい。」との意味になります。

※Accessテーブルのデータを取り込むには、事前にAccessデータベースへの接続(①データベースへの接続)やテーブルへの接続(②テーブルへの接続)の記述が必要となります。また、テーブルのデータを取り込んだ後には、テーブルの切断(②テーブルの切断)やデータベースの切断(①データベースの切断)の記述も必要となります。これらの記述はテーブルデータの取り込みと一緒に記述する必要があるため、是非覚えておいて下さい。ちなみに、データベースへの接続/切断についてはこちらを、テーブルへの接続/切断についてはこちらを参照して下さい。

[記述例]:

r.MoveFirst
Do Until (r.EOF)
  Sheets("従業員").Range("A" & 行) = r![氏名]
        行 = 行 + 1
        r.MoveNext
Loop

 

使い方

使い方について具体的に説明していきます。

[プログラミング例]:

Sub サンプル()

  '↓処理①
  Dim db As Database
  Dim r As Recordset
  Dim 行 As Integer

  '↓処理②
  Set db = OpenDatabase("C:\テスト\従業員.accdb")

  '↓処理③
  Set r = db.OpenRecordset("select * from T_従業員")

  '↓処理④
  行 = 1
  r.MoveFirst
  Do Until (r.EOF)
    Sheets("従業員").Range("A" & 行) = r![氏名]
    Sheets("従業員").Range("B" & 行) = r![番号]
    Sheets("従業員").Range("C" & 行) = r![部署]
    Sheets("従業員").Range("D" & 行) = r![性別]
    Sheets("従業員").Range("E" & 行) = r![年齢]
    行 = 行 + 1
    r.MoveNext
  Loop

  '↓処理⑤
  r.Close
  Set r = Nothing

  '↓処理⑥
  db.Close
  Set db = Nothing

End Sub

処理の流れは以下の通りとなります。

[処理①]:変数定義
Dimによる変数定義となります。

[処理②]:データベースへの接続
データベースをOPENした後に[処理①]で定義した変数:dbにデータベースをセットします。今回はC:\テストに登録されている従業員.accdbをセットします。(※データベースの接続についてはこちらを参照して下さい。)

[処理③]:テーブルへの接続
テーブルをOPENした後に[処理①]で定義した変数:rにテーブルをセットします。今回は「T_従業員」テーブルをセットします。このテーブルはデータベース:従業員.accdbの中に含まれています。(※テーブルの接続についてはこちらを参照して下さい。)

[処理④]:テーブルデータの取り込み
最初に[処理①]で定義した変数:行に1をセットします。次にMoveFirstでテーブル中に登録されている最初のデータに移動します。最後にDo~Loop文を使用してテーブルデータの最後(EOF)まで繰り返し処理を行います。繰り返し処理を行う中で、テーブルの各項目データ(氏名・番号・部署・性別・年齢)をExcelシートの指定セル(A列セル~E列セル)にセットします。セット後には変数:行に1を足し込み(行 = 行 + 1)、次のデータに移動させます。

[処理⑤]:テーブルの切断
テーブルの切断を行います。(※テーブルの切断についてはこちらを参照して下さい。)

[処理⑥]:データベースの切断
最後にデータベースの切断を行います。(※データベースの切断についてはこちらを参照して下さい。)

f:id:m_kbou:20210513190431p:plain

※上記のプログラミング例は、VBE(VBA記述画面)に記述しないと実行ができません。VBEの開き方についてはこちらを参考にして下さい。また、Accessデータベースとの接続には事前設定が必要となります。事前準備はこちらを参考にして下さい。

[実行例]:

(事前準備)

C:\テストにAccessデータベース(従業員.accdb)が登録されている必要があります。

f:id:m_kbou:20200511165951p:plain

また、従業員.accdbデータベースの中にはT_従業員テーブルが登録されています。

f:id:m_kbou:20200514110932p:plain

更に、T_従業員テーブルの中には以下のデータが登録されています。

f:id:m_kbou:20200514110956p:plain

①<実行>ボタンには上記のプログラミング例のプログラムが登録されています。この<実行>ボタンをクリックします。(※ボタンにプログラムを割り当てるにはこちらを参考にして下さい。)

f:id:m_kbou:20210513190503p:plain

②指定のExcelシート及びセルにAccessテーブルに登録されているデータが取り込まれます。

f:id:m_kbou:20210513190516p:plain

[サンプル]:

上記で説明したファイルをダウンロードできます。ご自由にお使い下さい。

drive.google.com

Accessテーブルデータを取り込む方法についての説明は以上です。

 

おわりに

今回はAccessテーブルデータを取り込む方法について説明しました。テーブルデータを取り込むには、Do~Loop文を用いて指定したテーブルの最初のデータから最後のデータまでの読み込みを行いながら、指定シートの指定セルにデータをセットする流れとなります。是非覚えておいて下さい。また、今回の様にExcel⇔Accessの連携した処理を行う場合に関しては、予め事前の準備作業が必要となります。こちらも忘れずに実施しておくようにお願いします。