[[20110829160728]] 『ユーザーフォームのコンボボックスで2つの条件かax(くま) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ユーザーフォームのコンボボックスで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)

(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.