見出し画像

[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

この記事に反応があれば、続きの記事を書いてみたいと思います。

ではでは。

この記事が気に入ったらサポートをしてみませんか?