excelのコンボボックスでの階層リスト表示がうまくいかない

このQ&Aのポイント
  • Excelのコンボボックスで階層にわけてリスト表示させる方法を教えてください。
  • 会社名、事業部名、部門名、担当名のコンボボックスを作成し、階層に応じてリストの内容を制御したいです。
  • 現在は3番目までうまくいっていますが、4番目のコンボボックスで2番目のテキストボックスに値を代入できません。どうすればよいですか?
回答を見る
  • ベストアンサー

excelのコンボボックスでの階層リスト表示

(すいません、再投稿します) excelのコンボボックスで、階層にわけてリスト表示させたいのですが、うまくいきません。 数日悩んでまして、どなたか教えてもらえませんか。 シート1:会社名    1列目:会社名  2列目:ID シート2:事業部名   1列目:事業部名 2列目:ID シート3:部門名     1列目:部門名  2列目:ID シート4:担当名     1列目:担当名  2列目:ID ユーザーフォームにそれぞれのコンボボックスを作っています。 ComboBox1:会社名     TextBox1:ID ComboBox2:事業部名    TextBox2:ID ComboBox3:部門名     TextBox3:ID ComboBox4:担当名     TextBox4:ID   たとえば会社名がAのときは、ComboBox2ではAの事業部だけが表示される、というようなかんじです。 同時に隣のIDももってこないといけない為に、苦戦しています。助けてください。。。。 下記記述は3番、まではうまくいくのですが、”4番TextBox2の値代入”がうまくいきません。 -------- Option Explicit Dim シート名 As String Dim 行 As Long Dim 範囲 As String Dim 事業部範囲 As String '-1---ComboBox1------------------- Private Sub ComboBox1_DropButtonClick() シート名 = "会社名" Worksheets(シート名).Activate 'ワークシートをアクティブにする Range("A1").CurrentRegion.Select 'アクティブセル領域を選択する With Selection 行 = .Rows.Count '同上領域の行数を取得する 範囲 = .Cells(1, 1).Address & ":" & .Cells(行, 1).Address '同上領域のアドレスを変数に End With ComboBox1.RowSource = シート名 & "!" & 範囲 'コンボボックスのリストのソースを設定する End Sub '-2----ComboBox1------------------- Private Sub ComboBox1_Click() 'コンボボックス上でクリックされると実行される シート名 = "会社名" 行 = ComboBox1.ListIndex + 1 'コンボボックスで選択された行 + 1 TextBox1.Text = Worksheets(シート名).Cells(行, 2) '対応するセルの値をテキストボックスに End Sub '-3----ComboBox2------------------- Private Sub ComboBox1_Change() ' ComboBox1 が変化した時の処理 シート名 = "事業部名" Dim si As Integer With UserForm1 .ComboBox2.Text = "" si = .ComboBox1.ListIndex ' ComboBox1 の何番目が選択されたかを得る Select Case si Case 0 ' 0番が選択されていたらComboBox2 の内容 Worksheets(シート名).Activate Range("A1:A6").CurrentRegion.Select With Selection 事業部範囲 = .Cells(1, 1).Address & ":" & .Cells(6, 1).Address End With ComboBox2.RowSource = シート名 & "!" & 事業部範囲 Case 1 Worksheets(シート名).Activate Range("A7:A11").CurrentRegion.Select With Selection 事業部範囲 = .Cells(7, 1).Address & ":" & .Cells(11, 1).Address End With ComboBox2.RowSource = シート名 & "!" & 事業部範囲 Case 2 Worksheets(シート名).Activate Range("A12:A15").CurrentRegion.Select With Selection 事業部範囲 = .Cells(12, 1).Address & ":" & .Cells(15, 1).Address End With ComboBox2.RowSource = シート名 & "!" & 事業部範囲 Case 3 Worksheets(シート名).Activate Range("A16:A25").CurrentRegion.Select With Selection 事業部範囲 = .Cells(16, 1).Address & ":" & .Cells(25, 1).Address End With ComboBox2.RowSource = シート名 & "!" & 事業部範囲 End Select End With End Sub '---4--TextBox2に値代入-------------------- Private Sub ComboBox2_Click() Dim si As Integer With UserForm1 .ComboBox2.Text = "" si = .ComboBox2.ListIndex ' ComboBox2 の何番目が選択されたかを得る Select Case si Case 0 ' 0番が選択されていたらComboBox2 の内容 Range("A1:A6") シート名 = "事業部名" Worksheets(シート名).Activate Range("A1:B6").CurrentRegion.Select With Selection 事業部範囲 = .Cells(1, 2).Address & ":" & .Cells(6, 2).Address End With '行 = ComboBox2.ListIndex + 1 TextBox2.Text = Worksheets(シート名).Cells(事業部範囲, 2) Case 1 Case 2 Case 3 End Select End With End Sub '----5-Close-------------------- Private Sub UserForm_Deacti Unload UserForm1 End Sub

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

  • ベストアンサー
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.2

With を使う必要は無いですね >With Worksheets("会社名") >  Me.ComboBox1.RowSource = .Range("A1").CurrentRegion.Address(External:=True) >End With    ↓ Me.ComboBox1.RowSource = Worksheets("会社名").Range("A1").CurrentRegion.Address(External:=True) >With Worksheets("事業部名") >  Me.ComboBox2.RowSource = .Range(add事業部).Address(External:=True) >End With    ↓ Me.ComboBox2.RowSource = Worksheets("事業部名").Range(add事業部).Address(External:=True)

eririn777
質問者

お礼

ご回答ありがとうございました。 別の方法でいちからやり直すことにしていまったのですが、 今後参考にさせて頂きます。

その他の回答 (1)

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.1

こんにちは、参考に Option Explicit '-1---ComboBox1------------------- Private Sub ComboBox1_DropButtonClick()   With Worksheets("会社名")     Me.ComboBox1.RowSource = .Range("A1").CurrentRegion.Address(External:=True)   End With End Sub '-2----ComboBox1------------------- Private Sub ComboBox1_Click()   Me.TextBox1.Text = Me.ComboBox1.Column(1) End Sub '-3----ComboBox2------------------- Private Sub ComboBox1_Change()   Dim add事業部 As String   If Me.ComboBox1.ListIndex = -1 Then     Me.ComboBox2.RowSource = ""     Exit Sub   End If   Select Case Me.ComboBox1.ListIndex     Case 0: add事業部 = "A1:B6"     Case 1: add事業部 = "A7:B11"     Case 2: add事業部 = "A12:B15"     Case 3: add事業部 = "A16:B25"   End Select   With Worksheets("事業部名")     Me.ComboBox2.RowSource = .Range(add事業部).Address(External:=True)   End With End Sub '---4--TextBox2に値代入-------------------- Private Sub ComboBox2_Click()   Me.TextBox2.Text = Me.ComboBox2.Column(1) End Sub

eririn777
質問者

お礼

ご回答ありがとうございました。 別の方法でいちからやり直すことにしていまったのですが、 今後参考にさせて頂きます。

関連するQ&A

  • 同じコンボボックス、リストボックスを使うには?

    よろしくお願いします。 今、ユーザーフォームを使って製造計画表を作っています。 コンボボックスで会社名、リストボックスで会社ごとの製品名を選択させるとこまで出来ました。 1日に3つの製品を作ることが出来るので、同じ中身のコンボボックス、リストボックスを使って3つ作りたいと思っています。 ユーザーフォームの形的にはこのような感じですが。 1. コンボボックス  リストボックス 2. コンボボックス  リストボックス 3. コンボボックス  リストボックス 今は、1.のとこだけは出来たのですが、2.3.は1.と同じコードをコピーして必要と思われるとこだけをコンボボックス2と変えたりしてみたのですが、上手くいきませんでした。こんなコードですが。 Private Sub UserForm_initialize() 'ComboBox1セット Dim ico As Long ico = 1 With ThisWorkbook.Worksheets("Sheet1") Do While .Cells(1, ico) <> "" Me.ComboBox1.AddItem .Cells(1, ico).Value ico = ico + 1 Loop End With Me.ComboBox1.SetFocus End Sub Private Sub ComboBox1_Change() 'ListBox1セット Dim ico As Long 'Me.ListBox1.Clear ico = Me.ComboBox1.ListIndex + 1 With ThisWorkbook.Worksheets("Sheet1") Me.ListBox1.List = .Range(.Cells(2, ico), _ .Cells(.Cells(Rows.Count, ico).End(xlUp).Row, ico)).Value End With End Sub VBAも初めたばかりで質問の内容もわかりづらいとも思いますが、よろしくお願いします。

  • コンボボックスの値で参照するワークシートを変えたい

    ●質問の主旨 ComboBox3で選択した文字列によって、参照するワークシートを 変え、そのワークシートからComboBox4に代入するには、以下の コードをどのように書き換えればよいでしょうか? ご教示願います。 ●質問の補足 添付画像でComboBox3に「営業」、「技術」、「総務」まで 入力することによってそれぞれ3つのワークシートを参照 させたいと考えています。 ・「営業」→中分類(営業)シート ・「技術」→中分類(技術)シート ・「総務」→中分類(総務)シート そして各シートにはそれぞれ異なった仕事内容の表が 既に作成されています。もしComboBox3で「営業」を 選択したなら、ComboBox4で中分類(営業)シートに 記載されている仕事内容を選択できるようにしたいと 考えています。 そのためSelect Caseステートメントを使って ComboBox3の内容によってComboBox4の内容を変える コードを作成したつもりです。 ●現在の問題点 1.下記のコードを実行しようとすると、 「実行時エラー91 オブジェクト変数またはWithブロック変数が設定されていません」 というエラーが返されます。 2.デバックするとユーザーフォームではなく、 標準モジュールの2行目 UserForm1.Show が黄色くなります。 ●コード (標準モジュール) Sub 日報記入ダイアログ() UserForm1.Show End Sub (ユーザーフォーム) Option Explicit Private Sub ComboBox4_Change() End Sub 'ユーザーフォームの初期化 Private Sub UserForm_Initialize() Dim r As Range Dim n As Range Dim d As Range Dim t As Range With Worksheets(2) Set r = .Range("C3", .Cells(.Rows.Count, 2).End(xlUp)) End With With Me.ComboBox1 .ColumnCount = 2 .ColumnWidths = ";0" .List = r.Value End With With Worksheets(3) Set n = .Range("C3", .Cells(.Rows.Count, 2).End(xlUp)) End With With Me.ComboBox2 .ColumnCount = 2 .ColumnWidths = ";0" .List = n.Value End With With Worksheets(4) Set d = .Range("C3", .Cells(.Rows.Count, 2).End(xlUp)) End With With Me.ComboBox3 .ColumnCount = 2 .ColumnWidths = ";0" .List = d.Value End With '中分類のComboBox4は「大分類」の選択内容によって参照するワークシートが変わる Select Case t Case Is = ComboBox3("営業") With Worksheets(5) Set t = .Range("C3", .Cells(.Rows.Count, 2).End(xlUp)) End With With Me.ComboBox4 .ColumnCount = 2 .ColumnWidths = ";0" .List = t.Value End With Case Is = ComboBox3("技術") With Worksheets(6) Set t = .Range("C3", .Cells(.Rows.Count, 2).End(xlUp)) End With With Me.ComboBox4 .ColumnCount = 2 .ColumnWidths = ";0" .List = t.Value End With Case Is = ComboBox3("総務") With Worksheets(7) Set t = .Range("C3", .Cells(.Rows.Count, 2).End(xlUp)) End With With Me.ComboBox4 .ColumnCount = 2 .ColumnWidths = ";0" .List = t.Value End With End Select 'メモリの解放 Set r = Nothing Set n = Nothing Set d = Nothing Set t = Nothing 'その他の初期値 TextBox3.Value = Worksheets(1).Range("a10000").End(xlUp).Row txtdate = Date End Sub 'ComboBox1をクリックしたときの処理 Private Sub ComboBox1_Click() With Me.ComboBox1 Me.Label19.Caption = .List(.ListIndex, 1) End With End Sub 'ComboBox2をクリックしたときの処理 Private Sub ComboBox2_Click() With Me.ComboBox2 Me.Label20.Caption = .List(.ListIndex, 1) End With End Sub 'ComboBox2をクリックしたときの処理(中分類の仕事によってスターマークが変わる) 'フォームからデータベースへの転記 Private Sub CommandButton3_Click() Dim Rowpos As Long Dim ColPos As Long Rowpos = Worksheets(1).Range("a10000").End(xlUp).Row ColPos = 1 Rowpos = Rowpos + 1 With Worksheets(1) .Cells(Rowpos, ColPos) = TextBox3.Value .Cells(Rowpos, ColPos + 1) = txtdate.Value .Cells(Rowpos, ColPos + 2) = Label19.Caption .Cells(Rowpos, ColPos + 3) = ComboBox1.Text .Cells(Rowpos, ColPos + 4) = ComboBox2.Text .Cells(Rowpos, ColPos + 5) = Label20.Caption .Cells(Rowpos, ColPos + 6) = ComboBox3.Text End With 'Noの加算 TextBox3.Value = TextBox3.Value + 1 Call Clearcmb End Sub 'データベース入力後にコンボボックスを空欄にする Private Sub Clearcmb() ComboBox1.Text = "" ComboBox2.Text = "" ComboBox3.Text = "" End Sub 'ユーザーフォームの終了 Private Sub CommandButton5_Click() Unload UserForm1 End End Sub 以上よろしくお願い申し上げます。使用機種はWindowsVistaで、 Excel2007です。私はVBA初心者です。添付の画像でのユーザーフォームは プリントスクリーンでWorksheet(1)に貼り付けています。

  • コンボボックスの開いたリストを閉じるには

    コンボボックスのリストを開くのはComboBox1.DropDownでできますが、閉じるのはどういう風にやればいいでしょうか。 今ユーザーフォームで Private Sub Combobox1_Change() ComboBox1.Clear v = ComboBox1.Text For i = 1 To 300 c = Worksheets("Sheet1").Cells(i, "A") If v = Left(c, Len(v)) And Len(v) > 0 Then ComboBox1.AddItem c End If Next i ComboBox1.DropDown End Sub と言う風にしていますが、リストを開きっぱなしだと変な表示になってしまい、マウスクリックで一旦閉じてから開かないと変な表示になってしまうのです。 そこで一旦リストをマクロで閉じさせてから再び開きたいのですが、どうすればいいでしょうか。

  • excel VBA コンボボックスでシート選択後エラー

    どなたかご教授願います。 ユーザーフォームにコンボボックスを配置し、ブック内のシートすべて選択できるようにしてます。選択後シートに移動するのですが、同じユーザーフォームのテキストボックス等に入力した後、コマンドボタンをクリックするとエラーとなります。しかしテキストボックス等の値は間違いなく入力されています。よろしくお願いします。 Private Sub ComboBox1_Change() → Sheets(Me.ComboBox1.Value).Select       この部分が黄色になってしまいます End Sub Private Sub CommandButton1_Click() Dim myRow As Long ActiveSheet.Select myRow = Range("B65536").End(xlUp).Offset(1, 0).Row '各テキストボックの値をセルに入力 Cells(myRow, 2).Value = TextBox1.Value Cells(myRow, 3).Value = TextBox1.Value Cells(myRow, 4).Value = ComboBox2.Value Cells(myRow, 6).Value = TextBox2.Value Cells(myRow, 7).Value = TextBox3.Value Cells(myRow, 8).Value = TextBox4.Value 'Cells(myRow, 9).Value = TextBox5.Value '書式設定 Cells(myRow, 2).NumberFormatLocal = "m" Cells(myRow, 3).NumberFormatLocal = "dd" Cells(myRow, 6).NumberFormatLocal = "#,###" 'セルに入力が各テキストボックの値をクリア ComboBox1.Value = "" ComboBox2.Value = "" TextBox2.Value = "" TextBox3.Value = "" TextBox4.Value = "" 'フォーカス移動 ComboBox2.SetFocus End Sub

  • コンボボックス or リストボックス (複数列表示→値の取得)

    マクロ初心者です。(エクセル2003使用-ユーザーフォーム) 先日はお世話になり、ありがとうございました。 作成していくうちにさらに改良を加えたく、再質問させていただきます。 ※コンボボックス内の表示を複数行表示(Sheet1の管理番号,品名,注文数量)し、そのデータをSheet2のセルA(管理番号),セルB(品名),セルC(注文数量)と貼り付けようとしております。 が、本で探したところ複数行表示のやり方がリストボックスでしかのっていなく、さらに自分で作成したマクロでは動きませんでした。 すみませんが、お力をお貸しください。 (Sheet1) 担当課 客先 管理番号 品名 注文数量 出荷数量 A 岡田さん 1324 りんご 30 20 B 山田さん 1554 みかん 250 70 C 岡田さん 7634 なし 40 25 B 金子さん 4653 みかん 75 70 A 金子さん 6675 りんご 170 60 C 杉浦さん 7789 りんご 200 120 (↓こちらは、前回質問させていただいた内容です。) Private Sub UserForm_Initialize() ComboBox1.RowSource = "Sheet1! C2:C" & Worksheets("Sheet1").Range("C" & Rows.Count).End(xlUp).Row ←ここを複数行用に変更するのでしょうか?いろいろ試したのですがダメでした。 ComboBox1.ListIndex = -1 ComboBox1.SetFocus End Sub Private Sub CommandButton1_Click() Dim lRow As Long With Worksheets("Sheet2") lRow = .Range("A" & Rows.Count).End(xlUp).Row .Range("A" & lRow + 1).Value = ComboBox1.Value End With End Sub (↓こちらは、リストボックスでのマクロですが、動きません) Private Sub UserForm_Initialize() With UserForm2.ListBox1 .ColumnWidths = "70;50;50" .ColumnCount = 3 End With With Worksheets("Sheet1") Dim MyA As Variant Dim i As Long For i = 2 To UBound(MyA, 1) .AddItem .List(i - 2, 0) = Cells(i, 1).Value .List(i - 2, 1) = Cells(i, 2).Value .List(i - 2, 2) = Cells(i, 3).Value Next End With End Sub Private Sub CommandButton1_Click() Dim lRow As Long With Worksheets("Sheet2") lRow = .Range("A" & Rows.Count).End(xlUp).Row .Range("A" & lRow + 1).Value = ListBox1.Value End With End Sub 教えていただけましたら幸いです。 よろしくお願いいたします。

  • EXCEL VBA 多種のコンボボックス操作

    こんばんは。 現在ユーザーフォーム上に10個のコンボボックスを配置しています。 1-8は共通リストを、9と10は別々のリストを表示させたいのですが・・ Private Sub UserForm_Initialize() Dim X, No, Y As Integer With UserForm2 For No = 1 To 8 For X = 0 To 7 .Controls("ComboBox" & No).AddItem Worksheets("Letter").Cells(X + 1, 10).Value Next Next For Y = 0 To 7 .ComboBox9.AddItem Worksheets("Letter").Cells(Y + 1, 11).Value .ComboBox10.AddItem Worksheets("Letter").Cells(Y + 1,12).Value Next End With End Sub 上記のコードですが、エラーが出てどうにも行き詰っています。 Private Sub UserForm_Initialize() Dim X, No As Integer For No = 1 To 8 For X = 0 To 7 UserForm2.Controls("ComboBox" & No).AddItem Worksheets("Letter").Cells(X + 1, 10).Value Next Next End Sub ↑だと1-8まで問題なく動くのですが・・・ すみませんが、アドバイスお願いいたします。

  • Excel VBAのコンボボックス

    お世話になります。 コンボボックス1と2と3は選択されますが コンボボックス4には何の表示もされません。 選択して条件設定は4つ以上できないのでしょうか? Dim ITE As Variant Dim flg As Variant Private Sub ComboBox3_Change() 'ComboBox4セット Dim ico As Long ico = 1 With ThisWorkbook.Worksheets("data") KEY = Me.ComboBox1.Text KEY2 = Me.ComboBox2.Text KEY3 = Me.ComboBox3.Text Me.ComboBox4.Clear Do While .Cells(ico, 1) <> "" If .Cells(ico, 1) = KEY And .Cells(ico, 2) = KEY2 And .Cells(ico, 3) = KEY3 Then ITE = .Cells(ico, 4).Value flg = 0 For I = 0 To Me.ComboBox4.ListCount - 1 If ITE = Me.ComboBox4.List(I) Then flg = 1 Next If flg = 0 Then Me.ComboBox4.AddItem ITE End If ico = ico + 1 Loop End With Me.ComboBox4.SetFocus End Sub

  • コンボボックスの項目と同じ項目をシートから削除する

    よろしくお願いします Private Sub 追加_Click() Dim lRow As Long With Worksheets("開始").Cells(Rows.Count, "B").End(xlUp) .Offset(1).Value = Me.combobox1.Value End With End Sub combobox1.RowSource = B2:B200 上記でリストを作成していますが、 combobox1の項目を選んで、CommandButton1クリックしたら 同じ項目をシートのセル(B列)から選んで削除する その後、空白を詰める このようにできないでしょうか

  • エクセル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 コンボボックスのリスト設定

    リストインデックスが複数ある場合は動くのですが、 インデックスが0 もしくは1個しかない場合は、どのように処理を追加したらいいでしょうか。。 実行時エラー381 Lisプロパティを設定できません。プロパティの配列のインデックスが無効です、と メッセージが出ます。 いろいろ試してるのですがわかりません。 コンボボックスの値は別シートで参照先を指定しています。 ----------- Private Sub ComboBox3_DropButtonClick() Dim lRow As Long Dim i As Long, myCnt As Long Dim myData With Worksheets("部門名") lRow = .Range("O" & Rows.Count).End(xlUp).Row ’O列の最終行を確認 myData = .Range("O2:O" & lRow).Value ’コンボボックスのリストデータ End With With ComboBox3 .ColumnCount = 1 .ColumnWidths = "50" .List = myData End With End Sub

専門家に質問してみよう