- ベストアンサー
Access2003コンボボックスの連動処理について
- Access2003の勉強を始めた初心者が、コンボボックスの連動処理について質問しています。
- 具体的には、A・B・Cの3つのコンボボックスを作り、Aの値に応じてB・Cの内容を絞り込みたいと考えています。
- AからBの連動はできたが、BからCへの連動処理がうまくいかないとのことです。どなたかご教授いただける方はいらっしゃいますか?
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
【お詫び】バグのお知らせ! Public Sub リスト_顧客名一覧_Update() Dim strQerySQL As String If Len(Me.コンボ_都道府県一覧 & "") > 0 And Len(Me.コンボ_市区町村一覧 & "") > 0 Then strQerySQL = "SELECT [都道府県_コード], [市区町村_コード], [名前] FROM 顧客台帳 " & _ "WHERE " & _ "[都道府県_コード]=" & Me.コンボ_都道府県一覧 & _ " AND " & _ "市区町村_コード = " & Me.コンボ_市区町村一覧 Me.リスト_顧客名一覧.RowSource = DBSelect(strQerySQL) Else Me.リスト_顧客名一覧.RowSource = "" End If End Sub [値集合タイプ]を’値リストにしてコードでリストをセットしているので<リクエリ>は必要ありません。なお、コンボ_市区町村一覧を空にした場合にリスト_顧客名一覧をクリアするには""をセットします。 バグがあったことを報告しお詫びしておきます。
その他の回答 (8)
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
お疲れ様です。 絞込み検索の第二段階は、少し、ややかおしいと思います。 そこで、実際の成功例を示します。 Option Compare Database Private Sub コンボ_市区町村一覧_BeforeUpdate(Cancel As Integer) リスト_顧客名一覧_Update End Sub Private Sub コンボ_都道府県一覧_BeforeUpdate(Cancel As Integer) Me.コンボ_市区町村一覧.Requery End Sub Public Sub リスト_顧客名一覧_Update() Dim strQerySQL As String If Len(Me.コンボ_都道府県一覧 & "") > 0 And Len(Me.コンボ_市区町村一覧 & "") > 0 Then strQerySQL = "SELECT [都道府県_コード], [市区町村_コード], [名前] FROM 顧客台帳 " & _ "WHERE " & _ "[都道府県_コード]=" & Me.コンボ_都道府県一覧 & _ " AND " & _ "市区町村_コード = " & Me.コンボ_市区町村一覧 Me.リスト_顧客名一覧.RowSource = DBSelect(strQerySQL) Me.リスト_顧客名一覧.Requery End If End Sub リストボックスは、[値集合タイプ]を’値リスト’に設定すればRowSource="1;100;鈴木一郎"で表示されます。つまりは、DBSelect関数の戻り値をセットすればよいということです。 さて、コンボボックスを使った時も、仕込むSQL文は同じで構いません。ビルドすれば、[]や()が付きまくりますが、そんなのは無くてもOK。ただ、ビルド出来ないと不自由ですので、ビルド要領は覚えられたがいいです。 とにもかくにも、質問者は成功の一歩手前におられます。 可能なんだということを確認されたら、もう一頑張りされて下さい。
お礼
参考になりました。ありがとうございました。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
Option Compare Database Private Sub コンボ_市区町村一覧_GotFocus() Me.コンボ_市区町村一覧.Dropdown ' ' 通常は、ここに先頭行を選択するコードを書きます。 ' End Sub Private Sub コンボ_都道府県一覧_BeforeUpdate(Cancel As Integer) Me.コンボ_市区町村一覧.Requery SendKeys "{TAB}", False End Sub 連動していることを示す図を添付しておきます。 【お詫び】 DBSelect関数が動作するには参照設定が必要でした。 その注意事項を割愛していました。 ご苦労されたことと思います。 お詫びしておきます。
お礼
参考になりました。ありがとうございました。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
SELECT [コード] FROM [市区町村一覧] WHERE [都道府県_コード]=1 上記SELECT文の =1 に相当する部分が抜けています。 SELECT 市区町村一覧.コード, 市区町村一覧.名称 FROM 市区町村一覧 WHERE (((市区町村一覧.都道府県_コード)=Forms!顧客名検索!コンボ_都道府県一覧)); [値集合ソース]で図のようにビルドしてみて下さい。
お礼
f_a_007 様 詳細にご教授下さいまして誠にありがとうございます。 また、お礼が遅くなり申し訳ありません。 お教えいただきました内容をコピペ等で思考錯誤しておりますが、 思うように動作せず、根本的な知識不足が原因だと考えました。 引き続きお教え頂きました内容を吸収するべく試行錯誤しようと思いますので 正常動作するまで、もうしばらくお時間頂けたらと思います。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
Public Function DBSelect(ByVal strQuerySQL 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 strList 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 If M > 99 Then MsgBox "読込む行総数を100行に下方修正しました。(DBSelect)", _ vbInformation, _ " お知らせ" M = 99 End If ReDim DataValues(M, N) ' ------------------------------------ ' 列情報を For-Next で配列に代入する ' ------------------------------------ .MoveFirst For R = 0 To M C = -1 For Each fld In .Fields ' ================= ' Begin With: fld ' ----------------- With fld C = C + 1 ' -------------------------- ' 列データを表示形式に変換 ' -------------------------- Select Case .Type Case adBoolean ' ブール型 DataValues(R, C) = IIf(.Value = -1, "Yes", "No") Case adChar, adVarChar ' 文字列型 DataValues(R, C) = Nz(.Value, "") Case adDBDate, adDBTimeStamp ' 日付型、日付/時刻型 DataValues(R, C) = .Value Case adSmallInt, adInteger ' 整数 DataValues(R, C) = FormatNumber(.Value, 0) Case adSingle, adDouble ' 浮動小数点型 DataValues(R, C) = FormatNumber(.Value, 2) Case adCurrency ' 通貨型 DataValues(R, C) = FormatCurrency(.Value, 2) Case Else DataValues(R, C) = .Value End Select End With ' --------------- ' End With: fld ' =============== Next fld .MoveNext Next R Else ReDim DataValues(0, 0) DataValues(0, 0) = "" strList = "" End If End With ' --------------- ' End With: rst ' =============== ' ------------------------------- ' セミコロン(;)で連結して1文に ' ------------------------------- For i = 0 To M For J = 0 To N strList = strList & DataValues(i, J) & ";" Next J Next i Exit_DBSelect: On Error Resume Next rst.Close Set rst = Nothing DBSelect = strList 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
お礼
参考になりました。ありがとうございました。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
テーブル:customer id: 1 名前:鈴木一郎 読み:suzuki ichiro,すずき いちろう,スズキ イチロウ 郵便番号:XXX-XXXX 都道府県:京都府 市区町村:京都市左京区○○町 番地:11-11 ビル等: ※顧客自体の検索は[読み]を使うのがセオリー。 都道府県検索:[京_________] 市区町村検索:[左_________] 上述のような'顧客マスター'ですと、'京'と'左'の2文字入力すれば、顧客鈴木一郎氏のレコードを含む一覧を作成することは可能。コンボボックスで探すという煩わしい作業は不要です。つまり、テーブルCだけがあれば事足りる筈。 テーブル:都道府県名一覧 テーブル:市区町村名一覧 を用意し、各コードを取得して、それで顧客の住所とするなんてことはしません。市区町村合併などに対応できないからです。 【質問への回答】 テーブル構造とデータは次のようだと仮定。 テーブル[都道府県一覧] コード|名称 ______1|北海道 ______2|青森 ______3|岩手 テーブル[市区町村一覧] 都道府県_コード|コード|名称 ___________________1|__100|札幌市 ___________________1|__101|中央区 ___________________1|__102|北区 テーブル[顧客台帳] id|都道府県_コード|市区町村_コード|名前 _1|__________________1|________________100|鈴木 一郎 _2|__________________1|________________100|中村 透 _3|__________________1|________________100|山田 太郎 【イミディエイトウインドウ】 ? DBSelect("SELECT [コード] FROM [市区町村一覧] WHERE [都道府県_コード]=1") 100;101;102; ? DBSelect("SELECT [名前] FROM [顧客台帳] WHERE [都道府県_コード]=1 AND [市区町村_コード]=100") 鈴木 一郎;中村 透; イミディエイトウインドウでのテスト結果を見ると、単一SELECT文でWGERE句を指定すれば良いことが判ります。 つまり、[値集合ソース]は、このようなもので事足りるってことです。 なお、一々、値集合ソースを書いてテストするのは面倒かと思います。 そこで、標準モジュールに DBSelect()を登録し、イミディエイトウインドウで確認されることをお勧めします。
お礼
f_a_007 様 ご教授ありがとうございます。 「イミディエイトウインドウ」に関しても全く知らなかった為非常に勉強になったと同時に便利に使わせていただきました。 今後も使わせていただきます。ありがとうございます。 1点気になる点としまして、私の勉強不足の為どこかの入力が抜けていると思われるのですが、お教え頂きました内容を[値集合ソース]に入力しても、構文エラーになってしまいます。 勿論、「イミディエイトウインドウ」では正常に処理されました。 ※テーブルはお教えいただきました内容に全て変更しました。 値集合ソースに入力する際は、SELECT [名前] FROM [顧客台帳] WHERE [都道府県_コード] AND [市区町村_コード] として入力しました。 初歩的な記述の事で恐縮ですが、もし原因が簡単に分かる様でしたらお手数ですが回答いただければ助かります。 よろしくお願い致します。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
補足、質問の意味。 3つのコンボボックスのコントロールソースが連動していれば、リクエリを実行するコードを書くだけでOK.。 問題は、コントロールソースの連動を保証しているのは何か? そのような連動データをいかにしてコントロールソースに反映しようとしているのか? この2点について何の説明もなく、ただ「出来ない!」では回答不能。 と、いうことです。
お礼
参考になりました。ありがとうございました。
補足
f_a_007様 ご回答ありがとうございます。 補足が遅くなり申し訳ございません。 下記「No.1」へ補足させていただきましたので、ご精査いただければ幸いです。 宜しくお願い致します。
- lv4u
- ベストアンサー率27% (1862/6715)
>>AからB・Cの連動は出来たのですが、あの値を反映したBからCへの連動処理ができません。 コンピュータというかプログラムは、人間の考えを読み取ることができません。 プログラムで指示したように動作し、指示しないことはやってはくれません。 できないことをプログラムで指示するように記述すればいいと思います。 なお、Accessに限りませんが、プログラムを書かなくとも、プロパティ等の設定をするだけで、いろんな動作がやってもらえることがあります。 でも、それは、Access自体を作ったMSのプログラマが想定している範囲内の機能についてだけであり、MSのプログラマが想定している使い方以上のことをやらせたい場合には、思ったような動きをしてくれないことになる可能性があります。 「ここの動きをちょっと変えたいだけなのに、どうしてこんなに大変になるのだ・・」と思えるかもしれませんね。 そして、参考資料などのとおりにやっても、うまくいかない場合は、そういう動作をするようにプログラムを自分で追加記述する必要があると思います。 P.S. 昔、あるソフトハウスで、Acccessでマルチユーザ向けのシステムを開発していたのを見たことあります。画面を見たら、簡単そうに作れるように思えたのですけど、マルチユーザ&画面の使いやすさを考慮したということで、膨大なコードが記述されていました。 この世界は、「入り口は簡単、でも、一歩踏み込むと地獄」って思えますね。
お礼
lv4u様 ご回答ありがとうございます。 仰られる通り、「入り口は簡単、でも、一歩踏み込むと地獄」だと感じております。 でも、いい機会ですのでプログラムに関してももっと掘り下げてみようと思います。 ありがとうございました!
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
>Aに都道府県 >Bに市区町村 >Cに個人名 >Aに値が入ったらそれに伴った絞り込み結果をB 質問1、一体、どういう仕掛けで実現するつもりなのか? >AからB・Cの連動は出来たのですが、 >あの値を反映したBからCへの連動処理ができません。 質問2、一体、どういう仕掛けで実現したのか?
お礼
ありがとうございました。
補足
f_a_007 様 ご回答ありがとうございます。 また、言葉足らずで申し訳ございません。補足させていただきます。 ************************************************************ フォーム名:計算フォーマット 構成 【テーブルA】 (1)都道府県コード (2)都道府県 【テーブルB】 (1)都道府県コード (2)市区町村コード (3)市区町村 【テーブルC】 (1)管理ID (2)市区町村コード (3)個人名 【コンボボックス1】 値集合タイプ:テーブル/クエリ 値集合ソース:テーブルA 更新後処理: Private Sub テーブルA_AfterUpdate() Me.テーブルB.Requery Me.テーブルC.Requery End Sub 【コンボボックス2】 値集合タイプ:テーブル/クエリ 値集合ソース:SELECT テーブルB.市区町村 FROM テーブルA INNER JOIN テーブルB ON テーブルA.都道府県コード = テーブルB.都道府県コード WHERE (((テーブルA.都道府県コード)=[Forms]![計算フォーマット]![テーブルA])); フォーカス取得時: Private Sub テーブルB_Enter() Me.テーブルB.Requery End Sub 【コンボボックス3】 値集合タイプ:テーブル/クエリ 値集合ソース:SELECT テーブルC.個人名 FROM テーブルA INNER JOIN (テーブルB INNER JOIN テーブルC ON テーブルB.市区町村コード = テーブルC.市区町村コード) ON テーブルA.都道府県コード = テーブルB.都道府県コード WHERE (((テーブルB.都道府県コード)=[Forms]![計算フォーマット]![テーブルA])); フォーカス取得時: Private Sub テーブルC_Enter() Me.テーブルC.Requery End Sub ************************************************************ このような設定を行いました。 そして重複しますが、行いたいことは3つあります。 一つ目 コンボ1で都道府県が選択されていなかったら、コンボ2・3のリストはブランク状態。 二つ目 コンボ1で都道府県を選択したら、コンボ2にコンボ1に該当する市区町村、コンボ3にコンボ2の絞込みを行っていない個人名を表示。 三つ目 コンボ2で市区町村が選択されたら、コンボ3へ2の絞込みを行った個人名を表示。 情報が不足していましたら、再度ご指摘いただければと思います。 宜しくお願い致します。
お礼
f_a_007 様 時間はかかりましたが、処理の流れを理解し 思うように完成しました! 誠にありがとうございました。 初歩的な事で何度もつまづきそうになりましたが、 f_a_007様が事例や画像等分かりやすくお教えくださったからこそ 理解が出来たと考えております。 文字では非常に軽いですが、心から感謝しております。 重ね重ねになりますが、ありがとうございました。