サブフォームを使った検索画面の作り方
Accessで検索画面を作成する場合、検索条件やボタンなどのコントロールと検索結果の一覧は、フォームを別々にすると見栄えがよくなり、操作性も向上します。
ここでは、検索画面のフォームに検索結果の一覧をサブフォームとして埋め込む方法を、忘れないようにメモとして残しておきます。
目次
- サブフォームを使った画面と使わない画面の違い
- メインフォームの詳細
- サブフォームの詳細
- サブフォームに対してレコードソースの設定
- サブフォームの選択行処理の不具合対応
- 実行結果
サブフォームを使った画面と使わない画面の違い
一覧にサブフォームを埋め込んだ検索画面は以下の通り。
一方、サブフォームを使わない検索画面は以下の通り。
見て分かる通り、サブフォームを使わない場合は画面全体にスクロールバーが表示されてしまって、見栄えが悪いです。
また、こちらの設定が悪いだけかもしれませんが、スクロールが表示されるかどうか微妙な件数の時に下にスクロールすると、最上段に戻れなくなることがありました(下記のイメージは上にID「1」のレコードがあるのに上にスクロールしても表示されなくなった状態)。
さらにテキストボックスを使って選択レコードの背景色を変えている場合、スクロールバーが表示されない件数だと、ストライプの背景色(グレー)をすべて覆うことができずに、こちらも見栄えが悪くなります。
これ以外にも、フォームをモーダルで表示する際には、VBAでフォームに対して「InsideHeight」を設定しないと、一覧部が1行分しか確保されずに表示されてしまうなど、作り込んでいくと、対応に苦慮する点が沢山でてきます。
これらの問題を解決するためにも、ちょっと面倒ですが、一覧部分をサブフォームとして作成しておくと後々作り直しが発生しないので安心です。
メインフォームの詳細
サブフォームの詳細
サブフォーム用に作成したフォームのデザインビューは以下の通りです。
サブフォームのプロパティには、既定のビュー「帳票フォーム」、レコードセレクタ「はい」、移動ボタン「いいえ」、スクロールバー「垂直のみ」、追加の許可「いいえ」、削除の許可「いいえ」、更新の許可「はい」、を設定します。
フォームフッターに配置している非連結のテキストボックスは、選択中のレコード行の背景色を変えるために利用しているものなので、その機能がなければ不要です。必要な場合は、フッターの可視を「いいえ」に設定します。
選択行の背景色設定についての詳細はこちらを参照してください。
サブフォームに対してレコードソースの設定
メインフォームからサブフォームのレコードソースを設定する場合、メインフォーム側のVBAコードで以下のように記述します。
Private Sub Form_Load()
[商品検索サブ画面].Form.RecordSource = "SELECT * FROM T_商品"
End Sub
検索条件を指定したSQLをセットする場合はこのレコードソースを上書きすれば、画面に表示されているデータが切り替わります。
Private Sub btn検索_Click()
Dim sql As String
sql = ""
sql = sql & " SELECT * FROM T_商品"
sql = sql & " WHERE 0 = 0"
If Len(Trim(Me.txt検索_ID)) > 0 Then
sql = sql & " AND ID = " & txt検索_ID
End If
If Len(Trim(Me.txt検索_商品名)) > 0 Then
sql = sql & " AND 商品名 LIKE '*" & txt検索_商品名 & "*' "
End If
If IsNumeric(Me.txt検索_最低価格) Then
sql = sql & " AND 価格 >= " & txt検索_最低価格
End If
If IsNumeric(Me.txt検索_最高価格) Then
sql = sql & " AND 価格 <= " & txt検索_最高価格
End If
[商品検索サブ画面].Form.RecordSource = sql
End Sub
サブフォームの選択行処理の不具合対応
サブフォームに選択行の背景色変更のためのVBAコードを埋め込んでいる場合、以下のコードのままではエラーが発生しました。
Private Sub Form_Current()
[txtカレント商品ID] = [txtID]
End Sub
エラーの内容は、「指定した式に、Microsoft Access が見つけることができないフィールド、コントロール、プロパティ名が含まれています。」というもので、どうにもレコードソースを設定する前に一度呼ばれているのか、画面表示時に2回呼び出されており、その内の最初の一回目で失敗しているようだったので、Errorをキャッチしてなにもせずにスルーすることでなんとかなりました。
Private Sub Form_Current()
On Error GoTo Err_Fucntion
[txtカレント商品ID] = [txtID]
Err_Fucntion:
End Sub
ちなみに項目を角括弧[]で囲んでいる時といない時で動作が違ったのですが、なぜかは不明です。
また、背景色用テキストボックスのタブインデックスの番号がサブフォーム内で一番若い番号の場合、画面表示時に以下のような状態となりました。
こちらは背景色用テキストボックスのタブインデックスの番号を変更することで解決します。