ABC
1 あ       左のようなセルを使ってツリー状にした表から
2  AAA    別シートにコンボボックスを横に3つ作成して
3  BBB    ”あ”を選択したら隣のボックスに”AAA”
4   111   と”BBB”の選択肢が現れ、”BBB”を選
5   222   択したらその隣のボックスに”111”と”222”
6 い       の選択肢が現れる といったことが出来ないでしょ
7  aaa    うか?
8   333   
9  bbb    説明がやっかいだと思いますので、「こんな本で見た」
          という覚えがある方がいらっしゃいましたら是非教えて
          下さい。お願いします。

A 回答 (3件)

質問通りの縦型の表を元に入力規則で対応してみました。

実際行ってみて、1つの深さに3列要していますので数十の深さまでは対応できそうですね。(Excel97で確認)

Sheet1のどこか3つのセルに、DATA1、DATA2、DATA3の名前を付けます。
ここに入力規則のダイアログを表示します。

質問と同じ形式の表をSheet2のA1から3列を使って作成します。

Sheet2に次の算式をコピーします。
(※は表のデータがある最後の行までコピーします。)

 E1:=MAX(MATCH("",A:A,-1),MATCH("",B:B,-1),MATCH("",C:C,-1))

※F1:=COUNTA($A$1:A1)
※G1:=COUNTA($B$1:B1)
※I1:=IF(A1<>"",$E$1-ROW()+1,0)
※J1:=INDEX(A:A,MATCH(LARGE(INDIRECT("$I$1:$I$"&$E$1),ROW()),I:I,0),0)
 K1:=MATCH(DATA1,A:A,0)
※L1:=IF(B1<>"",IF(INDEX(F:F,$K$1,1)=F1,$E$1-ROW()+1,0),0)
※M1:=INDEX(B:B,MATCH(LARGE(INDIRECT("$L$1:$L$"&$E$1),ROW()),L:L,0),0)
 N1:=MATCH(DATA2,INDIRECT("B"&(K1+1)&":B"&E1),0)+K1
※O1:=IF(C1<>"",IF(INDEX(G:G,$N$1,1)=G1,$E$1-ROW()+1,0),0)
※P1:=INDEX(C:C,MATCH(LARGE(INDIRECT("$O$1:$O$"&$E$1),ROW()),O:O,0),0)

 E3:=COUNTA(J:J)-COUNTIF(INDIRECT("J1:J"&E1),"=0")
 E4:=COUNTA(M:M)-COUNTIF(INDIRECT("M1:M"&E1),"=0")
 E5:=COUNTA(P:P)-COUNTIF(INDIRECT("P1:P"&E1),"=0")

挿入→名前→定義で名前の定義ダイアログボックスを出して、名前を3つ定義します。
1つ目、名前:List1、参照範囲:=OFFSET(Sheet2!$J$1,0,0,Sheet2!$E$3,1)
2つ目、名前:List2、参照範囲:=OFFSET(Sheet2!$M$1,0,0,Sheet2!$E$4,1)
3つ目、名前:List3、参照範囲:=OFFSET(Sheet2!$P$1,0,0,Sheet2!$E$5,1)

Sheet1で入力規則を設定します。
DATA1を選択して、データ→入力規則で、入力値の種類にリスト、元の値に =List1
DATA2を選択して、データ→入力規則で、入力値の種類にリスト、元の値に =List2
DATA3を選択して、データ→入力規則で、入力値の種類にリスト、元の値に =List3

Sheet2は項目数がわからないので縦方向で考えています。質問通りの形式で入力します。
A列が異なり、B列が同じでC列が異なるようなパターンも考慮しているつもりです。
ただ、3つの入力をした後、修正する場合、他に関係なく修正できます。この点を考慮してみましたが、長くなるので省略しています。

また、3つの入力箇所を3列(3列の入力規則)に増やしてみましたが、こういう意味の質問でした?こちらのほうが入力の省力化ができますね。
入力規則ではなく、VBAのコンボボックスで動かすには、
 ListFillRangeをList1、LinkedCellをDATA1 とかにします。

何を行っているかじっくり見ると、飛び離れたデータを1つにまとめているだけの算式でした。
汚い算式ですが、ご参考に。
    • good
    • 0

 いつだったか、このサイトで似た質問を見たことがあります。

かなり感動した記憶があります。

参考URLを見て下さい。

参考URL:http://www.okweb.ne.jp/kotaeru.php3?q=161673
    • good
    • 0

以下の様な方法で如何でしょうか



【A】選択肢の設定
  Sheet名を『TBL』と仮定して以下の様に指定します
___ A列 B列 C列 D列  E列  F列  G列  H列  I列 
1行目 __ __ __ あ   い   AAA BBB aaa bbb
2行目 あ  式1 式1 AAA aaa 000 111 333 555
3行目 い  式1 式1 BBB bbb 999 222 444 666
4行目 う  式1 式1
5行目 え  式1 式1
・・・
・・・
1)A2~Anセルに最初に表示する値を入力します

2)B2セルに以下の式を入力してB2~Cnの全セルに式をコピー
   =IF(OFFSET($D$1,ROW()-1,MATCH(OFFSET(A$1,A$1,0,1,1),$D$1:$I$1,0)-1,1,1)="","",OFFSET($D$1,ROW()-1,MATCH(OFFSET(A$1,A$1,0,1,1),$D$1:$I$1,0)-1,1,1))

    ●OFFSET関数:OFFSET(基準セル,行変位,列変位,抽出行数,抽出列数)
       基準セル:入力情報の先頭のセル($D$1)に固定
       行変位:現在行-1
       列変位:OFFSET関数でA1からA1の値分下の行のセルを抽出し
           その値でD列以降の1行目の値を検索し
           何番目の列かを決定
       抽出行数:単独セルを取り出すので1
       抽出列数:同上

    ●範囲の指定:$D$1:$I$1
       選択肢を入力した列の範囲の1行目を指定します

    ●参照結果のセルが空白の時の処理
       IF(OFFSET(~)="","",OFFSET(~))として空白時には
       空白をセットします(この処理をしないと0が返ります)

3)D列以降に以下の要領で入力
   1行目:第一・第二のコンボボックスに表示する選択肢の値
   2行目以降:選択肢の値区分名(あああAAAやBBB)に表示される値を入力

【コンボボックスの設定】
1)第一のコンボボックス 入力範囲:$A$2:$A$n リンクするセル:$A$1
2)第ニのコンボボックス 入力範囲:$B$2:$B$n リンクするセル:$B$1
3)第三のコンボボックス 入力範囲:$C$2:$C$n リンクするセル:$C$1
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエクセルでリスト選択を階層化する方法

エクセルで、顧客管理シートを作っています。

Aセル  Bセル  Cセル
東京都 -千代田区-大手町
         -永田町
    -中央区 -日本橋
神奈川県-川崎市 -麻生区
         -高津区

このように、
Aセルに東京都と入力されたら、Bセルで入力
できるのは千代田区か中央区とし、
Bセルで千代田区と入力したらCセルに入力
できるのは大手町か永田町としたいのです。
(選択リストはシートに記述されているもの
とします)

データの入力を手入力ではなく、リストから
選択する方法はわかったのですが、
このように階層構造になっているリストを実現
する方法がわかりません。

VLOOKUP関数とか使えばよいのかなとおもった
のですが、わかりませんでした。

どのようにすればよいのでしょうか?

よろしくおねがいたします。

Aベストアンサー

◆これが分かりやすいと思います

参考URL:http://www.kenzo30.com/ex_kisopoint/onepoint_sonota3.htm#Q4

Qエクセル表内で、ツリー表示させたい

エクセルの表の中で、+を押すとツリー表示がでて、-を押すと格納できる・・・というような事はできるのでしょうか?
イメージとしてはこんな感じです。
+会社名 
 ⇒ +の部分をクリック⇒ -会社名
                    使途1 金額
                    使途2 金額
                    使途3 金額
ツリー表示が必要な相手先と、そうでないところがあるので「ツリー表示ができて格納もできる」というのがポイントなんです。うまく文章にできなくてすみません。なお、マクロはしたことがないのでわかりません。宜しくお願いしますm(__)m

Aベストアンサー

質問のイメージに近いものは、エクセルでアウトライン機能しかないようです。
しかし質問の意向があいまいなので、下記をチェックして、「どこが、意に満たないか?」、教えてください(補足してください)。
下記は、「集計」機能を利用した、アウトラインです。
例データ A1:C12
会社名部名人数
あ会社人事部12
あ会社労務部23
あ会社厚生部24
あ会社工務部54
い会社労務部1
い会社勤労部2
い会社検査部3
い会社保安部4
う会社経理部12
う会社職員部33
う会社案全部333
A1:C12のどこかのセルをポイントしておいて、メニューで
データ
集計
グループの基準  会社
集計の方法 データの個数
集計するフィールド 部名をチェックを入れる
OK
会社名部名人数
あ会社人事部12
あ会社労務部23
あ会社厚生部24
あ会社工務部54
あ会社 データの個数4
い会社労務部1
い会社勤労部2
い会社検査部3
い会社保安部4
い会社 データの個数4
う会社経理部12
う会社職員部33
う会社案全部333
う会社 データの個数3
総合計11
マイナス(-)を全て(この場合3箇所)クリック
会社名部名人数
あ会社 データの個数4
い会社 データの個数4
う会社 データの個数3
総合計11
プラス(+)をクリック
あ会社、い会社、う会社のそれぞれを1社単位で、明細を出したり出さなかったりできる。
参考 http://www.eurus.dti.ne.jp/~yoneyama/Excel/mous_jyo/jyo-7/など 「エクセル アウトライン」でWEB照会してください。

質問のイメージに近いものは、エクセルでアウトライン機能しかないようです。
しかし質問の意向があいまいなので、下記をチェックして、「どこが、意に満たないか?」、教えてください(補足してください)。
下記は、「集計」機能を利用した、アウトラインです。
例データ A1:C12
会社名部名人数
あ会社人事部12
あ会社労務部23
あ会社厚生部24
あ会社工務部54
い会社労務部1
い会社勤労部2
い会社検査部3
い会社保安部4
う会社経理部12
う会社職員部33
う会社案全部333
A1:C12のど...続きを読む

Qエクセルで階層図を作る方法

エクセルで階層図を作りたいと思っています。
イメージとしては下図のような感じです。
 
│   A   │   B   
_│_____________
1│  ID番号│ 紹介者ID
2│   01  │  --   
3│   02  │  01   
4│   03  │  01   
5│   04  │  02   
6│   05  │  02   
7│   06  │  03   
8│   07  │  03   

↓↓↓↓↓↓↓↓↓↓↓↓

■01
├■02
│├■04
│└■05
└■03
├■06
└■07


セルの中にID番号を入れるだけで勝手に階層図ができたら非常に
楽なんですが、エクセルでこのような階層図を勝手に作るシステムを
組むことはできないでしょうか?
少しでも手がかりがあれば教えていただきたいと思いますので
よろしくお願いいたします。

Aベストアンサー

> プログラムはそのままコピペして使えるのでしょうか?
はい、使えます。
ただし次の条件が必要です。
(1) ID表が入っているシートの名前を『ID表』とすること。
  (『』 は付けませんよ)
(2) 他に『作業用』、『階層図』という名のシートをあらかじめ作っておくこと。

> VBAの画面のどこにコピペすればよろしいのでしょうか?

(1) まず普通に ID表 の入ったブックを開きます。
   (仮に ABCD.XLS という名だとします)
(2) [Alt] + [F11] キーを押します。
   → VBAの編集画面が表示されます。(ここまではご存じですね)
(3) 画面左に プロジェクトエクスプローラー といタテ長の窓がありますから
  その中の VBAProject(ABCD.XLS) を探し、左クリックします。
(4) メニュー > 挿入 > 標準モジュール
  とすると画面右が真っ白になり、タイトルバーに
  Microsoft Visual Basic - ABCD.XLS - [Module1(コード)]
  などと表示されます。
  この真っ白なのが Module1 で、メモ帳と同じように編集できます。
(5) そこへプログラムを貼り付けます。

  ・・・私のPCはExcel2003なので、多少の違いがあるかもしれません。

実行のしかたはご存じでしょうが、念のため申しますと、次の二通り。どちらでもよろしい。
(A) Sub 紹介者ツリー図() のどこかをクリックして [F5] を押す。
(B) Excelの画面に戻って
  ツール > マクロ > マクロ  で マクロ ダイアログを表示し
  マクロ名 の中から 紹介者ツリー図 を探して選択し 実行 ボタンを押す。


余談ですが
VBAはとても便利な道具ですが、人により向き不向きがハッキリとあります。
もしあなたが実際に動かしてみて、『これは面白い』と思われたら
あなたには適正があります。  (^-^)

> プログラムはそのままコピペして使えるのでしょうか?
はい、使えます。
ただし次の条件が必要です。
(1) ID表が入っているシートの名前を『ID表』とすること。
  (『』 は付けませんよ)
(2) 他に『作業用』、『階層図』という名のシートをあらかじめ作っておくこと。

> VBAの画面のどこにコピペすればよろしいのでしょうか?

(1) まず普通に ID表 の入ったブックを開きます。
   (仮に ABCD.XLS という名だとします)
(2) [Alt] + [F11] キーを押します。
   → VBAの編集画面が表...続きを読む

QVBAでシートからコンボボックスにデータを設定する方法

VBAにてフォーム起動時にシート内に設定した
値をコンボボックスに取り込みたいのですが・・。
たとえばA列に連続で入力されているデータを
取り込むなど・・。
設定データ数は動的に変化します。

Aベストアンサー

もうほとんど同じですが…

Private Sub UserForm_Initialize()
Dim i As Integer

 ComboBox1.Clear
 For i = 1 To Worksheets("sheet1").Cells(Rows.Count, 1).End(xlUp).Row
  ComboBox1.AddItem Worksheets("sheet1").Cells(i, 1).Value
 Next
End Sub

Q2つ以上のチェックボックスを連動させるには?

Eecelで、同一シートに複数のチェックボックスがあるとき、ある特定のチェックボックスにチェックを入れると、他の特定のチェックボックスに自動的にチェックが入るようにするには、どうすればいいのでしょうか?

Aベストアンサー

チェックボックスは「フォーム」のチェックボックスを使用されていますか?
その場合、リンクするセルを指定できるはずです。
ここでVBAを使って
仮に1A1にあるのチェックボックスにチェックを入れた時、
B1、C1のチェックボックスにチェックを入れたいとします。
Sub test()
If Cells(1, 1) = true Then
cells(1,2)=true
cells(1,3)=true
elseif Cells(1, 1) = False Then
cells(1,2)=false
cells(1,3)=false
End if

これをA1のチェックボックスの「マクロを登録」のところで指定して下さい。

これで連動すると思いますが。

Qセルの値が変ると自動でマクロが実行される。

セルの値が変ると自動でマクロが実行されるVBAを教えて下さいm(_ _ )m
例えば、シート1のA1の値が変ると、マクロAが実行される。
シート1のA2の値が変ると、マクロBが実行される。
と一つのシート内に複数のイベントを設置したのですが、イマイチわかりません。
知恵をお貸し下さい。

Aベストアンサー

こんにちは
お邪魔します。

(1)まずはオーダー通りの基本型

Private Sub Worksheet_Change(ByVal Target As Range)
' ' 複数セルが変更された場合(単セルでない場合)は処理を抜ける
If Target.Count > 1 Then Exit Sub
' ' 変更されたセルが1列めでない場合は処理を抜ける
If Target.Column <> 1 Then Exit Sub
' ' 変更されたセルの行位置によって処理を分岐する
Select Case Target.Row
Case 1
' A1 の場合の処理
MsgBox "A1" ' 確認用(確認が済んだら当行削除)
Case 2
' A2 の場合の処理
MsgBox "A2" ' 確認用(確認が済んだら当行削除)
End Select
End Sub

(2)セルの位置によってもっと細かく分岐したい場合

Private Sub Worksheet_Change(ByVal Target As Range)
' ' 複数セルが変更された場合(単セルでない場合)は処理を抜ける
If Target.Count > 1 Then Exit Sub
' ' 変更されたセルの 列位置 によって処理を分岐する
Select Case Target.Column
Case 1 ' 1列めなら
' ' 変更されたセルの 行位置 によって処理を分岐する
Select Case Target.Row
Case 1 ' 1列め の 1行め なら
' A1 の場合の処理
MsgBox "A1" ' 確認用(確認が済んだら当行削除)
Case 2 ' 1列め の 2行め なら
' A2 の場合の処理
MsgBox "A2" ' 確認用(確認が済んだら当行削除)
End Select
Case 2 ' 2列めなら
' ' 変更されたセルの 行位置 によって処理を分岐する
Select Case Target.Row
Case 1 ' 2列め の 1行め なら
' B1 の場合の処理
MsgBox "B1" ' 確認用(確認が済んだら当行削除)
Case 2 ' 2列め の 2行め なら
' B2 の場合の処理
MsgBox "B2" ' 確認用(確認が済んだら当行削除)
End Select
End Select
End Sub

(3)セルのアドレスを採り文字列で分岐したい場合
   (個人的にはあまりお奨めしていませんが、知っておいた方が好いもの)

Private Sub Worksheet_Change(ByVal Target As Range)
'' ' 変更されたセルの 参照文字列(A1型) によって処理を分岐する
Select Case Target.Address(False, False)
Case "A1"
MsgBox "A1" ' 確認用(確認が済んだら当行削除)
Case "A2"
MsgBox "A2" ' 確認用(確認が済んだら当行削除)
Case "B1"
MsgBox "B1" ' 確認用(確認が済んだら当行削除)
Case "B2"
MsgBox "B2" ' 確認用(確認が済んだら当行削除)
End Select
End Sub

とりあえず、単セルの場合だけ、理解を深めてみましょう。
複数セルに値変更があった場合については、その後でいいと思います。
(1)にある
If Target.Count > 1 Then Exit Sub
If Target.Column <> 1 Then Exit Sub
のような記述はイベントプロシージャでは多用される基本中の基本ですから
よーく咀嚼して呑み込んじゃってください。

一応、いわずもがなですが、
上に挙げたようなイベントプロシージャを複数併記することはできませんので
使わないものはコメントブロックして下さい。
VBE(Visual Basic Editor)のツールバーに[編集]というのを追加してあれば
[コメントブロック]、[非コメントブロック]というボタンがありますので適宜。

また、イベントプロシージャで注意するべき点として
例えば今回のChangeイベントの処理中にセルの値を変更すれば
再度Changeイベントが呼び出される(再帰)ということを知っておいてください。
その場合、
  Application.EnableEvents = False
  ' 処理
  Application.EnableEvents = True
のような形で、再帰を回避します。

私自身VBAを覚え初めの頃は、イベントプロシージャとばかり格闘して
日に何百回もエラーを出しながら納得がいくまで色んなことを試していた覚えがあります。
・オブジェクトやプロパティの基本的な扱い方
・条件分岐
などの基本事項を覚えるのには最適の課題ですから、頑張って挑戦し続けてください。

以上です。

///
Re:#2 ちょっと違うかも。
それは、「A1 と 同じ値 に変更された セル があった場合」の処理になっています。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target = Range("A1") Then
MsgBox Target.Address
End If
End Sub
として、例えば、C3セルにA1と同じ値を設定すると違うのがわかると思います。
あしからず、、、

こんにちは
お邪魔します。

(1)まずはオーダー通りの基本型

Private Sub Worksheet_Change(ByVal Target As Range)
' ' 複数セルが変更された場合(単セルでない場合)は処理を抜ける
If Target.Count > 1 Then Exit Sub
' ' 変更されたセルが1列めでない場合は処理を抜ける
If Target.Column <> 1 Then Exit Sub
' ' 変更されたセルの行位置によって処理を分岐する
Select Case Target.Row
Case 1
' A1 の場合の処理
MsgBox "A1" ' 確認用(確認が済んだら当行削除)
...続きを読む


人気Q&Aランキング