[VBA]組織のツリー構造をディクショナリを使い構成する
組織ツリーとは
大規模な組織ではマネジメントのためにツリー状の階層的な組織を構成しますが、各組織の識別のために組織コードを持たせます。
プログラムを作る際にも、その組織構造をデータとして持つ必要があり、ツリー状につながったデータを持たせる必要があり、それを組織ツリーと呼んでいます。
人が組織を管理する際には、一般に組織のテーブルで表現しますが、プログラムでは、構成する組織階層以外の組織の組み合わせを排除するために、組織コードのテーブルから組織ツリーを構成します。
テーブルからツリー構造のデータを持たせるには、プログラムとしては以下のように構成するとうまくいきます。
組織テーブルを作り配列に取り込む
まず組織階層の組み合わせと組織コードのテーブルをシートに記述し、組織データを取り込みます。
With ThisWorkbook.Sheets("組織テーブル")
endRow = .Cells(Rows.Count, 1).End(xlUp).row
endCol = .Cells(1, Columns.Count).End(xlToLeft).Column
'組織テーブルのデータを取得する
orgTable = .Range(.Cells(1, 1), .Cells(endRow, endCol))
End with
このテーブルの先頭行には組織階層を示す物理名などを記述します。
この物理名を取り込むために、先頭行の物理名をディクショナリへ取り込み、テーブルの列番号を先頭行の物理名で、各列のデータを指定できるようにします(柔軟性と可読性を高めます)。
For i = 1 To endCol
組織テーブル列.Add orgTable(1, i), i
Next
配列から構造を作り出す
テーブルの取り込みが完了したら組織構造を作っていきます。組織階層(先頭行に書いた物理名)は、company_identifier,business_divison,officeの3階層と仮定します。
構造を作るには、2行目から行の最後までテーブルをなめます。
For i = 2 To endRow
・
・
Next i
このループの中身で次の操作をします。
・初めての組織の場合、その下の組織配列(重複なし)を初期化する
・組織配列を生成する(重複なし)
・上位組織名をキーとするディクショナリに組織配列(重複なし)を格納する
・組織名から組織コードを抽出するディクショナリを生成する
・組織コードから組織名を抽出するディクショナリを生成する
とここまで書きましたが辛くなってきましたww
この記事に反応があれば、続きの記事を書いてみたいと思います。
ではでは。
この記事が気に入ったらサポートをしてみませんか?