【EXCEL:VBA】ACCESSからテーブル・クエリデータを取得したい

ACCESSからテーブル・クエリデータを取得したい

この記事では、指定したACCESSファイルからテーブルデータおよびクエリデータを取得する方法について説明しています。

 

1つ1つテーブルやクエリを開いて、コピーするのは大変な作業です。

 

今回ご紹介する機能を利用すれば、ACCESSファイルを指定し、テーブル名またはクエリ名を指定するだけで、テーブルデータやクエリデータを一瞬で取得することができます。

 

ACCESSに存在するテーブルやクエリの名前を全て取得する機能もあります。

 

 

それでは、指定したACCESSからテーブルやクエリのデータを取得する機能を作成していきましょう。

 

困っている女性

ACCESSに入っている各種マスタデータを作業でよく利用することがあるの。

困っている女性

ACCESSファイルをいちいち開いて、テーブルを開いて、全てのデータをコピーして、EXCELに貼り付ける作業が地味に面倒なの。

困っている女性

複数のテーブルを利用する必要があり、EXCELから直接データを取得できるとべんりなんだけどなあ。
それなら、VBAを使えばボタン1つ押すだけで、ACCESSのテーブルデータをEXCELに取得することができるよ。

解決する男性

しかも、ACCESSに存在するテーブル名やクエリ名も取得できるので、いちいち名前を覚えて置かなくても大丈夫だよ。

解決する男性

困っている女性

それそれ、早く教えてよ。

 

もくじ

「機能概要図」(ACCESSからテーブル・クエリデータを取得する)

今回作成する機能の概要図は、以下です。

「機能概要図」(ACCESSからテーブル・クエリデータを取得する)

「機能概要図」(ACCESSからテーブル・クエリデータを取得する)

 

今回作成する機能には、以下の2つの機能があります。

  1. 指定したACCESSファイルのテーブル名一覧とクエリ名一覧を取得し、EXCELシートに出力する
  2. 指定したACCESSファイルの指定したテーブル(クエリ)からデータを取得し、EXCELシートに出力する

 

指定したACCESSファイルから、テーブルやクエリデータを取得する機能を、1つ1つ順番に説明していきます。

ACCESSファイルパス指定欄、テーブル名・クエリ名指定欄、取得したデータの表示欄を準備する

まず、ACCESSファイルとテーブル名・クエリ名を指定する欄を作成します。

次に、取得したテーブル名とクエリ名を表示する欄を作成します。

そのあと、指定したテーブルまたはクエリから取得したデータを表示するシートを作成します。

 

「メイン」シートを作成する

メインシートを作成する

メインシートを作成する

  1. 「メイン」という名前のシートを作成します。
  2. A1セルに「ACCESSファイルパス」のタイトル欄を作成します。
  3. B1セルに「テーブル名・クエリ名」のタイトル欄を作成します。
  4. A2とB2セルに、「ACCESSファイルパス」と「テーブル名・クエリ名」を指定する欄を作成します。
  5. A3とB3セルに、「テーブル名」と「クエリ名」のタイトル欄を作成します。
  6. 4行目以降は、取得したテーブル名およびクエリ名を出力する欄になります。

 

4行目以降のA列とB列には、VBAプログラムが記入してくれます。

A列にはテーブル名、B列にクエリ名が表示されます。

 

「データ」シートを作成する

データ表示するシートを作成する

データ表示するシートを作成する

  1. 「データ」という名前のシートを作成します。
  2. あとは、特になにもしなくてよいです。

 

1行目には、テーブルまたはクエリの項目名が表示されます。

2行目以降には、データが表示されます。

 

VBAでACCESSからテーブル名およびクエリ名を取得する機能を作成する

開発タブの「Visual Basic」をクリックして、「Microsoft Visual Basic for Applications」を起動します。

Microsoft Visual Basic for Applicationsを起動する

Microsoft Visual Basic for Applicationsを起動する

 

「Microsoft Visual Basic for Applications」にVBAプログラムを入力します。

VBAプログラムを入力する(その1)

VBAプログラムを入力する(その1)

 

標準モジュールを追加して、以下のソースを書きます。

 

次に、EXCELを「◯◯◯.xlsm」というような感じでマクロ有効ブック形式で保存します。

 

VBAでACCESSからテーブルおよびクエリからデータを取得する機能を作成する

次に、ACCESSからテーブルおよびクエリからデータを取得する機能をVBAプログラムで作成します。

標準モジュールにVBAプログラムを入力します。

VBAプログラムを入力する(その2)

VBAプログラムを入力する(その2)

 

以下のソースを書きます。

 

EXCELファイルを上書き保存します。

 

ACCESSからテーブル名およびクエリ名を取得する機能の使い方

それでは、ACCESSに存在する全てのテーブル名およびクエリ名を取得する方法を説明します。

 

まず、A2セルにACCESSファイルのパスを入力します。

ACCESSファイルパスを入力する

ACCESSファイルパスを入力する

 

 

次に、「開発」タブの「マクロ」をクリックします。

テーブル名とクエリ名を取得するVBAプログラムを実行する

テーブル名とクエリ名を取得するVBAプログラムを実行する

 

 

先程作成したVBAプログラム「GetTableList」が一覧に表示されていますので、選択します。

次に、「実行」ボタンをクリックしてテーブル名とクエリ名を取得します。

実行ボタンをクリックする

実行ボタンをクリックする

 

しばらく待つと、指定したACCESSファイルに存在するテーブル名とクエリ名が「メイン」シートの4行目以降に表示します。

A列にはテーブル名、B列にはクエリ名が表示されます。

テーブル名とクエリ名が表示される

テーブル名とクエリ名が表示される

 

ACCESSからテーブルまたはクエリからデータを取得する機能の使い方

それでは、指定したACCESSの指定したテーブル(クエリ)からデータを取得する方法を説明します。

B2セルにテーブル名またはクエリ名を入力します。

テーブル名またはクエリ名を入力する

テーブル名またはクエリ名を入力する

 

テーブル名またはクエリ名がわかっている場合は、先程のテーブル名およびクエリ名を取得する操作は必要ありません。

 

次に、「開発」タブの「マクロ」をクリックします。

テーブルまたはクエリからデータを取得するVBAプログラムを実行する

テーブルまたはクエリからデータを取得するVBAプログラムを実行する

 

先程作成したVBAプログラム「GetData」が一覧に表示されていますので、選択します。

次に、「実行」ボタンをクリックしてテーブルまたはクエリデータを取得します。

データ取得するVBAプログラムを実行する

データ取得するVBAプログラムを実行する

 

しばらく待つと、「データ」シートに指定したテーブル(クエリ)のデータが表示されます。

テーブル(クエリ)データが表示される

テーブル(クエリ)データが表示される

1行目には、各項目名が表示されます。

2行目以降は、データが表示されます。

 

実際のACCESSは、以下のようになっています。

実際のACCESSの様子

実際のACCESSの様子

 

全てのテーブル名およびクエリ名を取得できています。

また、指定したテーブルからデータを取得できました。

 

テーブル名およびクエリ名を取得するVBAプログラム(GetTableList)の説明

それでは、テーブル名とクエリ名を取得するVBAプログラム(GetTableList)を説明します。

①メインシートを変数に格納する

ここでは、このあとの処理で何度も使う「メイン」シートを変数に格納しています。

そうすることにより、入力するプログラムを短くすることができるからです。

何度も「ThisWorkbook.Sheets(“メイン”)」と入力するより、「shtMain」と入力するほうがコードが少なくてよいからです。

 

②データ入力されているA列の最終行を取得する

ここでは、A列の入力されている最終行を変数に格納しています。

何度も実行していると、前回実行時に取得したテーブル名が残っています。

今回取得した情報を出力する前に、その情報をクリアするために最終行を取得しています。

 

最終行を取得することで、どこまでのセルをクリアするべきかがわかるからです。

 

③最終行が4行目以降なら、4行目以降のA列をクリアする

ここでは、先程取得した最終行が4以上なら、セルの値をクリアする必要があります。

その場合、A4セルからA列の最終行までをクリアします。

この処理によって、すでに入力されているテーブル名がクリアされます。

 

④データ入力されているB列の最終行を取得する

ここでは、B列に入力されているデータの最終行を取得します。

前回実行時のクエリ名が残っている可能性があるので、クリアしておくためにB列の最終行を取得しています。

 

⑤最終行が4行目以降なら、4行目以降のB列をクリアする

ここでは、先程取得した最終行が4以上なら、セルの値をクリアする必要があります。

その場合、B4セルからB列の最終行までをクリアします。

この処理によって、すでに入力されているクエリ名がクリアされます。

 

⑥ACCESSの接続文字列を作成する

ここでは、A2セルに入力されているACCESSファイルパスを指定しています。

 

⑦ADOX.Catalogオブジェクトを生成する

ここでは、ACCESSのテーブルやクエリ情報を取得するオブジェクトを生成しています。

このオブジェクトを利用して、テーブル名やクエリ名を取得します。

 

⑧⑥で指定したACCESSに接続する

ここでは、⑥で作成したACCESS接続文字列を利用して、実際のACCESSに接続しています。

 

⑨ACCESSに存在するオブジェクトに対して以降の処理を行う

ここでは、ACCESSから取得したテーブルやクエリ情報数分、以降の処理を繰り返し実行します。

 

⑩オブジェクトがテーブルの場合、メインシートのA列にテーブル名をセットする

ここでは、取得したテーブル名をメインシートのA列に出力しています。

 

⑪オブジェクトがクエリの場合、メインシートのB列にクエリ名をセットする

ここでは、取得したクエリ名をメインシートのB列に出力しています。

 

この機能を利用して、ACCESSからテーブル名およびクエリ名を取得してみましょう。

 

テーブルまたはクエリからデータを取得するVBAプログラム(GetData)の説明

それでは、テーブルまたはクエリからデータを取得するVBAプログラム(GetData)を説明します。

①メインシートを変数に格納する

ここでは、このあとの処理で何度も使う「メイン」シートを変数に格納しています。

 

②データシートを変数に格納する

ここでは、このあとの処理で何度も使う「データ」シートを変数に格納しています。

 

③データシートをクリアする

ここでは、テーブルやクエリからデータを取得する前に、データシートに入力されているデータをクリアしています。

前回実行して取得したデータを、事前にクリアするためです。

 

④ADODBコネクションオブジェクトを生成する

ここでは、ACCESSに接続するオブジェクトを生成しています。

このオブジェクトを利用して、ACCESSからテーブルやクエリデータ取得することができます。

 

⑤指定されているACCESSに接続する

ここでは、メインシートのA2セルに入力されているACCESSに接続しています。

 

⑥指定されているテーブル(クエリ)のデータを取得する

ここでは、メインシートのB2セルに入力されているテーブルまたはクエリからデータを取得しています。

 

⑦取得したデータのフィールド名をデータシートにセットする

ここでは、取得したデータの項目名をデータシートの1行目に出力しています。

 

⑧取得したデータをデータシートに貼り付けする

ここでは、取得したデータをデータシートの2行目に貼り付けています。

 

⑨使用したオブジェクトを閉じる

ここでは、使用して使い終わったオブジェクトを閉じています。

 

⑩使用したオブジェクトをメモリから開放する

ここでは、使い終わったオブジェクトをメモリから解放しています。

 

 

ということで、ACCESSからデータを取得できるようになりました。

 

それでは、ACCESSからテーブルやクエリデータを取得するツールを作って、作業を効率化しましょう。

 

以上です。

 

 

最後まで読んでいただきありがとうございました。
この記事をシェアしていただけると喜びます。

 

2 COMMENTS

だるま

20210928のように8桁の数字を入力して、その日のデータを取得するクエリがいくつもあるのですが、このコードではそのクエリは取得できませんでした。C2セルに8桁の日付を入れておいて、データを取得するようなコードを紹介してもらえませんか。

返信する

だるま へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です