ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.4003726 ACCESSでコンボボックスにSQLで抽出した値を表示したい
質問者:isas-isas いつもお世話になっております。
ACCESS初心者です。
テキストボックスに入力したフリガナから、あいまい検索させ抽出した
ものをコンボボックスに表示させたいのですが、うまくいきません。。
(コンボボックスに何も表示されないです)
過去の質問やネット検索でも調べたのですがイマイチ分かりませんでした。
どなたか詳しい方、ご教示いただけると嬉しいです。
OS:windowXP
ACCESS:Ver2003

Private Sub テキストボックス名_Afterupdate()
Me.コンボボックス名.RowSource = "SELECT フィールド名 FROM テーブル名 WHERE フリガナ LIKE '" & Me!テキストボックス名 & "*';"
End Sub

どうぞよろしくお願いいたします。
困り度:
  • 困っています
質問投稿日時:
08/05/07 10:34
この質問に対する回答は締め切られました。

回答良回答20pt

ANo.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
回答者:nda23
種類:回答
どんな人:専門家
自信:参考意見
回答日時:
08/05/07 19:42
この回答へのお礼私のやりたかった事は
Me.コンボボックス名.RowSource = "SELECT [T得意先名].[得意先名] FROM T得意先名 WHERE 得意先名フリガナ LIKE'" & Me!テキストボックス & "*';"
と記述しましたら実現することが出来ました。
[]が必要だったとの見解でいいのでしょうか。。。^^;
私もリクエリが無いと指摘を頂いた時に、「そっか!」と思ったのですが
何故かrequeryを記述しなくても動作しております・・・^^?
それが何故なのかよくわかりませんが、とりあえずやりたかった事は
実現する事が出来ました。

色々ご回答いただき、本当にどうもありがとうございましたm(__)m

回答良回答10pt

ANo.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
回答者:Husky2007
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/05/07 13:13
この回答へのお礼たびたびの回答、ありがとうございます。
これは、コンボボックスに値をセットするための関数を作る・・・
ということで認識はあってますでしょうか?

試してはみたのですが、まだまだ勉強不足で理解が足りず、
よくわかりませんでした・・・すみませんm(__)m

私のやりたかった事は
Me.コンボボックス名.RowSource = "SELECT [T得意先名].[得意先名] FROM T得意先名 WHERE 得意先名フリガナ LIKE'" & Me!テキストボックス & "*';"
と記述しましたら実現することが出来ました。
[]が必要だったとの見解でいいのでしょうか。。。^^;
requeryをしなくても動作するのですが、それが何故なのかよくわかりません

色々としていただき、本当にどうもありがとうございましたm(__)m

回答

ANo.4 私の回答のように、テーブル構造とデータとVBAコード全文を示されたし。
回答者:Husky2007
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/05/07 12:56
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.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のリクエリが不足しています。

※なお、コンボ_検索結果.値集合タイプ=値リストのやり方もあります。
回答者:Husky2007
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/05/07 11:53
この回答へのお礼ご回答ありがとうございますm(__)m

上記コードをコピーさせてもらい、該当箇所を変更(コントロール名など)
して試してみたのですが、やはりコンボボックスには何も表示されませんでした(;_;)

根本的に何かが違うのでしょうか?

No.2の方のお礼のところに、もう少し詳しい状況を書いてみましたので
よろしければ読んでやってくださいm(__)m

引き続きよろしくお願いいたします。

回答

ANo.2 以下の順になっているか確認してください。
Me.コンボボックス名.RowSource = "SELECT 〜略
Me.コンボボックス名.ReQuery

SQLを変更する前にQueryしても無駄ですから・・・
この通りになっているのに何も表示されないとしたら、
テーブル内に該当するものが無い場合だけです。
回答者:nda23
種類:回答
どんな人:専門家
自信:参考意見
回答日時:
08/05/07 11:47
この回答へのお礼ご回答ありがとうございますm(__)m

記述している順番はその通りになっております。
Me.コンボボックス名.ReQueryを下行に書きましたが駄目でした。
テーブルを直接開いて確認すると、検索値に該当するレコードが
存在しているのですが。。。(;_;)

何か私が基本的な所で間違っているのでしょうか〜

もう少し詳しく書きますと、
テーブル名:T得意先名(ID、得意先名、フリガナと3つのフィールドを持ってます)
上記テーブルから「txt検索値」に入力したフリガナ(半角カタカナ)であいまい検索させた結果を
「cob結果」に表示させたいのです。。

テーブル「T得意先名」の「フリガナ」フィールドにはウチュウという文字が
入力されたレコードがありますが、
txt検索値にウチュウと入力しても何も表示されません。
コンボボックスに表示したいのは「得意先名」なのですが。。。

何度もすみません
よろしくお願いいたします。m(__)m

回答

ANo.1 再クエリしていないのでは?
Me.コンボボックス名.ReQuery

RowSourceをいくら変更しても、そのSQLを「実行」しなければ、コンボボックスの「ネタ」は更新されません。
回答者:nda23
種類:回答
どんな人:専門家
自信:自信あり
回答日時:
08/05/07 11:16
この回答へのお礼早速の回答ありがとうございますm(__)m

me.コンボボックス名.ReQuery
を追加してみましたが、やはりコンボボックスには何も表示されませんでした。。。

引き続きよろしくお願いいたしますm(__)m