• ベストアンサー

エクセル ドロップダウンリストについて

A,B,C,D列にドロップダウンリストを設定し連動できるかお教え下さい。 A列のリストに値を複数設定し、B列のリストの値をA列の値によって変化させるまでは過去の回答にて確認しました。そのB列の値によってC列もドロップダウンリストを設定し、さらにD列も同様に・・というのは 可能なものでしょうか。

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

  • ベストアンサー
  • vista2446
  • ベストアンサー率46% (131/279)
回答No.2

リストに名前を付けることで可能です。 C列に表示させるリストを選択して、B列で選択される値を名前として付けます。名前は、リストを選択して[挿入]→[名前]→[定義]で付けてください。 C列でドロップダウンを設定する時に[元の値]でINDIRECT関数を使います。「=INDIRECT(B1)」(B1セルの値を反映させる場合)と記述してください。 C列で選択された値を名前とするリストを、D列でドロップダウンさせることができます。

a-123
質問者

お礼

ありがとうございました。できました。かなり効率がよくなります。 感謝します!!

すると、全ての回答が全文表示されます。

その他の回答 (3)

回答No.4

No.3です。 マクロの改良版を作ってみました。もしよろしければ、お試し下さい。 【使い方】 ・リスト項目は、シート名を「リスト項目」としたシートに全て入力して下さい。 ・例えば、ルートの下に「AA」「BB」「CC」、「AA」の下に「AAA-1」「AAA-2」「AAA-3」、「AAA-1」の下に「aaa-1」「aaa-2」というツリー構造となっている場合、以下のように入力して下さい。 (1) 「ルート」「1」「AA」「BB」「CC」 (2) 「AA」「1」「AAA-1」「AAA-2」「AAA-3」 (3) 「AAA-1」「4」「aaa-1」「aaa-2」 等々 ・「 」は1つ1つのセルを表わします。ここでは横方向に書きましたが、全て縦方向(行方向)に入力下さい。入力に使えるエリアは"A1:Z1000"としてあります。 ・上記エリア内であれば、使用する位置に制約はありません。また(1)~(3)のような書き方でツリー構造を把握する方法なので、一連項目の入力順序(位置)とツリー構造とを対応させる必要もありません。 ・ただし、(1)~(3)のような一連の項目は1行も空けずに続けて入力下さい。一連項目と別の一連項目との間には最低1行の空行を入れて下さい(空行が何行続いても構いません)。 ・ツリーの一番上に当たる項目リストは、必ず"ルート"(全角)として下さい。 ・項目名は、重複がないようにして下さい。 ・(1)~(3)のように、2番目には必ず自然数を入れて下さい。この数字はその項目が使用するセル数です。例えば「サイズ」「重量」という選択肢の場合、「サイズ」の記入用に3セル使用するのであれば、4として下さい。「サイズ」「10cm」「20cm」「30cm」の4セルという意味です。「重量」を選んだときは、1セルしか使わないと思いますが、最もたくさんセルを使用する項目に合わせて下さい。従って、「重量」「5kg」「」「」という感じになってしまい、カッコ悪いかもしれませんが、ご容赦下さい。 ・ツリーの一番下に来る項目には必ず「備考」という項目を付けて下さい。ツリーの一番下に来る項目が100個あったら、大変お手数ですが、一連のセルの組を100セットご入力頂くことになります。どんくさい仕組みで申し訳ありません。以下のような感じです。 ・「aaa-1」「2」「備考」 ・「AAA-3」「2」「備考」 等々 ・実際の入力作業は、入力を開始したいセルを選択後、マクロを実行させて下さい。 ・データ入力の開始を、B列としました。もし変更の必要がある場合には、プログラムを次のように書き換えて下さい。プログラムの上の方にある 「Retsu_Start = 2 ' 入力シートの入力開始列:B列 = 2」 の「Retsu_Start = 2」の"2"をA列なら1、B列なら2、C列なら3、D列なら4、E列なら5、‥‥として下さい。 ・選択するセルは必ずしも行の先頭(今のままならB列)である必要はありません。次のような場合、既に入力済みのデータを消さずに「*」のセルを選択すれば、そこから開始されます。ただし、2番目のような場合に「*」ではなく「10cm」等を選択すると誤動作します。 ・「AA」「AAA-1」「*」 ・「AA」「AAA-1」「aaa-2」「10cm」「20cm」「30cm」「*」 ・マクロの終了は「備考」の入力(何も入力せずOKでも可)後に、作業を続けるかどうかを聞いてきますので、ここで「いいえ」をクリックして下さい。 【マクロ】 No.3が残っているとマクロ選択時に間違う恐れがあるので、新規ブックにマクロ内容をコピーし、試してみて下さい。 Option Explicit '---------------------------------------------------------------- ' リスト化 改良版 '---------------------------------------------------------------- Sub リスト化_改() Dim Item_Cnt_0 As Integer, Item_Cnt_1 As Integer, Item_Max As Integer Dim Item(500, 500) As Variant, Item_List As String, Komoku As Variant, Naiyo As Variant Dim Gyo_Max As Integer, Retsu_Max As Integer, Retsu_Start As Integer, Retsu_Offset As Integer Dim Gyo As Integer, Retsu As Integer, i As Integer, j As Integer, k As Integer, m As Integer Dim Nyuryoku_Sheet As String, Response As String, Cell_Su As Integer Gyo_Max = 1000 ' Sheet("リスト項目")の使用行数。Excel上限:65536 Retsu_Max = 26 ' Sheet("リスト項目")のA列~Z列を使用。 Retsu_Start = 2 ' 入力シートの入力開始列:B列 = 2 Nyuryoku_Sheet = ActiveSheet.Name Gyo = ActiveCell.Row Retsu = ActiveCell.Column ' リスト項目取得 Sheets("リスト項目").Select Item_Cnt_0 = 0 For i = 1 To Retsu_Max Item_Cnt_1 = 0 For j = 1 To Gyo_Max If Cells(j, i).Value = Empty Then Item_Cnt_1 = 0 Else If (j = 1) Or (Cells(j - 1, i) = Empty) Then Select Case Cells(j, i).Value Case "ルート" k = 0 Case Else Item_Cnt_0 = Item_Cnt_0 + 1 k = Item_Cnt_0 End Select End If Item_Cnt_1 = Item_Cnt_1 + 1 Item(k, 0) = Item_Cnt_1 Item(k, Item_Cnt_1) = Cells(j, i).Value End If Next j Next i Range("A1").Select ' リスト項目検索 Sheets(Nyuryoku_Sheet).Select Retsu_Offset = -1 Label1: Select Case Retsu Case Retsu_Start m = 0 Case Else If Retsu = Retsu_Start + 1 Then Retsu_Offset = 1 End If Select Case Retsu_Offset Case -1 For j = 1 To Retsu - Retsu_Start For i = 1 To Item_Cnt_0 If Item(i, 1) = Cells(Gyo, Retsu - j) Then m = i GoTo Label2 End If Next i Next j Case Else For i = 1 To Item_Cnt_0 If Item(i, 1) = Cells(Gyo, Retsu - Retsu_Offset) Then m = i GoTo Label2 End If Next i End Select End Select Label2: ' 入力作業 Cell_Su = Item(m, 2) Item_List = 1 & ":" & Item(m, 3) For i = 4 To Item(m, 0) Item_List = Item_List & "、 " & i - 2 & ":" & Item(m, i) Next i Label3: If Item(m, 0) = 3 Then Komoku = 1 Else Cells(Gyo, Retsu).Select Let Komoku = InputBox(Item_List & " から数字を選んで下さい。", "項目指定") Komoku = Val(Komoku) If (Komoku = Empty) Or (Komoku < 1 Or Item(m, 0) - 2 < Komoku) Then GoTo Label3 End If End If Cells(Gyo, Retsu) = Item(m, Komoku + 2) If Cell_Su >= 2 Then For i = 1 To Cell_Su - 1 Cells(Gyo, Retsu + i).Select Let Naiyo = InputBox("「" & Item(m, Komoku + 2) & "」の内容を入力して下さい。", Item(m, Komoku + 2)) Cells(Gyo, Retsu + i) = Naiyo Next i End If If Item(m, Komoku + 2) = "備考" Then Response = MsgBox("作業を続けますか?", vbYesNo, "続行/終了") If Response = vbYes Then Gyo = Gyo + 1 Retsu = Retsu_Start GoTo Label1 End If Else Retsu = Retsu + Cell_Su Retsu_Offset = Cell_Su GoTo Label1 End If End Sub

すると、全ての回答が全文表示されます。
回答No.3

a-123さんのご希望に合っているかどうか、全く自信はありませんが、簡単なマクロを作ってみました。どんくさい内容で恐縮ですが、もしよろしければ、お試し下さい。 ・このマクロは、実行前に選択したセルの左隣の列にある文字列等の項目に対して、取得・ソート・重複削除を行い、リスト項目とします。そして実行前に選択したセル及びその下のセルを、リスト化します。 ・入力開始行から100行目までを対象としていますが、それ以上必要な場合は、プログラム中に2箇所ある"100"を適切な数値に書き換えて下さい。 【例】 ・リストがA2から下に入っている場合は、B2を選択しマクロを実行させて下さい。B2から下がリスト化(ドロップダウンリスト化)されます。 ・マクロ実行前にB4を選択すると、A4から下がリスト項目になり、B4から下がリスト化されます。 【マクロ内容】 (マクロの貼り付けの際、字下げのスペースが削除されてしまいました。また_による改行もしていません。大変見にくい申し訳ありませんが、ご容赦頂ければ幸いです) Option Explicit '---------------------------------------------------------------- ' リスト化 '---------------------------------------------------------------- Sub リスト化() Dim Item_Cnt_0 As Integer, Item_Cnt_1 As Integer, Item_Max As Integer Dim Item(100) As Variant, Item_List As String, Kari As Variant Dim Kaishi As Integer, Retsu As Integer, i As Integer, j As Integer Item_Max = 100 Retsu = ActiveCell.Column Kaishi = ActiveCell.Row If Retsu = 1 Then MsgBox "リスト化はB列以降で実行可能です。" End End If ' データ取得 Item_Cnt_0 = 0 For i = 0 To Item_Max - 1 If Cells(i + Kaishi, Retsu - 1).Value <> Empty Then Item_Cnt_0 = Item_Cnt_0 + 1 Item(Item_Cnt_0) = Cells(i + Kaishi, Retsu - 1).Value End If Next i If Item_Cnt_0 = 0 Then Kari = MsgBox("左側の列に何も入力されていません。リスト化を解除する場合は「はい」、現状のままの場合は「いいえ」をクリックして下さい。", vbYesNo, "未入力時の処理") If Kari = vbYes Then Range(Cells(Kaishi, Retsu), Cells(Kaishi + Item_Max, Retsu)).Select Selection.Validation.Delete End If End Cells(Kaishi, Retsu).Select End End If ' ソート i = Item_Cnt_0 Do While i >= 1 j = Item_Cnt_0 - 1 Do While j >= Item_Cnt_0 - i + 1 If Item(j) > Item(j + 1) Then Kari = Item(j) Item(j) = Item(j + 1) Item(j + 1) = Kari End If j = j - 1 Loop i = i - 1 Loop ' 重複削除 Item_Cnt_1 = 1 Item(Item_Cnt_1) = Item(1) For i = 2 To Item_Cnt_0 If Item(Item_Cnt_1) <> Item(i) Then Item_Cnt_1 = Item_Cnt_1 + 1 Item(Item_Cnt_1) = Item(i) End If Next i ' 文字列の連結 Item_List = Item(1) For i = 2 To Item_Cnt_1 Item_List = Item_List & "," & Item(i) Next i ' リスト化 Range(Cells(Kaishi, Retsu), Cells(Kaishi + Item_Max, Retsu)).Select With Selection.Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Item_List .IgnoreBlank = True .InCellDropdown = True .ErrorMessage = "リストから選択して下さい" .IMEMode = xlIMEModeNoControl .ShowInput = True .ShowError = True End With Cells(Kaishi, Retsu).Select End Sub (注) マクロを全くご存じなければ、以下の操作をしてみて下さい。 「ツール」「マクロ」「マクロ」を選択し、マクロ名のところに、(例えば)"リスト化"を入力して下さい。次に「作成」をクリックすると、下のような画面が出てくると思いますので、上記のように修正して下さい。作業が完了したら、「デバッグ」「VBAProjectのコンパイル」を選択して下さい。ここでもしエラーが出てしまったら、近くの詳しい方に教えて頂くのが賢明です。無事コンパイルが終了したら、(このままでも動くのですが)「ファイル」「終了してMicrosoft PowerPointへ戻る」を選択して下さい。実行は「ツール」「マクロ」「マクロ」で実行するマクロ名を選択し「実行」をクリックして下さい(シート上にボタンを作成しクリックすれば実行できるようになるのですが、説明がやや複雑になるので今回は省略します)。なおファイルを保存後に再度開く際は「マクロを有効にする」をクリックして下さい。何も表示が出ず、ファイルが開いてしまう等の場合は、「ツール」「オプション」タブ「セキュリティ」タブ「セキュリティレベル」で「中」を選択して下さい。 Option Explicit Sub リスト化() ' ' マクロ作成日 : ●●/●●/●● 作成者 : ●● ' End Sub

a-123
質問者

お礼

ありがとうございます。マクロを試してみました。 ご丁寧に回答いただきましてありがとうございました。 ほぼやりたいことに近い結果が得られましたが、各項目ごとに対応する項目が決まっているのでリストの中身が変わるようにしたいと思っております。説明が不足しておりまして申し訳ございませんでした。 マクロの操作も素人のため初めてやってみました。大変勉強になりました。ありがとうございました。

すると、全ての回答が全文表示されます。
  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.1

具体的な例を示して頂けませんでしょうか? 宜しくお願い致します

a-123
質問者

補足

具体例がなくすいませんでした。 電話がかかってきた履歴をとりたいと思ってます。 1          2      3     4    5 商品内容問い合わせ  大きさ   10cm  商品名A  赤色 商品内容問い合わせ  大きさ   10cm  商品名A  青色 商品内容問い合わせ  大きさ   10cm  商品名B  青色 商品内容問い合わせ  重さ    10g   商品名C  赤色 営業所場所問い合わせ 東京    渋谷支店  担当    名前 営業所場所問い合わせ 大阪    渋谷支店  担当    名前 操作方法問い合わせ  録音方法  説明済   故障    交換 操作方法問い合わせ  録音方法  説明済   故障    有償 など、というようにそれぞれ「1」~「5」をドロップダウンリストで順番に選択していくだけで入力ミスなどないようにしたいと思っております。「1」~「5」の項目はそれぞれ5~20程度の細かい項目にわかれツリー状になりますので最終的には「1行」の表記パターンは100通り程度になるようなイメージです。

すると、全ての回答が全文表示されます。

関連するQ&A