[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ユーザーフォームのコンボボックスで2つの条件から絞り込む』(くま)
[エクセルのバージョン]Excel2003 [OSのバージョン]WindowsXP
ユーザーフォームのコンボボックスの連動でリストの絞り込みは過去ログでもよくあるのですが、
私の場合は、3つのコンボボックスがあり、1つ目、2つ目のコンボボックスで選択された
内容と合致するリストを3つ目のコンボボックスに連動させたいと考えています。
ユーザーフォームは作成してあります。
具体的には、1つ目のコンボボックス(学年区分名)で
学年区分 小学生 中学生 高校生
の中から一つ選択します。
次に2つ目のコンボボックス(学校区域名)で
学校区域 A地区 B地区 C地区
の中から一つ選択します。
3つ目コンボボックスのリストには
小学生A地区 小学校B地区 小学校B地区 あああ小学校 えええ小学校 ききき小学校 いいい小学校 おおお小学校 くくく小学校 ううう小学校 かかか小学校 けけけ小学校
以下同様に中学生A地区、中学生B地区、中学生C地区、高校生A地区、
高校生B地区、高校生C地区の9つのリストを用意しています。
コンボボックスのリストはすべてリスト用のシートに作成してあります。
最後の3つ目のコンボボックス(学校名)で上記2つのコンボボックスで
選択された内容と合致するリストを表示させたいと思っています。
1つ目のコンボボックスで「中学生」、2つ目のコンボボックスで「B地区」、
と選択されれば、3つ目のコンボボックスで中学生B地区のリストを表示させる
といった具合です。
ご教授よろしくお願いします。
コードはどこまでできているんですか? リスト等の場所の参考にもなるので、できているところまでアップしていただけますか? (ROUGE)
小学校A地区のみ表示させて、フォームの動作確認だけしただけの段階です。
したがいまして、コードに関してはまだ白紙の状態です。
リストにはすべて名前を付けてあります。
フォームで入力をした項目はすべて、Sheets1の5行目に転記するようにしてあります。
下記のような状態です。(くま)
Private Sub CmdClose_Click() Unload Me End Sub
Private Sub CmdSet_Click() Rows("5:5").Insert Shift:=xlDown Sheets1.Cells(5, 1) = SchoolGrade Sheets1.Cells(5, 4) = CFNO Sheets1.Cells(5, 5) = Brother Sheets1.Cells(5, 6) = Name Sheets1.Cells(5, 7) = sex Sheets1.Cells(5, 8) = SchoolName Sheets1.Cells(5, 9) = Grade Sheets1.Cells(5, 11) = English Sheets1.Cells(5, 12) = Math Sheets1.Cells(5, 13) = Science Sheets1.Cells(5, 14) = Society Sheets1.Cells(5, 15) = Japanese Sheets1.Cells(5, 40) = Tel Sheets1.Cells(5, 42) = Mobile Sheets1.Cells(5, 43) = PostNumber Sheets1.Cells(5, 44) = Address Sheets1.Cells(5, 45) = NameRead Sheets1.Cells(5, 46) = SchoolArea
Unload Me End Sub
Private Sub UserForm_Initialize()
sex.Style = fmStyleDropDownCombo sex.RowSource = "性別" sex.ListIndex = -1 SchoolArea.Style = fmStyleDropDownCombo SchoolArea.RowSource = "学校区域" SchoolArea.ListIndex = -1 Grade.Style = fmStyleDropDownCombo Grade.RowSource = "学年" Grade.ListIndex = -1 SchoolName.Style = fmStyleDropDownCombo SchoolName.RowSource = "小学校A地区" SchoolName.ListIndex = -1 SchoolGrade.Style = fmStyleDropDownCombo SchoolGrade.RowSource = "学年区分" SchoolGrade.ListIndex = -1 English.Style = fmStyleDropDownCombo English.RowSource = "コマ数" English.ListIndex = -1 Math.Style = fmStyleDropDownCombo Math.RowSource = "コマ数" Math.ListIndex = -1 Science.Style = fmStyleDropDownCombo Science.RowSource = "コマ数" Science.ListIndex = -1 Society.Style = fmStyleDropDownCombo Society.RowSource = "コマ数" Society.ListIndex = -1 Japanese.Style = fmStyleDropDownCombo Japanese.RowSource = "コマ数" Japanese.ListIndex = -1 End Sub
ちょっと時間がたってしまいましたが、まだ見ておられますか?
たたき台として。。。こんな感じにしてみるとどうですか?
'------ Private Sub UserForm_Initialize() '=====学校区域(A地区,B地区,C地区)===== SchoolArea.Style = fmStyleDropDownCombo SchoolArea.RowSource = "学校区域" SchoolArea.ListIndex = -1 '======件のコンボボックス===== SchoolName.Style = fmStyleDropDownCombo SchoolName.RowSource = "" SchoolName.ListIndex = -1 '=====学年区分(小学生,中学生,高校生)===== SchoolGrade.Style = fmStyleDropDownCombo SchoolGrade.RowSource = "学年区分" SchoolGrade.ListIndex = -1 End Sub '------ Private Sub SchoolArea_Change() Call SchoolNameSet End Sub '------ Private Sub SchoolGrade_Change() Call SchoolNameSet End Sub '------ Private Sub SchoolNameSet() If SchoolGrade.Value <> "" And SchoolArea.Value <> "" Then SchoolName.Style = fmStyleDropDownCombo SchoolName.RowSource = SchoolGrade.Value & SchoolArea.Value SchoolName.ListIndex = -1 End If End Sub '------
最初は何もセットしません。 SchoolArea か SchoolGrade が変わった時に SchoolNameSetのコードで、両方に値が入っているか確認して SchoolAreaで選択された項目&SchoolGradeで選択された項目 の範囲のデータを、リストにセット します。
(HANA)
(HANA)さん、ありがとうございます。 なかなか回答がつかなかったものですから、自分なりにやってみて、それなりに 動作するようになりました。コードはめちゃめちゃかもしれませんが・・・。 ちなみに、こんな感じです。*質問以外のところは省きました。 '------ Private Sub UserForm_Initialize() SchoolArea.Style = fmStyleDropDownCombo SchoolArea.RowSource = "学校区域" SchoolArea.ListIndex = -1
SchoolGrade.Style = fmStyleDropDownCombo SchoolGrade.RowSource = "学年区分" SchoolGrade.ListIndex = -1 End Sub '------ Private Sub SchoolArea_Click() Dim area As Integer Dim shgrade As Integer area = Me.SchoolArea.ListIndex shgrade = Me.SchoolGrade.ListIndex Me.SchoolName.ListIndex = -1 Select Case area Case 0 Select Case shgrade Case 0 Me.SchoolName.RowSource = "小学校A地区" Case 1 Me.SchoolName.RowSource = "中学校A地区" Case 2 Me.SchoolName.RowSource = "高校A地区" Case 3 Me.SchoolName.Value = "無し" End Select Case 1 Select Case shgrade Case 0 Me.SchoolName.RowSource = "小学校B地区" Case 1 Me.SchoolName.RowSource = "中学校B地区" Case 2 Me.SchoolName.RowSource = "高校B地区" Case 3 Me.SchoolName.Value = "無し" End Select Case 2 Select Case shgrade Case 0 Me.SchoolName.RowSource = "小学校C地区" Case 1 Me.SchoolName.RowSource = "中学校C地区" Case 2 Me.SchoolName.RowSource = "高校C地区" Case 3 Me.SchoolName.Value = "無し" End Select End Select End Sub '------ Private Sub SchoolGrade_Change() Dim area As Integer Dim shgrade As Integer area = Me.SchoolArea.ListIndex shgrade = Me.SchoolGrade.ListIndex Me.SchoolName.ListIndex = -1 Select Case area Case 0 Select Case shgrade Case 0 Me.SchoolName.RowSource = "小学校A地区" Case 1 Me.SchoolName.RowSource = "中学校A地区" Case 2 Me.SchoolName.RowSource = "高校A地区" Case 3 Me.SchoolName.Value = "無し" End Select Case 1 Select Case shgrade Case 0 Me.SchoolName.RowSource = "小学校B地区" Case 1 Me.SchoolName.RowSource = "中学校B地区" Case 2 Me.SchoolName.RowSource = "高校B地区" Case 3 Me.SchoolName.Value = "無し" End Select Case 2 Select Case shgrade Case 0 Me.SchoolName.RowSource = "小学校C地区" Case 1 Me.SchoolName.RowSource = "中学校C地区" Case 2 Me.SchoolName.RowSource = "高校C地区" Case 3 Me.SchoolName.Value = "無し" End Select End Select End Sub '------ HANAさんのコードでも勉強させていただきます。
HANAさま、新たな質問が浮上してしまいました。上記のものをシートに転記したあとに 条件ごとに、選択範囲内の行のセルを塗りつぶしたいのですが、良い方法がわかりません。 単純に1行ごとであれば良いのですが、学年ごとに塗りつぶしたいのです。 学年区分 学年 名前 A B C … … Z 小学生 4 小学生 4 小学生 6 小学生 6 小学生 6 中学生 1 中学生 1 中学生 2 中学生 2 中学生 2 中学生 2 中学生 3 中学生 3 中学生 3 高校生 1 高校生 1 高校生 1 高校生 2 高校生 2 高校生 3 高校生 3
上記のようなシートになっておりまして転記して並べ替えまではできています。 学年ごとに見やすく色分けができたらと思っております。セルの色は無色ともう1色で いいと思っています。ポイントは、学年の数字で同じ数字の行を同じ色で塗ればよいと思う のですが、それを交互にに塗らなければいけない点と、必ずしも、学年番号は昇順になって いなかったり(小学校と中学校の間は6から1になったりする)、抜けていたり(小学5年だけいない) する点です。 よろしければヒント、あるいは、たたき台などご教授願えませんでしょうか?
入力は一行ずつだと思うので 一通り入力が終わったら、並べ替えをして 範囲を選択して マクロを実行する。 で、このマクロが「学年区分&学年 のグループ毎に色を塗り分ける」って事ですか?
この「範囲」は、どんな範囲ですか? データがA1:Z15まで有った場合、「A1:Z15」とか「A5:Z12」とか いった感じで範囲を選択するのですか?
で、範囲の先頭列&二番目の列 でグループとみなせば良いでしょうか? (「選択範囲内の」って限定するイメージが 良く分かりません。)
こんなのを作ってみましたが。。。
'------ Sub 塗り分け() Dim i As Long Dim TpR As Long, RCnt As Long, GrCnt As Long Dim MyStr As String With Selection .Interior.ColorIndex = xlNone MyStr = .Cells(1, 1).Value & .Cells(1, 2).Value For i = 2 To .Rows.Count + 1 If MyStr <> .Cells(i, 1).Value & .Cells(i, 2).Value Or i = .Rows.Count + 1 Then If GrCnt Mod 2 Then .Offset(TpR).Resize(RCnt + 1).Interior.ColorIndex = 20 End If MyStr = .Cells(i, 1).Value & .Cells(i, 2).Value GrCnt = GrCnt + 1 TpR = i - 1 RCnt = 0 Else RCnt = RCnt + 1 End If Next End With End Sub '------
通常は Cells(1, 1)はA1セルを表します。 このコードは、Withでまとめてあるので .Cells(1, 1)に成っていますが Selection.Cells(1, 1)の事なので 選択範囲の中で、1行目の1列目のセル を表します。
「A1:Z15」の範囲を選択している時だと、A1セルですが 「A5:Z12」の範囲を選択している時だと、A5セルの事です。
「列全体(全行)」選択して実行するとエラーに成って止まります。 先にも書きましたが、範囲を選択してから処理を始めるイメージが 良く分かっていませんのでそのままにしてあります。 適宜処理を追加して下さい。
(HANA)
>入力は一行ずつだと思うので >一通り入力が終わったら、並べ替えをして 範囲を選択して マクロを実行する。 >で、このマクロが「学年区分&学年 のグループ毎に色を塗り分ける」って事ですか? その通りです。
>この「範囲」は、どんな範囲ですか? 範囲というのがわかりにくかったですね。実は、この入力され、並べ替えされたデータの 最下行には合計数値などの欄が設けてありまして、その行を除く入力された全データの範囲と いう意味で選択範囲と言葉を使っていました。 >データがA1:Z15まで有った場合、「A1:Z15」とか「A5:Z12」とか いった感じで範囲を選択するのですか? まさにその通りです。いろいろ調べてみたのですが、選択する行為はvbaでは しなくてもできるんでしょうか?
(HANA)さまのコードをたたき台にさせていただき、試行錯誤してみます。 煮詰まってしまいましたら、また質問させていただきます。(くま)
「○○の範囲」と説明出来るなら 手作業で(VBA内でも)選択する必要は無いです。 並べ替えの時の範囲はどの様に決めているのでしょう? これはVBAにして居ないのでしょうか?
実際問題として「○○の範囲」と言い表すにはどの様な表現が出来ますか? こちらからはそちらのシートの状態が全く見えないので コード化も難しいです。
タイトル行が有りますか? 有る場合は、何行目に有りますか? タイトル行はデータの始まる行の一行上に有りますか?
最後の合計行は 場所が決まっていますか? それとも、入力したデータ量によって変わりますか?
ワークシートの下端から、A列の入力がある最後のセルを見つけた時 データが有る範囲までの間には 合計行以外にも何か有りますか? 有る場合、その行数は固定ですか?変わりますか?
詳細なシートのレイアウトを教えて下さい。
(HANA)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.