教えて!ExcelVBA!

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

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

       f:id:m_kbou:20200518095818p:plain

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

 

【目次】

 

構文

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

=======================================================================

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

Set[参照テーブル]=[参照データベース].OpenRecordset(”[SQLのSELECT文によるテーブルデータ抽出方法]”)

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

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

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

=======================================================================

[説明]:

Accessテーブルデータを取り込むには、前提条件としてAccessデータベースへの接続/切断及びテーブルへの接続/切断が必要となります。各々の記述方法については、今回説明するテーブルデータ取り込み構文の前後に小文字で記述しておきます。参考にして下さい。

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

[記述例]:

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

 

使い方

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

[記述例]:

※以下の記述例は、VBE(VBA記述画面)に記述しないと実行ができません。VBEの開き方については、VBEの開き方を参考にして下さい。また、Accessデータベースとの接続には事前設定が必要となります。事前準備はAccessとの連携をするための事前準備を参考にして下さい。

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

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にデータベースの参照を代入します。

[処理③]:テーブルへの接続
テーブルをOPENし[処理①]で定義した変数:rにテーブルの参照を代入します。

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

[処理⑤]:テーブルの切断
テーブルの切断を行います。

[処理⑥]:データベースの切断
最後にデータベースの切断を行います。

[実行例]:

(実行前)

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

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

 

おわりに

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