- ベストアンサー
ACCESSでコンボボックスにSQLで抽出した値を表示したい
いつもお世話になっております。 ACCESS初心者です。 テキストボックスに入力したフリガナから、あいまい検索させ抽出した ものをコンボボックスに表示させたいのですが、うまくいきません。。 (コンボボックスに何も表示されないです) 過去の質問やネット検索でも調べたのですがイマイチ分かりませんでした。 どなたか詳しい方、ご教示いただけると嬉しいです。 OS:windowXP ACCESS:Ver2003 Private Sub テキストボックス名_Afterupdate() Me.コンボボックス名.RowSource = "SELECT フィールド名 FROM テーブル名 WHERE フリガナ LIKE '" & Me!テキストボックス名 & "*';" End Sub どうぞよろしくお願いいたします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
もしかして、txt検索値の内容を書き変えただけで、コンボボックスの表示内容の変化を期待していませんか? (1)txt検索値の内容を変更しても、フォーカスを移動する等の行動を取るまで、AfterUpdateイベントは発生しません。 (2)Requeryしただけではコンボボックスのリストが変化するだけで、現在の表示内容は変化しません。 AfterUpdateイベントの発生はプログラムでどうにかなるモノではありません。 Changeイベントでは1文字ずつイベントが発生するので、現実的ではないでしょう。 Requery後にコンボボックスの内容を変更したい場合は以下のコードを試してみてください。 With Me.コンボボックス名 .RowSource = "SELECT ~略 .ReQuery If .ListCount > 0 Then .Value = .ItemData(0) Else .Value = Null End If End With
その他の回答 (5)
補足: SQL文そのものを確認されたし。 1、標準モジュールにDBSelect関数をコピペ。 2、イミディエイトウインドウでテスト。 注意: DBSelect関数では、ワイルドカードは'*'でなく'%'。(通常は、もちろん'*') [イミディエイト] ? DBSelect("SELECT フィールド名 FROM テーブル名 WHERE フリガナ LIKE 'ウチュウ%';") で、下記のように該当するレコードが表示されますか? [イミディエイト] ? DBSelect("SELECT * FROM Customer") 1;鈴木 一郎;スズキ イチロウ;2;杉下 五郎;スギシタ ゴロウ;3;中村 主水;ナカムラ モンド; ? DBSelect("SELECT * FROM Customer WHERE Yomi LIKE 'ス%'") 1;鈴木 一郎;スズキ イチロウ;2;杉下 五郎;スギシタ ゴロウ; ? DBSelect("SELECT * FROM Customer WHERE Yomi LIKE 'スズ%'") 1;鈴木 一郎;スズキ イチロウ; ? DBSelect("SELECT * FROM Customer WHERE Yomi LIKE '%ロウ'") 1;鈴木 一郎;スズキ イチロウ;2;杉下 五郎;スギシタ ゴロウ; このように DBSelect関数はコンボボックスのローソース等をセットするための関数です。 Public Function DBSelect(ByVal strQuerySQL As String, _ Optional ByVal strSeparator1 As String = ";", _ Optional ByVal strSeparator2 As String = "") As String On Error GoTo Err_DBSelect Dim I As Integer Dim J As Integer Dim R As Integer Dim C As Integer Dim M As Integer Dim N As Integer Dim rst As ADODB.Recordset Dim fld As ADODB.Field Dim Datas As String Set rst = New ADODB.Recordset ' ================= ' Begin With: rst ' ----------------- With rst .Open strQuerySQL, _ CurrentProject.Connection, _ adOpenStatic, _ adLockReadOnly If Not .BOF Then M = .RecordCount - 1 N = .Fields.Count - 1 .MoveFirst For R = 0 To M For C = 0 To N Datas = Datas & .Fields(C) & strSeparator1 Next C If Len(strSeparator2) Then Datas = Datas & strSeparator2 End If .MoveNext Next R End If End With ' --------------- ' End With: rst ' =============== Exit_DBSelect: DBSelect = Datas Exit Function Err_DBSelect: MsgBox "SELECT 文の実行時にエラーが発生しました。(DBSelect)" & Chr$(13) & Chr$(13) & _ "・Err.Description=" & Err.Description & Chr$(13) & _ "・SQL Text=" & strQuerySQL, _ vbExclamation, " 関数エラーメッセージ" Resume Exit_DBSelect End Function
お礼
たびたびの回答、ありがとうございます。 これは、コンボボックスに値をセットするための関数を作る・・・ ということで認識はあってますでしょうか? 試してはみたのですが、まだまだ勉強不足で理解が足りず、 よくわかりませんでした・・・すみませんm(__)m 私のやりたかった事は Me.コンボボックス名.RowSource = "SELECT [T得意先名].[得意先名] FROM T得意先名 WHERE 得意先名フリガナ LIKE'" & Me!テキストボックス & "*';" と記述しましたら実現することが出来ました。 []が必要だったとの見解でいいのでしょうか。。。^^; requeryをしなくても動作するのですが、それが何故なのかよくわかりません 色々としていただき、本当にどうもありがとうございましたm(__)m
私の回答のように、テーブル構造とデータとVBAコード全文を示されたし。
Customer: ID_KName______Yomi _1_鈴木 一郎__スズキ イチロウ _2_杉下 五郎__スギシタ ゴロウ _3_中村 主水__ナカムラ モンド フォーム1: 検索する読み_____[ス__________] コンボ_検索結果__[鈴木 一郎___] コンボ_検索結果.値集合タイプ=テーブル/クエリ コンボ_検索結果.列数=1 次は、フォーム1の[検索する読み]が入力されたら[コンボ_検索結果]に検索結果を表示するサンプルです。 1、Len(Me.検索する読み & "")で、入力の有無をチェック。 2、入力されていれば、LIKE文を使ったSQL文を作成しています。 3、テーブル/クエリをリクエリしています。 4、一応、トップのアイテムデータを選択表示しています。 Private Sub 検索する読み_AfterUpdate() If Len(Me.検索する読み & "") Then Me.コンボ_検索結果.RowSource = "SELECT Kname FROM Customer WHERE Yomi LIKE '" & Me.検索する読み & "*'" Me.コンボ_検索結果.Requery If Me.コンボ_検索結果.ListCount > 0 Then Me.コンボ_検索結果.Value = Me.コンボ_検索結果.ItemData(0) End If End If End Sub この方式は[コンボ_検索結果.RowSource]をその都度設定していますのでプロパティの設定は無用です。 上記コードと比較した場合、3のリクエリが不足しています。 ※なお、コンボ_検索結果.値集合タイプ=値リストのやり方もあります。
お礼
ご回答ありがとうございますm(__)m 上記コードをコピーさせてもらい、該当箇所を変更(コントロール名など) して試してみたのですが、やはりコンボボックスには何も表示されませんでした(;_;) 根本的に何かが違うのでしょうか? No.2の方のお礼のところに、もう少し詳しい状況を書いてみましたので よろしければ読んでやってくださいm(__)m 引き続きよろしくお願いいたします。
- nda23
- ベストアンサー率54% (777/1415)
以下の順になっているか確認してください。 Me.コンボボックス名.RowSource = "SELECT ~略 Me.コンボボックス名.ReQuery SQLを変更する前にQueryしても無駄ですから・・・ この通りになっているのに何も表示されないとしたら、 テーブル内に該当するものが無い場合だけです。
お礼
ご回答ありがとうございますm(__)m 記述している順番はその通りになっております。 Me.コンボボックス名.ReQueryを下行に書きましたが駄目でした。 テーブルを直接開いて確認すると、検索値に該当するレコードが 存在しているのですが。。。(;_;) 何か私が基本的な所で間違っているのでしょうか~ もう少し詳しく書きますと、 テーブル名:T得意先名(ID、得意先名、フリガナと3つのフィールドを持ってます) 上記テーブルから「txt検索値」に入力したフリガナ(半角カタカナ)であいまい検索させた結果を 「cob結果」に表示させたいのです。。 テーブル「T得意先名」の「フリガナ」フィールドにはウチュウという文字が 入力されたレコードがありますが、 txt検索値にウチュウと入力しても何も表示されません。 コンボボックスに表示したいのは「得意先名」なのですが。。。 何度もすみません よろしくお願いいたします。m(__)m
- nda23
- ベストアンサー率54% (777/1415)
再クエリしていないのでは? Me.コンボボックス名.ReQuery RowSourceをいくら変更しても、そのSQLを「実行」しなければ、コンボボックスの「ネタ」は更新されません。
お礼
早速の回答ありがとうございますm(__)m me.コンボボックス名.ReQuery を追加してみましたが、やはりコンボボックスには何も表示されませんでした。。。 引き続きよろしくお願いいたしますm(__)m
お礼
私のやりたかった事は Me.コンボボックス名.RowSource = "SELECT [T得意先名].[得意先名] FROM T得意先名 WHERE 得意先名フリガナ LIKE'" & Me!テキストボックス & "*';" と記述しましたら実現することが出来ました。 []が必要だったとの見解でいいのでしょうか。。。^^; 私もリクエリが無いと指摘を頂いた時に、「そっか!」と思ったのですが 何故かrequeryを記述しなくても動作しております・・・^^? それが何故なのかよくわかりませんが、とりあえずやりたかった事は 実現する事が出来ました。 色々ご回答いただき、本当にどうもありがとうございましたm(__)m