VBAコンボボックスの条件分岐

このQ&Aのポイント
  • VBAコンボボックスを使用し、セルの値に応じた条件分岐を行いたい場合のコードについて説明します。
  • コンボボックス22をマスタシートのC2からC4までの値で選択できるように設定し、選択したセルに応じてコンボボックス21の参照範囲を設定します。
  • 例えば、C2セルを選択した場合はコンボボックス21の参照範囲をマスタシートのD2からD13までに設定し、C3セルを選択した場合はE2からE13までに設定します。
回答を見る
  • ベストアンサー

VBA コンボボックスの条件分岐

コンボボックスの条件分岐のコードが間違っているみたいで 調べても分からなかったので質問します。 やりたいこと 『マスタ』という名前のシート内のセルを参照し マスタシートには C2セル『A』C3セル『B』C4セル『C』と それぞれアルファベットがあります。 そこでコンボボックスを使用し コンボボックス22にC2~C4セルを選択できるようにし 例えばC2セルを選択したら コンボボックス21の参照範囲をマスタシート内の D2~D13セルを選択できるようにし C3セルを選択したら コンボボックス21の参照範囲をマスタシート内の E2~E13セルを選択できるようにしたいのです。 すいませんがコードを記載して頂けますと 助かります。 Private Sub UserForm_Activate() '----------------------- With ComboBox22 .ColumnCount = 2 .ColumnWidths = "90;10" .RowSource = "マスタ!C2:C4" End With '↑こうすればコンボボックス22のマスタシートのC2からC4まで値を選択できるようになります。 '------------------------わかりやすく区切っています。 '--------------------------------------- If UserForm1.ComboBox22 = "A" Then With ComboBox21 .ColumnCount = 2 .ColumnWidths = "90;10" .RowSource = "マスタ!D2:D13" End With End If '↑コンボボックス22の値が(C2セルの値がAなら)コンボボックス21をマスタシートのD2からD13までを選択できるようにしたい If UserForm1.ComboBox22 = "B" Then With ComboBox21 .ColumnCount = 2 .ColumnWidths = "90;10" .RowSource = "マスタ!E2:E13" End With End If '↑コンボボックス22の値が(C3セルの値がBなら)コンボボックス21をマスタシートのE2からE13までを選択できるようにしたい '----------------------------------------区切っています。 End Sub

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.2

No.1の訂正案です。 Withが何度も出てくるので一度にした方がいいと思いますので変更しました。 あと、列が2列指定ColumnCount = 2なのが何故なのかよく分からないのでそのままです。 Private Sub ComboBox22_Change() With Me.ComboBox21 If Me.ComboBox22 = "A" Then .ColumnCount = 2 .ColumnWidths = "90;10" .RowSource = "マスタ!D2:D13" ElseIf Me.ComboBox22 = "B" Then .ColumnCount = 2 .ColumnWidths = "90;10" .RowSource = "マスタ!E2:E13" End If End With End Sub もしくは Private Sub ComboBox22_Change() With Me.ComboBox21 Select Case Me.ComboBox22 Case "A" .ColumnCount = 2 .ColumnWidths = "90;10" .RowSource = "マスタ!D2:D13" Case "B" .ColumnCount = 2 .ColumnWidths = "90;10" .RowSource = "マスタ!E2:E13" Case Else End Select End With End Sub

TaikooniQ1
質問者

お礼

思った通りに動きました! 大変助かりました。

その他の回答 (2)

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

ここは、デバッグまでやらせられてはと思うので、訂正する気はないが、下記参考になれば.(簡潔性を心がけたツモリ。デバッグの起こる余地なしと思う。) ・ユーザーフォームを1つ設ける ・そのユーザーフォーム1に、コンボボックスを2つ設ける  コンボボックス1とコンボボックス2です。 別にするよりも省力化。 ーー ユーザーフォームのコードの表示に Private Sub ComboBox1_Click() MsgBox ComboBox1.Text txt = ComboBox1.Text Select Case txt Case "A" UserForm1.ComboBox2.RowSource = "C2:C4" Case "B" UserForm1.ComboBox2.RowSource = "D2:D5" Case "C" UserForm1.ComboBox2.RowSource = "E2:E6" End Select End Sub Private Sub UserForm_Initialize() With UserForm1.ComboBox1 .AddItem "A" .AddItem "B" .AddItem "C" End With End Sub Private Sub ComboBox2_Click() MsgBox ComboBox2.Text End Sub 其の後、ComboBox2.Text の値によって、その後の処理を書く(略) ーーー 他人に頼るばかりで、 (1)ユーザーフォームにコントロールを作るか、シートか、その他かの 説明がない。 (2)アイテムの設定で、セル範囲と、セルの値のどちらかについて、セルの値に統一すべきかな? >条件分岐のコードが間違っているみたいで、調べても分からなかったので質問します。 言っている意味不明。セルの値を問題にするのだろうから、IF条件分岐よりも、Select Caseなどの利用がおすすめ。 >C2:C4, "D2:D5”などには、適切なセルの値を入れておく。

  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.1

以下で試してみてください。 Private Sub UserForm_Initialize() With ComboBox22 .ColumnCount = 2 .ColumnWidths = "90;10" .RowSource = "マスタ!C2:C4" End With End Sub Private Sub ComboBox22_Change() If Me.ComboBox22 = "A" Then With Me.ComboBox21 .ColumnCount = 2 .ColumnWidths = "90;10" .RowSource = "マスタ!D2:D13" End With ElseIf Me.ComboBox22 = "B" Then With Me.ComboBox21 .ColumnCount = 2 .ColumnWidths = "90;10" .RowSource = "マスタ!E2:E13" End With End If End Sub もしくはIFのところをSelect Caseを使って Private Sub ComboBox22_Change() Select Case Me.ComboBox22 Case "A" With Me.ComboBox21 .ColumnCount = 2 .ColumnWidths = "90;10" .RowSource = "マスタ!D2:D13" End With Case "B" With Me.ComboBox21 .ColumnCount = 2 .ColumnWidths = "90;10" .RowSource = "マスタ!E2:E13" End With Case Else End Select End Sub

関連するQ&A

  • VBAを使用しコンボボックスにリストを設定する方法

    いつもお世話になっております。 現在コンボボックスにリストを設定する方法について悩んでいます。 バージョンはExcel2003です。 コンボボックスに指定したい列がA列とB列なら通常下記のようにすると思います。     With ComboBox1       .ColumnCount = 2       .ColumnWidths = "50;50"       .RowSource = "Sheet1!A2:B5"     End With ただ今回はA列とC列をリストに設定したいと思い、下記のような設定にしたのですがうまく設定できません。     With ComboBox1       .ColumnCount = 2       .ColumnWidths = "50;50"       .RowSource = "Sheet1!A2:A5;C2:C5"     End With そもそもRowSource は連続的なデータを設定する場合のプロパティだと思うのですが、このように飛んだ列のデータを効率的に指定するにはどのようにするのが一番いいのでしょうか? 分かる方がいっらしゃいましたらご教授願います。

  • EXCEL VBAのコンボボックスで日だけを表示する方法

    EXCELのVBAを使って経費の打ち込みをするマクロを作っています その中で、コンボボックスで日付を選択するようにしました コンボボックスに表示する日付はセルから「RowSource」で取り出しました セルの日付の入力形式は「2008/10/1」です そのセルの書式設定で表示形式を「ユーザー定義で d (日だけ表示)」としています なので、コンボボックスで選択して表示する際も日だけを表示したいのですがうまくいきません ComboBox1 = Format(ComboBox1, "d") とすると、コンボボックス内で数字がちらちらしてランダムに数字が表示されてしまいます ComboBox1 = Format(ComboBox1, "m月d日") この形だと、きちんと「10月1日」の様に表示されます Private Sub UserForm_Initialize() With ComboBox1 .RowSource = "sheet1!A1:A5" '日付のセル End With End Sub Private Sub ComboBox1_Change() ComboBox1 = Format(ComboBox1, "m月d日") End Sub 日だけを表示する方法をご教授ください

  • エクセルVBA コンボボックスの値の転記

    エクセルVBAの質問です。 ユーザーフォームを表示し 年を選択するコンボボックス1 月を選択するコンボボックス2 を入力してもらい ユーザーフォームを閉じるときに sheet1のワークシートのC2セルに 「コンボボックス1の値」+「年」+と「コンボボックス2の値」+「月」をつなげて 入力できるというようなマクロを考えています。 下記の様に考えてみたのですが、 うまく入力できませんでした。 Private Sub UserForm_Initialize() With ComboBox1 .AddItem "2021" .AddItem "2022" .AddItem "2023" .AddItem "2024" End With With ComboBox2 .AddItem "1" .AddItem "2" .AddItem "3" .AddItem "4" .AddItem "5" .AddItem "6" .AddItem "7" .AddItem "8" .AddItem "9" .AddItem "10" .AddItem "11" .AddItem "12" End With Private Sub CommandButton1_Click() 'ユーザーフォームを閉じる Unload UserForm1 'ユーザーフォームの値をセルC2に入力 With Worksheets("sheet1") .Cells(2, 3).Value = "ComboBox1.Text" & "月" & "ComboBox2.Text" & "日" End With End Sub どのように修正すればいいでしょうか? よろしくお願いします。

  • Excel VBAでコンボボックスで選択

    コンボボックスで選択したいと思っていますがうまくいきません。 教えてください。 Private Sub userform_initialize()  With ComboBox2   .Font.Size = 12   .AddItem "A"   .AddItem "B"   .AddItem "C"  End With If ComboBox2 = "A" Then  With ComboBox3   .Font.Size = 12  .AddItem "a-1"  .AddItem "a-2"  End With ElseIf ComboBox2 = "B" Then With ComboBox3   .Font.Size = 12  .AddItem "b-1" .AddItem "b-2" End With Else: ComboBox2 = "C" With ComboBox3 .Font.Size = 12 .AddItem "c-1" .AddItem "c-2" End With End If End Sub コンボボックス2で"A"を選んだら、コンボボックス3には"a-1とa-2"の選択したい のですが、"c-1,c-2"しかでません。よろしくお願いします。

  • Excel2010 VBA ユーザーフォーム

    コンボボックスのリストに表示されているときはA列とB列が表示されているのに、 1つをクリックして選択した後はA列しか表示されません 選択した後もそのまま表示を維持したいのですが… ↓こんな感じでやりました Private Sub UserForm_Initialize()   Dim lRow As Long     With Worksheets("Sheet1")       lRow = .Range("A" & Rows.Count).End(xlUp).Row     End With     With ComboBox1       .ColumnCount = 2       .ColumnWidths = "50"       .RowSource = "Sheet1!A2:B" & lRow     End With End Sub よろしくお願いします

  • VBAでオプションボタン変更によって・・・

    エクセルVBAのユーザーフォーム内にあるコンボボックス3つを選択することによりデータ入力を行っています。 この度選択肢を増やすことになり、オプションボタンを2つ追加しようと思っています。 オプションボタンはどちらかを決定することで、コンボボックスの選択内容を変更する予定です。 コンボボックスは大中小分類としており、シート2から抽出したものをシート1に落としている現状をオプションボタン新設により、ボタン1は従来通りシート2から、ボタン2選択時はシート3にあるリストからコンボボックスへ繁栄させようとしたいのですが、方法が分かりません。 どなたか、教えていただけると助かります。 よろしくお願いします。 現在のコードを下記に記します。 Private Sub UserForm_Activate() With UserForm3 .OptionButton1 = True *この段階でボタン2を選択時は、シート3にあるリストよりコンボボックスの内容を抽出したい。 以下中小分類も同様としたい。 .ComboBox1.RowSource = "シート2!A3:A15" .ComboBox1.SetFocus End With End Sub Private Sub ComboBox1_Change() Dim myLlist As String myLlist = ComboBox1 With UserForm3 .ComboBox2.Text = "" .ComboBox3.Text = "" Select Case myLlist Case "大1" .ComboBox2.RowSource = "シート2!B21:B26" Case "大2" .ComboBox2.RowSource = "シート2!B27:B28" End Select End With End Sub Private Sub ComboBox2_Change() Dim myMlist As String myMlist = ComboBox2 With UserForm3 .ComboBox3.Text = "" Select Case myMlist Case "中1" .ComboBox3.RowSource = "シート2!C101:C111" Case "中2" .ComboBox3.RowSource = "シート2!C121:C124" End Select End With End Sub Private Sub OKボタン_Click() With UserForm3 ActiveSheet.Unprotect 行 = ActiveCell.Row 列 = ActiveCell.Column Cells(行, 列) = UserForm3.ComboBox1.Value Cells(行, 列 + 1) = UserForm3.ComboBox2.Value Cells(行, 列 + 2) = UserForm3.ComboBox3.Value ActiveSheet.Protect End With End Sub

  • VBA コンボボックスの値による条件分岐

    12カ月分のブックがあり、 コンボボックスで指定した月のブックを開くマクロはどう記述すれば良いでしょうか? BOOK("1月")のSheet1にコンボボックス1と コマンドボタン1があります。 コンボボックスには下記をリストにしています。 Private Sub Workbook_Open() With Worksheets("Seet1").ComboBox1 .AddItem (" 2月") .AddItem (" 3月") .AddItem (" 4月") .AddItem (" 5月") .AddItem (" 6月") .AddItem ("7月") .AddItem ("8月") .AddItem ("9月") .AddItem ("10月") .AddItem ("11月") .AddItem ("12月") End With End Sub Private Sub CommandButton1_Click() If ComboBox1.Value = "2月" Then Workbooks.Open Filename:="C:\testBook\2月.xlsm" ElseIf ComboBox1.Value = "2011年度 3月売上" Then Workbooks.Open Filename:="C:\testBook\3月.xlsm"     中略 End If End Sub 上記ではエラーとなります。 基本もままならない素人で申し訳ありませんが、 ご教授願います。

  • エクセルVBA 別シートからのコンボボックス連動

    エクセルVBA 別シートからのコンボボックス連動について Book1(多人数入力用ブック) ・入力シート ・データ用シート Book2(反映用ブック) ・シート1 Book1にコンボボックスが2列 テキストボックスが2列 * 6行のユーザーフォームを作成しました。 コンボボックス1 コンボボックス2 テキストボックス1 テキストボックス2 コンボボックス3 コンボボックス4 テキストボックス3 テキストボックス4 ・ ・ ・ 左のコンボボックスで「あ」が選ばれたときには、右のコンボボックスで「あ行の顧客」・・・というように連動させたいと考えております。 データ用シートのデータは、   A      B          C 1 あ あ行で始まる顧客 か行で始まる顧客 2 か 3 さ 4 た 5 な 6 Private Sub UserForm_Initialize() Dim c As Range ComboBox1.RowSource = "データ用シート!A1:A9" End Sub Private Sub ComboBox1_Change() 'Dim Rng As Range 'Dim i As Long i = ComboBox1.ListIndex If i > -1 Then Dim c As Range Set Sh = Worksheets("データ用シート") Set Rng = Worksheets("データ用シート").Range("B2:I30") ComboBox2.Value = "" ComboBox2.RowSource = Rng.Columns(i + 1).Address End If End Sub 上記コードですと、コンボボックス2が入力シートのデータを表示してしまいうまくいきません。 欲をいえば、 Book1(多人数入力用ブック)入力シートの特定セルに コンボボックス2・テキストボックス1 コンボボックス4・テキストボックス3というように続けて1セルに反映 Book2(反映用ブック)シート1に コンボボックス2・テキストボックス1・テキストボックス2 を各1セル 1行に反映させたいと考えております。 まったく知識がないのですが 仕事上どうしても必要となったので、各種サイトを見よう見真似でやっております。 ご助力いただければ幸いです。

  • VBAのコンボボックスのカラムについて

    以下のようにしてコンボボックスのカラムにも文字列が入るようにしております。 With ComboBox1 .AddItem "hogehoge" ComboBox1.List(0, 1) = "aiueo" End With これによってコンボボックスをクリックして出てくるリストにはhogehogeとaiueoの両方が 出てきますが、これを選択するとhogehogeだけがコンボボックスに残され、 (0,1)にあった文字列は消えてしまいます。 リストから選択した後もコンボボックス内にカラムの文字を残すにはどのようにすればよろしいでしょうか?(できれば区切りありで) よろしくお願いします。

  • Excel コンボボックス2つ以上の時のコード

    ユーザーフォームでコンボボックスを2つ作ったのですが、1つだけのときはうまくいったのですが、二つ目をつくったら、エラーが出てしまいました。 コード入力は、Initializeに入力してあります。 Private Sub UserForm_Initialize() ComboBox1.Style = fmStyleDropDownCombo ComboBox1.RowSource = "sheet1!F2:F7" ComboBox1.ListIndex = -1 End Sub Private Sub UserForm_Initialize() ComboBox2.Style = fmStyleDropDownCombo ComboBox2.RowSource = "sheet2!B2:B3" ComboBox2.ListIndex = -1 End Sub コンボボックス1だけはうまくいったのですが、コンボボックス2をつくったら名前が適切でありませんとエラーがでました。 どのようにしたらいいですか?教えてください。

専門家に質問してみよう