• ベストアンサー

レコードセット検索

excel vbaでレコードセットの中身を検索して レコードセット内の別フィールドのデータを取得する方法がわかりません。やりたいことは、 |店舗名称|店番号|  渋谷店   01  池袋店   02  目黒店   03 というレコードセットがあって渋谷店を コンボボックスで選択したときに、店番号の"01"が 別のコンボボックスで表示されるようにしたいのですが うまくいきません。どなたか分かる方教えてください。 お願いします。

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

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.7

またまた登場、myRangeです。 補足要求6に返答がありませんので次のようなことを推測してみました。 ------------------------------------------------------------- ●取引先マスター●(取引先番号なし) ___A______B______C__ 1_______取引先名____店番号__ 2_____ブランドA渋谷店__111__ 3_____ブランドA青山店__222__ 4_____ブランドB渋谷店__111__ 5_____ブランドB青山店__222__ 6_____ブランドB銀座店__333__   上記は、 最初の質問と補足の表のレイアウトが違うので また、取引先名と店番号の関係が分かりませんので 補足の表を参考にして、 取引先名をユニークに、店番号はダブリあり、にしてます。 こういう感じであれば先の回答を少し変えればできます。   以下は、検索画面シートのシートモジュールに書くこと。   '------- 検索画面がアクティブになったとき、 '------- ComboBox2をセット Private Sub Worksheet_Activate()  Dim myDic  Dim R As Long  Set myDic = CreateObject("Scripting.Dictionary")  For R = 2 To Sheets("取引先マスタ").Cells(Rows.Count, "C").End(xlUp).Row    If myDic.exists(Sheets("取引先マスタ").Cells(R, "C").Value) = False Then      myDic.Add Sheets("取引先マスタ").Cells(R, "C").Value, ""    End If  Next R  ComboBox2.List = myDic.keys  ComboBox1.Clear End Sub '-----、Combox2 の選択で、ComboBox1を絞り込む Private Sub ComboBox2_Change()  Dim R As Long  ComboBox1.Clear  For R = 2 To Sheets("取引先マスタ").Cells(Rows.Count, "C").End(xlUp).Row    If Sheets("取引先マスタ").Cells(R, "C").Value = Val(ComboBox2.Value) Then      ComboBox1.AddItem Sheets("取引先マスタ").Cells(R, "B").Value    End If  Next R End Sub '------------------------------------------------------- おそらくこれで望みどおりかと。。 ●上記は、検索画面がアクティブになった時にComboBox2に項目をセットしてますので、 ComboBox2に項目をセットするタイミングは適宜変更のこと。 以上です。

anman0201
質問者

お礼

返信遅くなりましてすみません。 まさにそのとおりです。 myRangeのおかげで理想どおりの動作を実現することができました。 この度はわかりにくい質問、補足でご迷惑おかけしました。 次回から気をつけたいと思います。 本当にありがとうございました。

その他の回答 (6)

  • myRange
  • ベストアンサー率71% (339/472)
回答No.6

回答1への補足と少し(しかし最重要)違っているようなので再度補足が必要です。 ----------------------------------------------------  ●回答1への補足 取引先|   取引先名   | 店 10000 | ブランドA 渋谷店| 01 10001 | ブランドA 池袋店| 01 10001 | ブランドB 池袋店| 02 この表を提示して、 >ComboBox1のListfillRangeに設定して【取引先名】を表示させています >やりたいことは別のComboBox2を作成してそこに【取引先】だけを表示させて >"10001"を選択したらComboBox1に池袋店の2つが絞り込み表示させるということです との説明なので ComboBox1は、取引先名 ComboBox2は、取引先(正確には"取引先番号"と推測しますが) となります。 -------------------------------------------- ●今度の補足 >レコードセットデータは【取引マスタ】シートにあります。 >B列に取引先名があり、C列に店番号があります >ComboBox1には取引先名を表示させ、 >ComboBox2には店番号が表示させるようにしたいです。 との説明なので ComboBox1は、取引先名 ComboBox2は、店番号 となります。 -------------------------------------------------------- ■■疑問点■■ (1)回答1の補足の表にある、取引先(番号)が今度の説明にはない (2)回答1の補足説明と今度の説明では、ComboBox2にセットする項目が違う ■■更に確認点■■   (1)データの中での、取引先名、店番号、どちらもユーニークか? (2)取引先(番号)があるとするとそれは、ユニークか? 最初に提示された、表からすると、取引先(番号)、取引先名、店番号ともユニークでないようだが、、   ---------------------------------------------------- ▲▲投稿に関する要望点▲▲ 補足を投稿する前には、矛盾がないか何度も読み返してから投稿願います。 そうでないと何回も遣り取りをしなければならなくなるので。。 次回の回答で是非解決にしたいと思います。   以上です。  

  • myRange
  • ベストアンサー率71% (339/472)
回答No.5

>本当に何度もすみません いえいえ、何も気にする必要はありませぬよ。 で、本題。 >【取引先マスタ】sheetと【検索画面】sheetが分かれているのですが 当方の見落としかな、と思い、 質問、補足に再度目を通してみましたが 【検索画面】という文言が出てきたのは今度が初めてですね。 ですから、当然ながら当方の回答は 抽出されたデータもCombobox1,2も【取引先マスタ】にあるものだ、 との前提になってます。 前提が崩れてますので、分かっていることもそうでないことも含めて イチから明確にした方がいいでしょう。 (1)データはどのシートにあるのか (2)そのデータはどのセルから始まっているか (3)ComboBox1、2、はどのシートにあるのか (4)検索画面シートのレイアウトはどうなってるか   また、出来れば次の回答で解決を図りたいと思いますので 上記の補足は詳しくお願いします。 以上です。    

anman0201
質問者

補足

ありがとうございます。 自分の説明不足でした。 >(1)データはどのシートにあるのか レコードセットデータは【取引マスタ】シートにあります。 ここには取引先名、店番号フィールドがあります。 完全にテーブル用のシートでそれ以外なにもありません >(2)そのデータはどのセルから始まっているか Range"B2"から下に1400件ほどあります。 B列に取引先名があり、C列に店番号があります。D列にもデータはあるのですが重複データが多すぎて検索には使えなそうです。 >(3)ComboBox1、2、はどのシートにあるのか ComboBox1などコントロール類はすべて【検索画面】シートにあります。 >(4)検索画面シートのレイアウトはどうなってるか レイアウトですが、日付を指定するテキストボックスが一番上にあり、 ComboBox1がその下にあります。 ComboBox1には取引先名を表示させ、 その下のComboBox2には店番号が表示させるようにしたいです。 ComboBox2から任意の店番号を選択するとComboBox1にその番号に対応した取引先名を絞り込むようにさせたいです。 最終的には日付と指定した取引先名をSQLのWHERE条件にして、 その日にその取引先で売り上げた明細を別ブックに出力するプログラムです。この出力する部分は完成しています。 よろしくおねがいいたします。

  • myRange
  • ベストアンサー率71% (339/472)
回答No.4

回答2の補足に以下のようにありますね。 ---------------------------------------------- >上記のコードでmyRecに格納した。 >レコードをWorksheets("取引先マスタ")にコピーすると、 取引先|   取引先名   | 店 10000 | ブランドA 渋谷店| 01 10001 | ブランドA 池袋店| 01 10001 | ブランドB 池袋店| 02 10002 | ブランドA 目黒店| 01  >という形で表示されます。 >それをComboBox1のListfillRangeに設定して >【取引先名】を表示させています。 >やりたいことは別のComboBox2を作成してそこに >【取引先】だけを表示させて"10001"を選択したら >ComboBox1に池袋店の2つが絞り込み表示させるということです ----------------------------------------------- この説明から、 シート「取引マスタ」に取り込んだデータを Combobox1,2に、必要項目だけ表示させ ComboBox2の選択項目により、Combobox1を絞り込みたい で、Comboboxへのセットの仕方などを知りたい と、受け取りました。 ●で、シート取引マスタにデータが表示された状態から  Combobox1,2への処理の回答をしました。   が、エラーが出るということなので 質問者のコードを見直したところ 質問者のコードがCombox2のChangeイベントに書いてあることに気づきました。 なぜ、そこに、ADODBのコードがあるのでしょうか? 意味不明です。 ComBox2のChangeイベントには当方が回答したように Combobox1への絞込み処理のコード【のみ】必要なはずです。 ●何度も言うようですが、 当方の回答は、シート「取引マスタ」に取り込まれたデータを Combobox1,2にそれをセット&処理するコードです。 そこらをも少し明確に説明したらどうでしょう。 その前に試しに、 シート「取引マスタ」にデータが■表示されてる状態■で 例えば、CommandButtonのクリックで、 Combobox1,2に項目をセットし、 Combobox2のChangeイベントでCombobox1を絞り込む というふうにしてみてください。 ------ CommandButton1 のクリックで    Combobox1,2の初期項目をセットする -------- Private Sub CommandButton1_Click()  Dim myDic  Dim R As Long  Set myDic = CreateObject("Scripting.Dictionary")  For R = 2 To Cells(Rows.Count, "A").End(xlUp).Row    If myDic.exists(Cells(R, "A").Value) = False Then      myDic.Add Cells(R, "A").Value, ""    End If  Next R  ComboBox2.List = myDic.keys  ComboBox1.ColumnCount = 2  ComboBox1.List = Range("B2", Cells(Rows.Count, "C").End(xlUp)).Value End Sub '-----、Combox2 Changeイベント --------------- Private Sub ComboBox2_Change()  Dim R As Long  ComboBox1.Clear  For R = 2 To Cells(Rows.Count, "A").End(xlUp).Row    If Cells(R, "A").Value = Val(ComboBox2.Value) Then      ComboBox1.AddItem Cells(R, "B").Value      ComboBox1.List(ComboBox1.ListCount - 1, 1) = Cells(R, "C").Value    End If  Next R End Sub '------------------------------------------------------- ●●Combobox1は、取引先名と店番号の2列表示に変更しました。 以上です。      

anman0201
質問者

補足

ご回答ありがとうございます。 言われたとおりにやってみましたが、 【取引先マスタ】sheetと【検索画面】sheetが分かれているのですが、 コンボボックスをみると検索画面のA,B列を持ってきてるみたいです。 WorkSheetsオブジェクトを付け足したりしてみましたがうまくいきません。できればアドバイスお願いします。 本当に何度もすみません。

  • myRange
  • ベストアンサー率71% (339/472)
回答No.3

>ComboBox1のListfillRangeに設定して、【取引先名】を表示させています ●●ListFillRangeでは拙いので、ListFillRangeはセットしないこと!! 使用列 : A、B,C列 項_目 : 1行目 データ ; 2行目~~ >Worksheets("取引先マスタ").Range("B2").CopyFromRecordset data:=myRec の次に下記、初期項目セットコードを追加する ------ Combobox1,2の初期項目をセットする部分 --------  Dim myDic  Dim R As Long  Set myDic = CreateObject("Scripting.Dictionary")  For R = 2 To Cells(Rows.Count, "A").End(xlUp).Row   If myDic.exists(Cells(R, "A").Value) = False Then     myDic.Add Cells(R, "A").Value, ""   End If  Next R  ComboBox2.List = myDic.keys  ComboBox1.List = Range("B2", Cells(Rows.Count, "B").End(xlUp)).Value '-----ここからは、Combox2 を選択する部分 ------------------ Private Sub ComboBox2_Change()  Dim R As Long    ComboBox1.Clear  For R = 2 To Cells(Rows.Count, "A").End(xlUp).Row    If Cells(R, "A").Value = Val(ComboBox2.Value) Then      ComboBox1.AddItem Cells(R, "B").Value    End If  Next R End Sub '------------------------------------------------------- これで Combobox2の取引先番号を選択すると Combobox1の取引先名が絞り込まれます。 以上です。

anman0201
質問者

補足

ご回答ありがとうございます。 教えいただいたとおりにやってみましたが、 初期設定の >ComboBox1.List = Range("B2", Cells(Rows.Count, "B").End(xlUp)).Value の部分で、「不正なプロパティ配列インデックスです。」 とエラーメッセージが出ます。 原因はなにが考えられるでしょうか?

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

>レコードセット で何が言いたいのか。難しい語句を使うときは、注意して。 (1)CSVファイル。 (2)AccessのMDBファイル。 (3)エクセルのシートのセル範囲のこと。(レコードセットとは余りいわないようだが) (4)その他 それによってできるスキル(回答)が変わる。それを書かないで質問するとは。 もちろんそれらを含めて・総称して、データセットなどという概念もあるが。 >別のコンボボックスで表示されるようにしたいのですが またそれらの中から検索するのか? それでは質問の例示が悪いではないか。 渋谷店   01 渋谷ー>01で終わりではないか? 表示用にはコンボはあまり使わないようだが。 ーー (1)データの検索のコードがわからない。 (2)フォームなりのコントロールのイベントで連動させるコードがわからない のどちらか?

anman0201
質問者

補足

Private Sub ComboBox2_Change()      Dim myConn As New ADODB.Connection Dim myRec As New ADODB.Recordset Dim myCmd As New ADODB.Command Dim strSQL As String Dim intComInx As Integer Dim strComLst As String strSQL = strSQL & "SELECT" strSQL = strSQL & " TM.取引先名 " strSQL = strSQL & ",TM.取引先 " strSQL = strSQL & ",TM.店 " strSQL = strSQL & "FROM " strSQL = strSQL & "V21.取引先RM TM " strSQL = strSQL & "INNER JOIN V21.出荷先RM SM " strSQL = strSQL & "ON " strSQL = strSQL & "TM.取引先 = SM.出荷先 " strSQL = strSQL & "AND TM.店 = SM.出荷先店 " strSQL = strSQL & "AND TM.法人 = SM.法人 " With myConn .ConnectionString = _ "Provider=**********;Data Source=***;User Id=*****;Password=********" .Open End With ' オブジェクトのインスタンス化 Set myCmd.ActiveConnection = myConn Set myRec.ActiveConnection = myConn ' コマンドテキストの設定 With myCmd .CommandText = strSQL .CommandType = adCmdText .Execute End With intComInx = ComboBox1.ListIndex strComLst = ComboBox1.List(intComInx) myRec.Open strSQL, myConn, , adLockReadOnly, 1 myRec.Find Worksheets("取引先マスタ").Range("B2").CopyFromRecordset data:=myRec すみません。質問が雑になっていました。 補足しますと、上記のコードでmyRecに格納した。 レコードをWorksheets("取引先マスタ")にコピーすると、 取引先|   取引先名   | 店 10000 | ブランドA 渋谷店| 01 10001 | ブランドA 池袋店| 01 10001 | ブランドB 池袋店| 02 10002 | ブランドA 目黒店| 01  ・ ・ ・ という形で表示されます。 それをComboBox1のListfillRangeに設定して、【取引先名】を表示させています。やりたいことは別のComboBox2を作成してそこに【取引先】だけを表示させて"10001"を選択したらComboBox1に池袋店の2つが絞り込み表示させるということです。これは可能なのでしょうか? 理想は【取引先名】を選択すると【取引先】と【店】が連動して表示させることです。それと【取引先名】はユニークで【取引先】と【店】の組み合わせで設定しています。 よろしくお願いします。

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

>別のコンボボックス これが問題 元ネタが同じで、"01"を選択状態にしたいのか、あるいは 「渋谷」というカテゴリのデータ集団をコンボボックスの値集合に したいのかで、方法が違います。どっちでしょ?

anman0201
質問者

補足

補足を追記させていただきましたので、 御時間に余裕があれば是非アドバイスお願いいたします。