Access:ボタンでVBAを実行しサブフォームからデータ検索するフォームを作成する

フォームに配置したボタンのクリックイベントで、検索するVBAを実行し結果をサブフォームに表示します。

BackHome Backフォーム

ここでは抽出し対象レコードを表示するのではなく、純粋に検索するフォームを作成します。
フォームデザインで、テーブルがソースのサブフォーム・検索文字を入力するテキストボックス・検索を開始するボタンを配置し、レコードを総当たりで検索します。
関連する「テーブル レコードの検索と置換の方法:問題5 - Access練習問題」も参照してください。




検索フォームの作成方法

検索対象のテーブルがあるデータベースファイルを使用します。

リボンの[作成]~[フォーム デザイン]をクリックしフォームを作成します。

[フォーム デザイン]をクリックしフォームを作成する

リボンの[フォーム デザイン ツール]~[デザイン]で、[サブフォーム/サブレポート]を選択しフォーム上に配置します。

[サブフォーム/サブレポート]を選択しフォーム上に配置する

サブフォーム ウィザードが開始します。

[既存のテーブルまたはクエリを使用する]を選択し[次へ]ボタンをクリックします。

サブフォーム ウィザード

テーブル又はクエリを選択し、表示するフィールドを指定します。

ここでは「商品テーブル」を選択し、全フィールドを指定しました。

テーブル又はクエリを選択し、表示するフィールドを指定する

サブフォームの名前を入力し完了です。

サブフォームの名前を入力する

フォームビューを実行すると、サブフォームに指定したテーブルが表示されます。

フォームビュー画面

フォームの上に、リボンの[フォーム デザイン ツール]~[デザイン]から、[テキストボックス]と[コマンドボタン]を配置し、テキストボックスのラベルを「商品名」、ボタンの表示を「検索」に変更します。

[テキストボックス]と[コマンドボタン]を配置する

検索ボタンを選択した状態で、プロパティシートの[イベント]タブ~[クリック時]イベントを[イベント プロシージャ]にし、[…]ボタンをクリックします。

[クリック時]イベントを[イベント プロシージャ]にし、[…]ボタンをクリックする


VBAを入力する

VBE画面が開くので下記のコードを入力します。
実行順は下記の通りです。

  1. Nzを使い、検索文字が入力されているかチェックします。
  2. SetFocusで、サブフォームにフォーカスを移します。
  3. DoCmd.GoToRecordで先頭レコードに移動します。
  4. On Error Resume Nextでエラーを無視するようにします。
  5. Do~Loopで先頭レコードから順に、検索します。
  6. 見つかるか、エラーが発生すればループを抜けます。
  7. 結果のメッセージを表示します。

Option Compare Database
Option Explicit

Private Sub コマンド4_Click()
    Dim bFind As Boolean
    
    If Nz(Me!テキスト2, "") = "" Then
        MsgBox ("検索文字列を入力してください")
        Me!テキスト2.SetFocus
        Exit Sub
    End If

    Me![Sub商品マスター].SetFocus
    Err.Number = 0
    DoCmd.GoToRecord , , acFirst
    
    bFind = False
    On Error Resume Next
    Do
        Me![Sub商品マスター].SetFocus
        If Me!テキスト2 = Me![Sub商品マスター]![商品名] Then
            bFind = True
            Exit Do
        End If
        Err.Number = 0
        DoCmd.GoToRecord , , acNext
        If Err.Number > 0 Then
            Exit Do
        End If
    Loop

    If bFind = True Then
        MsgBox "商品ID:" & Me![Sub商品マスター]![商品ID] & " に見つかりました。"
    Else
        MsgBox "見つかりませんでした。"
    End If
End Sub


検索フォームの実行結果

見つかれば、サブフォームで見つかったレコードが反転表示され、見つかったIDとメッセージが表示されます。

見つかったレコードが反転表示される

見つからなけらば、サブフォームは最終の新規レコード位置に移動し、メッセージが表示されます。

新規レコード位置に移動し、メッセージが表示される

関連リンク

SQL INSTR関数で文字列を検索し最初に見つかった文字位置を返す
Recordsetで文字列を検索する
クエリ : あ行で始まるデータを抽出する
指定した条件以外のレコード抽出するクエリ
重複データを抽出する
フォームデザインで作成する
ボタンでフォームを開くVBAコード


BackHome Backフォーム

Copyright(C) FeedSoft