• ベストアンサー

ACCESSでコンボボックスにSQLで抽出した値を表示したい

いつもお世話になっております。 ACCESS初心者です。 テキストボックスに入力したフリガナから、あいまい検索させ抽出した ものをコンボボックスに表示させたいのですが、うまくいきません。。 (コンボボックスに何も表示されないです) 過去の質問やネット検索でも調べたのですがイマイチ分かりませんでした。 どなたか詳しい方、ご教示いただけると嬉しいです。 OS:windowXP ACCESS:Ver2003 Private Sub テキストボックス名_Afterupdate() Me.コンボボックス名.RowSource = "SELECT フィールド名 FROM テーブル名 WHERE フリガナ LIKE '" & Me!テキストボックス名 & "*';" End Sub どうぞよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.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

isas-isas
質問者

お礼

私のやりたかった事は Me.コンボボックス名.RowSource = "SELECT [T得意先名].[得意先名] FROM T得意先名 WHERE 得意先名フリガナ LIKE'" & Me!テキストボックス & "*';" と記述しましたら実現することが出来ました。 []が必要だったとの見解でいいのでしょうか。。。^^; 私もリクエリが無いと指摘を頂いた時に、「そっか!」と思ったのですが 何故かrequeryを記述しなくても動作しております・・・^^? それが何故なのかよくわかりませんが、とりあえずやりたかった事は 実現する事が出来ました。 色々ご回答いただき、本当にどうもありがとうございましたm(__)m

その他の回答 (5)

noname#140971
noname#140971
回答No.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

isas-isas
質問者

お礼

たびたびの回答、ありがとうございます。 これは、コンボボックスに値をセットするための関数を作る・・・ ということで認識はあってますでしょうか? 試してはみたのですが、まだまだ勉強不足で理解が足りず、 よくわかりませんでした・・・すみませんm(__)m 私のやりたかった事は Me.コンボボックス名.RowSource = "SELECT [T得意先名].[得意先名] FROM T得意先名 WHERE 得意先名フリガナ LIKE'" & Me!テキストボックス & "*';" と記述しましたら実現することが出来ました。 []が必要だったとの見解でいいのでしょうか。。。^^; requeryをしなくても動作するのですが、それが何故なのかよくわかりません 色々としていただき、本当にどうもありがとうございましたm(__)m

noname#140971
noname#140971
回答No.4

私の回答のように、テーブル構造とデータとVBAコード全文を示されたし。

noname#140971
noname#140971
回答No.3

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のリクエリが不足しています。 ※なお、コンボ_検索結果.値集合タイプ=値リストのやり方もあります。

isas-isas
質問者

お礼

ご回答ありがとうございますm(__)m 上記コードをコピーさせてもらい、該当箇所を変更(コントロール名など) して試してみたのですが、やはりコンボボックスには何も表示されませんでした(;_;) 根本的に何かが違うのでしょうか? No.2の方のお礼のところに、もう少し詳しい状況を書いてみましたので よろしければ読んでやってくださいm(__)m 引き続きよろしくお願いいたします。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

以下の順になっているか確認してください。 Me.コンボボックス名.RowSource = "SELECT ~略 Me.コンボボックス名.ReQuery SQLを変更する前にQueryしても無駄ですから・・・ この通りになっているのに何も表示されないとしたら、 テーブル内に該当するものが無い場合だけです。

isas-isas
質問者

お礼

ご回答ありがとうございますm(__)m 記述している順番はその通りになっております。 Me.コンボボックス名.ReQueryを下行に書きましたが駄目でした。 テーブルを直接開いて確認すると、検索値に該当するレコードが 存在しているのですが。。。(;_;) 何か私が基本的な所で間違っているのでしょうか~ もう少し詳しく書きますと、 テーブル名:T得意先名(ID、得意先名、フリガナと3つのフィールドを持ってます) 上記テーブルから「txt検索値」に入力したフリガナ(半角カタカナ)であいまい検索させた結果を 「cob結果」に表示させたいのです。。 テーブル「T得意先名」の「フリガナ」フィールドにはウチュウという文字が 入力されたレコードがありますが、 txt検索値にウチュウと入力しても何も表示されません。 コンボボックスに表示したいのは「得意先名」なのですが。。。 何度もすみません よろしくお願いいたします。m(__)m

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

再クエリしていないのでは? Me.コンボボックス名.ReQuery RowSourceをいくら変更しても、そのSQLを「実行」しなければ、コンボボックスの「ネタ」は更新されません。

isas-isas
質問者

お礼

早速の回答ありがとうございますm(__)m me.コンボボックス名.ReQuery を追加してみましたが、やはりコンボボックスには何も表示されませんでした。。。 引き続きよろしくお願いいたしますm(__)m

関連するQ&A