• ベストアンサー

Accessのコンボボックスで表示させるデータを1500件の中から条件値で絞り込むにはどうしたらいいのでしょうか?

Access2003を使用しています 次のようなことをしたいのですが、方法がわからず悩んでいます。 「対応履歴」というフォームがあります。 その中にテキストボックス「ユーザNO」と「顧客名」があります。 ●このフォームの「顧客名」を入力したら、「ユーザNO」が自動的に入るようにしたいです●  (顧客から問合せが入った時点で顧客から聞きだせるのは顧客名で、ユーザIDは受付担当者がデータベースで調べたあとじゃないとわからないからです)。 「顧客名」はコンボボックスにして抽出をしたいです。 それの元ソースは、テーブル「顧客情報」から引っ張りたいのですが、1500件ほどあるので、見つけるのが困難なのがネックです。 そこで私が思いついたのは、抽出条件を指定するテキストボックスを別に設けて、そこに入力した文字を含む顧客名だけを顧客名コンボボボックスに表示させる方法です。([山]と入力すれば、山中、大山、(株)山田屋など「山」を含むすべての顧客名が候補にあがる) その中から該当する顧客名を選ぶと、ユーザNOテキストボックスにも自動的に入力される・・・といったものです。 このようなことは可能でしょうか? とすれば、どのような設定をすればいいのでしょうか? 私なりにやってみましたが、「顧客名」コンボボックスの候補の絞込みが出来ません。 私が考えた方法以外でも構わないのです。 F対応履歴の入力画面で「顧客名」から「ユーザNO」(T顧客情報にある顧客名とユーザNO)が連動されて入力できればいいのです。 F対応履歴 ユーザNO・・・テキストボックス 顧客名・・・コンボボックス 対応履歴ID T対応履歴 ユーザNO・・・テキスト型 顧客名・・・テキスト型 対応履歴ID・・・オートナンバー―――主キー T顧客情報 ユーザNO・・・テキスト型―――主キー 顧客名・・・テキスト型 フリガナ・・・テキスト型 どなたかお知恵をお貸しください。 よろしくお願いいたします。

  • 375k
  • お礼率60% (176/289)

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

  • ベストアンサー
  • venzou
  • ベストアンサー率71% (311/435)
回答No.2

まず、電話では漢字が分かり難い。 渡辺、渡邉、渡邊など、同音異字は沢山あります。 正確な氏名を聞きだすには手間が掛かります。 フリガナがあるなら、フリガナで抽出の方が良いと思います。 -------------------------------------------------- 同姓同名の顧客が居たらどうするのか? 名前だけでは顧客が特定出来ません。 質問の、T顧客情報には、名前とフリガナしか書いていませんが、 その他にも情報があるなら、それも使って絞り込む必要があります。 コンボボックスでは表示出来る情報に限りがあるので、 別途検索フォームを作る方が良いと思います。 その場合の手順は・・・ ・F対応履歴に「検索」ボタンを作る。 ・ボタンを押すと検索用のフォームが開く。 ・検索用のフォームでは、氏名やフリガナ、その他の情報を使って、  顧客を絞り込みむ。 ・顧客を選択したら、F対応履歴へ情報を送る。 検索フォームの仕様は・・・ ・T顧客情報を元にした、帳票フォーム ・フォームヘッダに条件を入力するテキストボックスを作る ・条件が入力されたら、Filterプロパティ等でレコードを絞り込む ・詳細には「選択」ボタンを作っておき、ボタンを押したら、  F対応履歴の「ユーザNO」と「顧客名」を変更し、閉じる こういう感じの方が良いと思います。いかがでしょう? 検索フォームの詳細に関しては、ご希望があれば補足させて頂きます。

375k
質問者

補足

ご回答ありがとうございます。 ご回答者様のご提案を試してみたいので、検索フォームの設定の詳しい説明をいただいてもよろしいでしょうか? >・顧客を選択したら、F対応履歴へ情報を送る。 この部分が特にわかりません。 お手数をおかけして申し訳ありませんがお願いします。

その他の回答 (3)

  • venzou
  • ベストアンサー率71% (311/435)
回答No.4

No2回答者です。 F対応履歴の「検索」ボタンのイベントプロシージャは 下記のような感じで。 ---------------------------------------------------------- Private Sub コマンド検索_Click()  DoCmd.OpenForm "F顧客情報検索", acNormal, , , , acDialog End Sub ----------------------------------------------------------- acDialog を指定した方が良いと思います。 =========================================================== 次に検索フォーム「F顧客情報検索」の詳細です。 各コントロールの名前を下記の様に仮定します。 検索条件を入れるテキストボックス(フォームヘッダ等へ) ・検索フリガナ ・検索顧客名 (その他の情報があれば追加) 検索をキャンセルするためのボタン(フォームヘッダ等へ) ・コマンドキャンセル 顧客を選択するためのボタン(詳細へ) ・コマンド選択 その他のコントロール名はデータソースのフィールド名と 同じだと仮定します。 フォームのソースのサンプル ----------------------------------------------------------- Option Compare Database Option Explicit 'フォームのフィルタを更新するためのサブルーチン Private Sub フィルター更新()  Dim strFilter As String  strFilter = ""  If "" & Me![検索フリガナ] <> "" Then   If strFilter <> "" Then    strFilter = strFilter + " and "   End If   strFilter = strFilter + "フリガナ like '*" & Me![検索フリガナ] & "*'"  End If  If "" & Me![検索顧客名] <> "" Then   If strFilter <> "" Then    strFilter = strFilter + " and "   End If   strFilter = strFilter + "顧客名 like '*" & Me![検索顧客名] & "*'"  End If  'その他の条件があれば、同様の処理を追加  'フィルターの設定  If strFilter <> "" Then   Me.Filter = strFilter   Me.FilterOn = True  Else   Me.FilterOn = False  End If End Sub '検索用のテキストボックスが更新されたらフィルタを更新 'そして次の項目へ移動 Private Sub 検索フリガナ_AfterUpdate()  フィルター更新  Me![検索顧客名].SetFocus End Sub Private Sub 検索顧客名_AfterUpdate()  フィルター更新  Me![検索フリガナ].SetFocus End Sub Private Sub コマンドキャンセル_Click()  DoCmd.Close End Sub Private Sub コマンド選択_Click()  'F対応履歴が開いている場合、データを更新  If SysCmd(acSysCmdGetObjectState, acForm, "F対応履歴") <> 0 Then   '↓ここが「F対応履歴へ情報を送る」と表現した部分です。   Forms![F対応履歴]![ユーザNO] = Me![ユーザNO]   Forms![F対応履歴]![顧客名] = Me![顧客名]  End If  DoCmd.Close End Sub ----------------------------------------------------------- 細かい説明は割愛しますので、 詳細はソースとコメントを読んで下さい。 不明な点があれば、補足欄へお願いします。

noname#140971
noname#140971
回答No.3

クエリ方式: Option Compare Database Option Explicit Private Sub Form_Current()   Me.テキスト_顧客名 = DLookup("KName", "Customer", "ID=" & Nz(Me.テキスト_顧客ID, 0))   Me.テキスト_顧客ID.SetFocus   Me.コンボ_顧客名一覧.Visible = False End Sub ・・・・ Private Sub テキスト_顧客名_AfterUpdate()   Dim strRowSource As String      If Len(Me.テキスト_顧客名 & "") > 0 Then     Me.コンボ_顧客名一覧.Requery     If Me.コンボ_顧客名一覧.ListCount <> 0 Then       Me.コンボ_顧客名一覧.SetFocus       Me.コンボ_顧客名一覧.Dropdown       Me.コンボ_顧客名一覧 = Me.コンボ_顧客名一覧.ItemData(0)     Else       MsgBox "該当する顧客名は登録されていません。"     End If   End If End Sub 値集合ソース=SELECT Customer.ID, Customer.KName FROM Customer WHERE (((Customer.KName) Like Forms!フォーム2!テキスト_顧客名 & "*")); このように、コンボボックスの値集合ソースをクエリにすれば、自作関数は無用。 もちろん、検索は<フリガナ>ですよ。

noname#140971
noname#140971
回答No.1

Cutomer: ID__KName 01__山田 太郎 02__山下 達郎 03__田中 一郎 04__田上 五郎 例えば、このようなテーブル[Customer]があったとします。 フォームには、[テキスト_顧客ID]と[テキスト_顧客名]を並べます。 まあ、IDとIDに基づく参照の関係です。 [テキスト_顧客ID]=0ならば、[テキスト_顧客名]が検索のための入力欄になります。 [テキスト_顧客ID]<>0ならば、[テキスト_顧客名]はロックします。 さて、[テキスト_顧客名]で検索する文字が入力されると[コンボ_顧客名一覧]のリストが更新される。 しかし、この[コンボ_顧客名一覧]は検索フォームみたいなものだから常時表示する必要はないです。 場所も、フォームのフッター部で構わないです。 以上のようなコードを示して欲しいとのことですが、これが実に至難かと思います。 1、フォームカレントの時、既存レコードの顧客名をどのように表示するのか? 2、直接にIDを入力するのを許すのか否か? 3、許した場合、どのようにカーソルを移動させるのか? 次は、値リストを使った場合のサンプルコードです。 同じテーブルとフォームを用意すれば、’山’と入力すれば山田 太郎、山下 達郎がコンボボックスに。 山下 達郎を選べばIDも更新されるのが確認されるでしょう。 Option Compare Database Option Explicit Private Sub Form_Current()   Me.テキスト_顧客名 = DBLookup("KName", "Customer", "ID=" & Nz(Me.テキスト_顧客ID, 0))   Me.テキスト_顧客ID.SetFocus   Me.コンボ_顧客名一覧.RowSource = ""   Me.コンボ_顧客名一覧.Visible = False End Sub Private Sub コンボ_顧客名一覧_Click()   Me.テキスト_顧客ID = Me.コンボ_顧客名一覧 End Sub Private Sub テキスト_顧客ID_AfterUpdate()   Me.テキスト_顧客名 = DBLookup("KName", "Customer", "ID=" & Nz(Me.テキスト_顧客ID, 0))   Me.テキスト_顧客名.SetFocus End Sub Private Sub テキスト_顧客ID_LostFocus()   Dim isLookupKName As Boolean   isLookupKName = CBool(Nz(Me.テキスト_顧客ID, 0) = 0)   Me.テキスト_顧客名.Locked = Not isLookupKName   Me.テキスト_顧客名.TabStop = Not isLookupKName   Me.コンボ_顧客名一覧.Visible = isLookupKName End Sub Private Sub テキスト_顧客名_AfterUpdate()   Dim strRowSource As String      If Len(Me.テキスト_顧客名 & "") > 0 Then     strRowSource = DBSelect("SELECT ID, KName FROM Customer WHERE KName LIKE '" & Me.テキスト_顧客名 & "%'")     If strRowSource <> "" Then       Me.コンボ_顧客名一覧.RowSource = strRowSource       Me.コンボ_顧客名一覧.SetFocus       Me.コンボ_顧客名一覧.Dropdown       Me.コンボ_顧客名一覧 = Me.コンボ_顧客名一覧.ItemData(0)     Else       MsgBox "該当する顧客名は登録されていません。"     End If   End If End Sub ところで、かかる自作の DBLookup関数、DBSelect関数を作成する方式が質問者の望みなんでしょうか? 確かに、クエリも用意する必要はないし Jetよりも高速に動作するでしょう。 しかし、このように ADO を使うかどうかですよ。 仮に、ADO を使わなきゃ、DBLookup=>DLookup、DBSelect=>クエリに置き換える必要があります。 そこんとこを明確にすれば、クエリ方式の回答も付くかと思います。 私は、一切、クエリを使わないので、その辺は不得手です。 なお、ADO方式でも構わなきゃー、更に、DBLookup関数、DBSelect関数を補足します。

関連するQ&A

  • accessのコンボボックスのことで質問です。

    accessを勉強しているのですが、ちょっとしたことで分からなくなってしまいました・・。 質問の内容なのですが、まずフォーム上にコンボボックスAとコンボボックスBを配置するとします。 レコードソースには仮に[情報テーブル]というテーブルが選択されているとします。 コンボボックスAには[情報テーブル]のフィールド名が、 例えば[顧客NO]、[商品]、[値段]というフィールド名が入っているとし、フィールドにはそれぞれ10件ずつデータが入力されています。 そしてコンボボックスAで[顧客NO]を選択するとコンボボックスBに[顧客NO]の10件のデータが挿入され、選択できるようにしたいのです。 他のフィールド名を選んだときにも同じようにコンボボックスBにフィールドのデータが入るようにしたいと思っています。 コンボボックスAにテーブル名を入れることはできたのですが、 コンボボックスAで選択されたフィールドのデータを、コンボボックスBで選択できるようにするというやり方がわからないのです・・。 accessは2002を使っています。 よろしくお願いします。

  • ACCESS2000 コンボボックス

    こんにちわ。 コンボボックスを教えて下さい。 テーブル T_分類(1) ・分類(1)  オートNo ・分類(1)名 テキスト テーブル T_分類(2) ・分類(2)  オートNo ・分類(1)  数値 ・分類(2)名 テキスト 2つのテーブルを作成して、フォームも作成しております。 入力する時、分類(1)も(2)テキストボックスで選ぶようにしています。 それで、分類(1)を選ぶと、分類(2)のテキストボックスに分類(1)の分しか表示しないようにしたいのですが・・。 どのようにすればよいでしょうか? 初心者な者で、分かりやすく教えていただければ有りがたいです。

  • コンボBOXで抽出した値をテキストBOXに表示したい

    入力用フォームで注文フォームを作成しているのですが、コンボBOXで商品Noを抽出し、テキストBOXに商品名を表示したいのですが、 Private Sub コンボ1_AfterUpdate() Me!テキスト1 = Me!コンボ1.column(1) End Sub と入力したのですが、他の行にも同じ商品名が表示されます。 商品NoをコンボBOXで指定し、数量を手入力という入力フォームを作成したいのです。 作成方法を教えてください。 よろしくおねがいします

  • ACCESSのコンボボックスの表示について

    質問をお願いいたします。 現在、売上入力用のフォームを作成し、売上対象の方を選択するのに、コンボボックスで、契約者名簿からデータを引っ張ってきています。 この契約者名簿ですが、 「契約ID] 「顧客ID] 「姓」 「名」 「フリガナ」 で、フリガナだけ表示しないように列数を設定し、フリガナの昇順で並べています。 表示は「0cm;2cm;2cm;2cm」にし、顧客IDを選んだり、あいうえお順で選べるようにしています。 ところが、コンボボックスから選ぶ時はわかりやすいのですが、入力後は連結列を1にすると、顧客の氏名のみがボックスには表示されます。 この表示を「顧客番号」&「姓」もしくは「姓」&「名」といった感じで、表示する事は可能でしょうか。 入力時は問題無いのですが、後で閲覧時に、同姓の方が多いため、いちいち右の三角をクリックして、どの顧客かチェックするといった非効率な状態になっています。 初歩的な質問だとは思いますが、過去ログを見ても、どうしてもわからなかったため、何卒よろしくお願いいたします。

  • アクセスのフォームのコンボボックスに表示させる対象をユーザーNo. で絞りたいのですが、どうすればよいでしょうか?

    Access2003を使用しています。 フォームに配したコンボボックスのことで教えてください。 フォームには、ユーザーNoを入れるテキストボックスがあります。 その下にはユーザーが所有している商品番号を入れるコンボボックスがあります。 ユーザーナンバーを手打ちで入力すると、商品番号のコンボボックスにはそのユーザーが所有している番号だけが表示されるようにしたいのです(商品番号は1000個ぐらいあります)。 ユーザーが所有している商品番号は、商品リストと顧客名簿というテーブルを連結させたクエリで出来上がっています。 どのようにしたらよいのでしょうか? ご教示をお願いいたします。

  • コンボボックスのテキスト窓にデータを表示させたい

    オフィスソフト環境:ACCESS2007(諸般の事情により使用中) [アドバイスの背景とお願いしたいこと] ◆アドバイスの背景 コンボボックスを使ったフォームで入力を行っています。テーブルにはID(数値)「食材名、素材名」が入力されるのですが、フォームのコンボボックス「2段目」には素材名(入力済)が表示されません。但し、1段目のコンボボックスには数値ではなく食材名(入力済)が表示されています。 ◆お願いしたいこと(実現したいこと) 入力フォームを過去入力を遡り確認することもありますので、1段目同様に素材名(入力済)を表示させたいと思っています。 [対象オブジェクト] ◆テーブル:T_食材管理「質問対象フィールドのみ記載」 ・テーブル名:T_食材管理:食材名(数値型)、素材名(数値型) ・テーブル名:T_食材名:食材名ID、食材名 ・テーブル名:T_素材名:素材名ID、素材名、食材名ID ◆フォーム:F_食材管理「質問対象オブジェクトのみ記載」 ・フォーム(F_食材管理)のレコードソース名:T_食材管理 [1段目コンボボックスの設定] ・コンボボックス名:食材名(参照テーブル名:T_食材名) ・クエリビルダ設定フィールド:「食材名ID、食材名」 ・書式(列数):2 ・書式(列幅):0cm;2.551cm ・コントロールソース:SELECT T_食材名.食材名ID, T_食材名.食材名 FROM T_食材名 [2段目コンボボックスの設定] ・コンボボックス名:素材名(参照テーブル名:T_食材名) ・クエリビルダ設定フィールド:「素材名ID、素材名、食材名ID(抽出条件:[Forms]![F_食材管理]![食材名])」 ・プロパティーの書式(列数):3 ・プロパティーの書式(列幅):0cm;2.551cm;0cm ・コントロールソース:SELECT T_素材名.素材名ID, T_素材名.素材名, T_素材名.食材名ID FROM T_素材名 WHERE (((T_素材名.食材名ID)=[Forms]![F_食材管理]![食材名])); 説明にだらだらの羅列感をお感じになられるもしれませんが、簡潔に説明ができず申し訳ございません。宜しくお願いします。

  • Accessのテキストボックスとコンボボックスの違い

    フォームにテキストボックスを3ケ用意し、テキストボックス名をtxt1,txt2,txt3としました。これにコマンドスイッチを作成し、機能を再クエリと設定しました。 フォームのサブフォームに再クエリの結果を表示するようにしました。 クエリのテキストボックス1の抽出条件は 条件  [Forms]![フォーム名]![txt1] または [Forms]![フォーム名]![txt1] Is Null    [Forms]![フォーム名]![txt1] Is Null テキストボックス2の抽出条件は 条件  [Forms]![フォーム名]![txt2] Is Null または [Forms]![フォーム名]![txt2]  [Forms]![フォーム名]![txt2] Is Null テキストボックス3の抽出条件は 条件  [Forms]![フォーム名]![txt3] Is Null または [Forms]![フォーム名]![txt3] Is Null [Forms]![フォーム名]![txt3] と設定し、テキストボックスにデータを入力し実行すると 正しい結果が得られるのですが、テキストボックスをコンボボックスに変更し、コンボボックス名をtxt1,txt2,txt3 とすると、抽出されません。 コンボボックスをテキストボックスのように扱うのには どうするのでしょうか。教えてください。

  • access クエリコンボボックスについて

    フォームのメニュー画面でレポート印刷ボタンを作りました。 印刷ボタンを押すと[抽出する都道府県は?] とパラメーター入力が表示されるようにしてあるのですが、 それを入力式ではなく、コンボボックスにして選択式にしたいのですが、 どのようにすれば良いのでしょうか? コンボボックスにマクロをつけて クエリの抽出条件のところに[forms]![フォーム名]![コンボ名] を入力しても、実行したときになにも抽出されません。 なにがどのように違っているのでしょうか? 説明が分かりにくくて申し訳ないのですが、 わかる方いらっしゃいましたらぜひ教えていただきたいです。 よろしくお願いいたします。

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

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

  • Accessのコンボボックスを使ったデータ入力

    Accessは初心者です。宜しくお願いします。 コンボボックスを使ったデータ入力で不具合が生じました。 以下のデーターベースを使用します。 ①テーブル:T_食品   フィールド:食品コード、分類コード、食品名 ②テーブル:T_食品分類  フィールド:分類コード、分類名 ③テーブル:T_材料  フィールド:コード、食品コード、分量 ④クエリ:Q_材料入力用  フィールド:コード(T_材料)、食品コード(T_材料)、分類コード[T_食品]、食品名(T_食品)、分量(T_材料) ※食品コード、分類コードはリレーションシップしてあります。 料理のレシピを入力するために、レコードソースがQ_材料入力用の”材料入力”の帳票フォームを作成しました。 理想としては、食品分類の”分類名”をコンボボックスで選択後、該当する食品の”食品名”をコンボボックスで選択します。そして”分量”を入力する形でした。 ”分類名”のコンボボックスは、T_食品分類をコントロールソースで設定を行い、[更新後処理]は以下の通りにしました。 Me!食品名.Requery ”食品名”のコンボボックスは、T_食品をコントロールソースして、以下の値集合ソースにしました。 SELECT T_食品.食品名, T_食品.分類名 FROM T_食品 WHERE (((T_食品.分類コード)=[Forms]![材料入力]![分類名])); 以上の設定でコンボボックスは成功しましたが、入力を行うたびに、T_食品内に入力した食品のデータが追加される現象が出ました。 何が原因だったのか、対策方法をご教授お願いします。