教えて!ExcelVBA!

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

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

f:id:m_kbou:20200518095818p:plain

Accessテーブルデータを検索しExcelシートへ取り込む方法について説明します。

 

 

構文

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

①データベースへの接続

Set[参照データベース]= OpenDatabase(”[データベースの登録パス]”)

②テーブルへの接続

Set[参照テーブル]=[参照データベース].OpenRecordset(”[SQL文]”)

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

[参照テーブル].FindFirst "[参照テーブル項目名] = [検索内容]"
If (Not [参照テーブル].NoMatch) Then
      [検索一致した場合の実行内容]
Else
      [検索不一致の場合の実行内容]
End If

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

③テーブルの切断

[参照テーブル].Close
Set[参照テーブル]= Nothing

④データベースの切断

[参照データベース].Close
Set[参照データベース]= Nothing

[説明]:

テーブルのデータを検索するには

-----------------------------------
[参照テーブル].FindFirst "[参照テーブル項目名] = [検索内容]"
If (Not [参照テーブル].NoMatch) Then
      [検索一致した場合の実行内容]
Else
      [検索不一致の場合の実行内容]
End If
-----------------------------------

と記述します。

[参照テーブル].FindFirstは、テーブル([参照テーブル])中のデータを先頭データから最終データに向けて検索し、条件が一致した場合は処理を終了させます。よって、検索にて一致するデータ件数は1件のみとなります。[参照テーブル項目名]には検索するテーブル([参照テーブル])の項目名を記述し、[検索内容]には検索したい文字列(又は数値)を記述します。[参照テーブル項目名] = [検索内容]は「”」(ダブルクォーテーション)で囲みます。ここまでの内容を纏めると、「テーブル([参照テーブル])の中にある項目名([参照テーブル項目名])を先頭から最後のデータに向けて検索文字列([検索内容])で検索して下さい。」との意味になります。次に「Not [参照テーブル].NoMatch」の内容ですが、「テーブル([参照テーブル])を検索した結果、データが一致した場合」との意味になります。よって、IF文と連携した記述する事で、後続処理を「一致した場合」と「不一致の場合」い分岐させて実行させる事ができます。[検索一致した場合の実行内容]には検索にて対象データが存在した場合に実行する処理内容を記述し、[検索不一致の場合の実行内容]には検索にて対象データが見つからなかった場合に実行する処理内容を記述します。全体内容を纏めると、「テーブル([参照テーブル])の中にある項目名([参照テーブル項目名])を先頭から最後のデータに向けて検索文字列([検索内容])で検索し、条件に一致したデータが存在した場合には[検索一致した場合の実行内容]を実行し、不一致によりデータが存在しなかった場合には[検索不一致の場合の実行内容]を実行して下さい。」との意味になります。

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

[記述例]:

r.FindFirst "氏名 = '" & Trim(Range("B1")) & "'"
If (Not r.NoMatch) Then
  Sheets("従業員").Range("A3") = r![番号]
End If

 

使い方

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

[プログラミング例]:

Sub サンプル()
    '↓処理①
    Dim db As Database
    Dim r As Recordset
    '↓処理②
    Set db = OpenDatabase("C:\テスト\従業員.accdb")
    '↓処理③
    Set r = db.OpenRecordset("select * from T_従業員")
    '↓処理④
    r.FindFirst "氏名 = '" & Trim(Range("B1")) & "'"
    If (Not r.NoMatch) Then
        Sheets("従業員").Range("A3") = r![番号]
        Sheets("従業員").Range("B3") = r![部署]
        Sheets("従業員").Range("C3") = r![性別]
        Sheets("従業員").Range("D3") = r![年齢]
    Else
        MsgBox "指定した氏名が存在しません。", 16, "メッセージ"
    End If
    '↓処理⑤
    r.Close
    Set r = Nothing
    '↓処理⑥
    db.Close
    Set db = Nothing
End Sub

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

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

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

[処理③]:テーブルへの接続
テーブルをOPENし[処理①]で定義した変数:rにテーブルの参照を代入します。今回は「T_従業員」テーブルを使用しますが、このテーブルは従業員.accdbの中に含まれています。また、指定したSQL文は「T_従業員テーブルの全項目を使用します。」との意味になります。(※テーブルへの接続についてはこちらを参照して下さい。)

[処理④]:テーブルデータの検索
テーブルに含まれる項目:氏名をB1セルに入力された文字で検索します。
検索結果を元にIF文を用いて一致した場合の処理内容と不一致の場合の処理内容を記述します。一致した場合はテーブル項目(番号・部署・性別・年齢)をExcelシートのA3セル~D3セルにセットし、不一致の場合は”指定した氏名が存在しません。”をMsgBoxで表示します。

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

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

f:id:m_kbou:20210219165051p: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

取り込む先のExcelシートには以下の様な<実行>ボタンが登録されており、ボタンには上記のプログラムが登録されています。

f:id:m_kbou:20200518095851p:plain

今回は氏名:久保木を検索するため、B1セルに「久保木」を入力した<実行>ボタンをクリックします。

f:id:m_kbou:20200518095919p:plain

(実行後)

氏名:久保木に対する番号・部署・性別・年齢の情報が、A3セル~D3セルに表示されます。

f:id:m_kbou:20200518100030p:plain

[サンプル]:

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

drive.google.com

Accessテーブルデータを検索する方法についての説明は以上です。

 

おわりに

今回はAccessテーブルデータを検索する方法について説明しました。上記でも説明しましたが、今回の検索方法は条件が一致した場合に検索処理が終了します。よって、検索条件がテーブル中に1つしか存在しない場合の検索に向いています。予め理解した上で使用して下さい。