教えて!ExcelVBA!

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

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

f:id:m_kbou:20200518095818p:plain

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

 

 

構文

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

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

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

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

[変数2].FindFirst "[変数2の項目] = '[検索条件]'"
If (Not [変数2].NoMatch) Then
  [条件一致の実行内容]
Else
  [条件不一致の実行内容]
End If

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

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

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

[説明]:

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

-------------------------------
[変数2].FindFirst "[変数2の項目] = '[検索条件]'"
If (Not [変数2].NoMatch) Then
  [条件一致の実行内容]
Else
  [条件不一致の実行内容]
End If
-------------------------------

と記述します。
各記述についての説明は以下の通りです。

・[変数2].FindFirst "[変数2の項目] = '[検索条件]'"
 ⇒「テーブル([変数2])の項目([変数2の項目])に含まれるデータを、検索条件([検索条件])で検索して下さい。」との意味になります。(※[検索条件]が文字列の場合には「’」(アポストロフィ)で囲み、「[変数2の項目] = ’[検索条件]’」は「”」(ダブルクォーテーション)で囲みます。)

・Not [変数2].NoMatch
 ⇒「検索した結果、テーブル([変数2])中に対象データが見つかった場合」との意味になります。(※IF文との連携記述により「見つかった場合」と「見つからなかった場合」に分岐させる事ができます。[条件一致の実行内容]には見つかった場合の処理内容を記述し、[条件不一致の実行内容]には見つからなかった場合の処理内容を記述します。)

内容を纏めると、「テーブル([変数2])の中にある項目([変数2の項目])を[検索条件]で検索し、対象データが見つかった場合には[条件一致の実行内容]で記述した内容を実行し、見つからなかった場合には[条件不一致の実行内容]で記述された内容を実行して下さい。」との意味になります。

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

※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 "氏名 = '大山'"
  If (Not r.NoMatch) Then
    Sheets("Sheet1").Range("A2") = r![氏名]
    Sheets("Sheet1").Range("B2") = r![番号]
    Sheets("Sheet1").Range("C2") = r![部署]
    Sheets("Sheet1").Range("D2") = r![性別]
    Sheets("Sheet1").Range("E2") = r![年齢]
  Else
    MsgBox "指定した氏名が存在しません。", 16, "メッセージ"
  End If

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

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

End Sub

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

[処理①]:変数定義
データベース/テーブルへの接続他を格納するための変数定義となります。

[処理②]:データベースへの接続
※データベースへの接続についてはこちらを参照して下さい。

[処理③]:テーブルへの接続
※テーブルへの接続についてはこちらを参照して下さい。

[処理④]:テーブルデータの検索
今回は検索条件を「大山」(固定値)とし、テーブルの項目:氏名に一致するデータが存在するか否かを検索します。IF文を使用して検索結果が一致した場合には、氏名・番号・部署・性別・年齢の各項目をExcelシートのA2セル~E2セルにセットし、不一致の場合には”指定した氏名が存在しません。”をMsgBoxで表示します。

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

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

f:id:m_kbou:20210520151538p:plain

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

[実行例]:

(事前準備)

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

f:id:m_kbou:20200511165951p:plain

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

f:id:m_kbou:20210625102649p:plain

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

f:id:m_kbou:20210625110515p:plain

(実行内容)

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

f:id:m_kbou:20210520151558p:plain

②T_従業員テーブルの氏名に「大山」が存在する(検索条件に一致)ため、一致したデータ(氏名・番号・部署・性別・年齢)がA2セル~E2セルにセットされました。

f:id:m_kbou:20210520151616p:plain

[サンプル]:

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

drive.google.com

Accessテーブルデータを検索する方法(検索条件が固定値)についての説明は以上です。

 

(例②)検索条件が可変値の場合

検索条件が可変値の場合について説明します。

[プログラミング例]:

Sub サンプル()

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

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

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

  '↓処理④
  r.FindFirst "氏名 = '" & Trim(Range("B1")) & "'"
  If (Not r.NoMatch) Then
    Sheets("Sheet1").Range("A3") = r![番号]
    Sheets("Sheet1").Range("B3") = r![部署]
    Sheets("Sheet1").Range("C3") = r![性別]
    Sheets("Sheet1").Range("D3") = r![年齢]
  Else
    MsgBox "指定した氏名が存在しません。", 16, "メッセージ"
  End If

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

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

End Sub

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

[処理①]:変数定義
データベース/テーブルへの接続他を格納するための変数定義となります。

[処理②]:データベースへの接続
※データベースへの接続についてはこちらを参照して下さい。

[処理③]:テーブルへの接続
※テーブルへの接続についてはこちらを参照して下さい。

[処理④]:テーブルデータの検索
今回は検索条件を可変値とし、B1セルに入力した氏名がテーブルの項目:氏名で一致するデータが存在するか否かを検索します。IF文を使用して検索結果が一致した場合には、番号・部署・性別・年齢の各項目をExcelシートのA3セル~D3セルにセットし、不一致の場合には”指定した氏名が存在しません。”をMsgBoxで表示します。

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

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

f:id:m_kbou:20210520160548p:plain

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

[実行例]:

(事前準備)

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

f:id:m_kbou:20200511165951p:plain

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

f:id:m_kbou:20210625102649p:plain

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

f:id:m_kbou:20210625110515p:plain

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

f:id:m_kbou:20210520160611p:plain

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

f:id:m_kbou:20210520160626p:plain

③T_従業員テーブルの氏名に「久保木」が存在する(検索条件に一致)ため、一致したデータ(番号・部署・性別・年齢)がA3セル~D3セルにセットされました。

f:id:m_kbou:20210520160639p:plain

[サンプル]:

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

drive.google.com

Accessテーブルデータを検索する方法(検索条件が可変値)についての説明は以上です。

 

おわりに

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