- ベストアンサー
Access フォームからの検索について
- Accessフォームで検索する方法として、エリア名、都道府県名、商品名をテキストで入力し、条件に合致するデータの商品IDと商品名を取得する方法を紹介します。
- 具体的には、エリア、都道府県、商品情報という3つのテーブルを利用し、それぞれのテキスト入力フィールドに入力された値とエリアコードまたは都道府県コードを比較して、合致するデータを取得します。
- この方法により、ユーザーが入力した条件に合致する商品の情報を取得することができます。フォーム作成後は、それぞれのフィールドとテーブルのカラムを紐付ける必要があります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
Option Compare Database Option Explicit Private Sub コマンド_検索_Click() Dim strSQL As String strSQL = "SELECT id, 名前 FROM 商品 WHERE 名前 LIKE [%1] AND 都道府県_id=[%2]" strSQL = Replace(strSQL, "[%1]", "'" & Me.テキスト_商品名 & "*'") strSQL = Replace(strSQL, "[%2]", Me.コンボ_都道府県) Me.リスト_検索商品一覧.RowSource = strSQL Me.リスト_検索商品一覧.Requery End Sub Private Sub コンボ_エリア_BeforeUpdate(Cancel As Integer) Me.コンボ_都道府県.Requery End Sub 必要最低限度のVBAコードは以上のようです。 <都道府県> id__エリア_id__名称 _1__________1__東京 _2__________2__大阪 テーブル都道府県は、このように修正しています。 画像は、商品検索フォームの実行画面です。 ************************ 値リストにして<Requery>を利用しない! ************************ その場合は、VBAでの介入の幅が増えます。 先の回答は、それを想定したものです。
その他の回答 (2)
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
Access には Lookup関数が用意されています。 それを使うのも一つの手です。 でも、Lookup関数は動作が遅いのが難点。 それを解消するには、次のようなDBLookup関数を作成するといいです。 3倍速で動作します。 ----------------------------- イミディエイト ----------------------------- ? DBLookup("エリアコード", "エリア", "エリア名='関東'") 1 Public Function DBLookup(ByVal strField As String, _ ByVal strTable As String, _ Optional ByVal strWhere As String = "", _ Optional ByVal ReturnValue = Null) As Variant On Error GoTo Err_DBLookup Dim DataValue Dim strQuerySQL As String Dim rst As ADODB.Recordset Set rst = New ADODB.Recordset strQuerySQL = "SELECT " & strField & " FROM " & strTable If Len(strWhere) > 0 Then strQuerySQL = strQuerySQL & " WHERE " & strWhere End If With rst .Open strQuerySQL, _ CurrentProject.Connection, _ adOpenStatic, _ adLockReadOnly If Not .BOF Then .MoveFirst DataValue = .Fields(0) End If End With Exit_DBLookup: On Error Resume Next rst.Close Set rst = Nothing DBLookup = Nz(DataValue, ReturnValue) Exit Function Err_DBLookup: MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _ "・Err.Description=" & Err.Description & Chr$(13) & _ "・SQL Text=" & strQuerySQL, _ vbExclamation, " 関数エラーメッセージ" Resume Exit_DBLookup End Function <コンボボックスを使ってもOK> テキストボックスでの入力ではなくコンボボックスで選択するように変更。 そうすれば、<エリア名>から<エリアコード>を取得する手順は省けます。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
質問の案件は、ごく普通の商品検索フォームですね。 課題1、SQL文の作成 SELECT 商品ID, 商品名 FROM 商品情報 WHERE 商品名 LIKE [%1] AND エリアコード = [%2] AND 都道府県コード = [%3] このSQL文の '[%1]'、'[%2]'、 '[%3]' を 'みか*','1'などに置換。 課題2、SQL文の実行結果をリスト表示。 課題2を安直に達成する方法は、課題1で作成したSQL文の実行結果をリストに表示される形で返す関数を作成することです。 <検索して表示に至るイメージ> 1、検索条件の入力。 検索条件に入力状況で検索ボタンを有効にする。 2、検索ボタンをクリック ・検索条件に応じてSQL文を完成する。 ・検索する関数をコールする。 ・検索結果が0であれば、0であったことをユーザに告知。 ・検索結果が1以上であれば、結果をリストボックスの値リストに設定。 <必要な知識> ・リストボックスの値リストの作り方。 ・SQL文の完成の仕方。 ・SQL文の実行結果を値リストの形で受け取る関数の作り方。 色々な方法がありますが、これが私が採用していた方法です。
お礼
ご連絡ありがとうございます。 SELECT 商品ID, 商品名 FROM 商品情報 WHERE 商品名 LIKE [%1] AND エリアコード = [%2] AND 都道府県コード = [%3] 上記のSQL文ですと、ユーザーはエリア名と都道府県名しか入力しない場合、 そのコードをどこからひっぱってきているのでしょうか??
お礼
回答ありがとうございます!!助かります!!