アプリ版:「スタンプのみでお礼する」機能のリリースについて

エクセルで階層図を作りたいと思っています。
イメージとしては下図のような感じです。
 
│   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 回答 (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はとても便利な道具ですが、人により向き不向きがハッキリとあります。
もしあなたが実際に動かしてみて、『これは面白い』と思われたら
あなたには適正があります。  (^-^)
    • good
    • 0
この回答へのお礼

mimeuさん
ご親切に指導いただきありがとうございます!!
実際にやってみたら、見事動きました!!!VBAを知っていれば他にも出来る事が広がり、とても楽しいです。
自分の思い通りに動かすことができればとても楽ですね(^-^)
これを機に少しずつ勉強してみようと思います。ありがとうございました!

お礼日時:2010/03/05 22:57

質問者様には申し訳ありませんが、回答ではありません。


mimeuさんのコードを、配管の系統図を描くのに使わせていただいたところ、Goodでした。
>罫線の一部がまだ描かれていませんが
処理の中に追加する才覚はないので、後処理で追加するコードを足して使用しましたが、完成を期待しています。「役に立った」です。
    • good
    • 1

No2 です。

素データはこんな感じです。
「エクセルで階層図を作る方法」の回答画像3

この回答への補足

mimeuさん、早速ご回答いただきありがとうございます。
エクセルの関数であればおおよそわかりますが、VBAは前に少しやったことがある程度で、私にはほぼわかりません。
これを機にVBAも勉強してみようと思います!
ちなみに今、色々とやってみているのですが、先ほどお教えいただいたプログラムはそのままコピペして使えるのでしょうか?VBAの画面のどこにコピペすればよろしいのでしょうか?
エクセル2007を使ってます。VBAは手順自体をあまり理解していませんがVBAのボタンを押した画面までは出しました。初心者丸出しの質問で申し訳ないですが教えていただければ大変助かりますm(__)m

補足日時:2010/03/03 00:08
    • good
    • 1

試しに作ってみました。

こんな感じです。
罫線の一部がまだ描かれていませんが、まぁ納期優先ということで。 (^-^)

プログラムは以下の通り。
共有変数を使いまくって、程度の低さバレバレですが。
前提としてシートの名前は
『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
「エクセルで階層図を作る方法」の回答画像2
    • good
    • 1

面白いアイデアですね。


こういう図が出来れば人間関係が一目で分かる。 (^-^)

> エクセルでこのような階層図を勝手に作るシステム

はい、できます。
コンピュータープログラム学校の期末試験に使えそうな問題。
初級学生泣かせの、リカージョンの見本みたいなテーマです。
エクセルなら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
    • good
    • 2

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

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