- ベストアンサー
エクセルで階層図を作る方法
- エクセルで階層図を作る方法を知りたいです。
- エクセルでID番号を入力して階層図を自動生成することはできるでしょうか?
- 手軽に階層図を作成するためのエクセルの機能や方法について教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> プログラムはそのままコピペして使えるのでしょうか? はい、使えます。 ただし次の条件が必要です。 (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はとても便利な道具ですが、人により向き不向きがハッキリとあります。 もしあなたが実際に動かしてみて、『これは面白い』と思われたら あなたには適正があります。 (^-^)
その他の回答 (4)
- mitarashi
- ベストアンサー率59% (574/965)
質問者様には申し訳ありませんが、回答ではありません。 mimeuさんのコードを、配管の系統図を描くのに使わせていただいたところ、Goodでした。 >罫線の一部がまだ描かれていませんが 処理の中に追加する才覚はないので、後処理で追加するコードを足して使用しましたが、完成を期待しています。「役に立った」です。
- mimeu
- ベストアンサー率49% (39/79)
No2 です。素データはこんな感じです。
補足
mimeuさん、早速ご回答いただきありがとうございます。 エクセルの関数であればおおよそわかりますが、VBAは前に少しやったことがある程度で、私にはほぼわかりません。 これを機にVBAも勉強してみようと思います! ちなみに今、色々とやってみているのですが、先ほどお教えいただいたプログラムはそのままコピペして使えるのでしょうか?VBAの画面のどこにコピペすればよろしいのでしょうか? エクセル2007を使ってます。VBAは手順自体をあまり理解していませんがVBAのボタンを押した画面までは出しました。初心者丸出しの質問で申し訳ないですが教えていただければ大変助かりますm(__)m
- mimeu
- ベストアンサー率49% (39/79)
試しに作ってみました。こんな感じです。 罫線の一部がまだ描かれていませんが、まぁ納期優先ということで。 (^-^) プログラムは以下の通り。 共有変数を使いまくって、程度の低さバレバレですが。 前提としてシートの名前は 『ID表』、『作業用』、『階層図』としています。 ID表が素データで、階層図がアウトプットです。 Option Explicit Private ID表 As Worksheet, 作業用 As Worksheet, 階層図 As Worksheet Private ID表の行末 As Long, 表示行 As Long Sub 紹介者ツリー図() Dim 行1 As Long, 行2 As Long, 行末 As Long Set ID表 = Worksheets("ID表") Set 作業用 = Worksheets("作業用") Set 階層図 = Worksheets("階層図") 作業用.UsedRange.Clear 階層図.UsedRange.Clear ID表の行末 = ID表.Range("A1").End(xlDown).Row 行2 = 1 For 行1 = 2 To ID表の行末 If ID表.Cells(行1, 2) = "--" Then 作業用.Cells(行2, 1) = ID表.Cells(行1, 1) 行2 = 行2 + 1 End If Next 行1 行末 = 行2 - 1 表示行 = 1 For 行2 = 1 To 行末 階層図.Cells(表示行, 1) = "■" & 作業用.Cells(行2, 1).Text 表示行 = 表示行 + 1 ツリー図2 作業用.Cells(行2, 1).Text, 2 Next 行2 End Sub Private Function ツリー図2(今のID As String, 階層) ' 紹介者列から大元ID に紹介されたID(A列)を列挙しソートする Dim 行1 As Long, 行2 As Long, 行末 As Long, 列 As String, 罫線 As String ' 紹介者列から大元ID に紹介されたID(A列)を列挙しソートする 行2 = 1 For 行1 = 2 To ID表の行末 If ID表.Cells(行1, 2) = 今のID Then 作業用.Cells(行2, 階層) = ID表.Cells(行1, 1) 行2 = 行2 + 1 End If Next 行1 行末 = 行2 - 1 列 = Chr(64 + 階層) ' 見やすくするため ID 番号順に並べ替え If 行末 > 1 Then _ 作業用.Range(列 & "1:" & 列 & 行末).Sort Key1:=作業用.Range(列 & "1"), _ Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal ' 順に再帰コール If 行末 > 0 Then For 行2 = 1 To 行末 If 行2 = 行末 Then 罫線 = "└" Else 罫線 = "├" 階層図.Cells(表示行, 階層 - 1) = 罫線 階層図.Cells(表示行, 階層) = "■" & 作業用.Cells(行2, 階層).Text 表示行 = 表示行 + 1 ツリー図2 作業用.Cells(行2, 階層).Text, 階層 + 1 Next 行2 End If End Function
- mimeu
- ベストアンサー率49% (39/79)
面白いアイデアですね。 こういう図が出来れば人間関係が一目で分かる。 (^-^) > エクセルでこのような階層図を勝手に作るシステム はい、できます。 コンピュータープログラム学校の期末試験に使えそうな問題。 初級学生泣かせの、リカージョンの見本みたいなテーマです。 エクセルならVBAを使います。 やることとしては (1) ID番号から順にひとつのID番号を取り上げ シートに出力する行、階層の深さと共に (2) 以下の処理を渡す (2) 紹介者ID に (1)のIDを持つ行を探しその行のID番号を列挙していく。 その時、それまで順にたどってきたIDが二度登場しないようにする。 (3) もし (2) に該当するIDがひとつもなければ 指定されたシートの指定行・列に渡されたIDを書込んでリターン (4) (2) に該当するIDがあれば(2) そのIDについて順にもう一度 (2) を呼ぶ といった感じになります。 ・・・充分時間を掛けて検討していませんので、 (1)~(4) の説明は相当にラフです。 m(_ _)m
お礼
mimeuさん ご親切に指導いただきありがとうございます!! 実際にやってみたら、見事動きました!!!VBAを知っていれば他にも出来る事が広がり、とても楽しいです。 自分の思い通りに動かすことができればとても楽ですね(^-^) これを機に少しずつ勉強してみようと思います。ありがとうございました!