社員リストを使って組織図を作成する

Lisa Wollin
Microsoft Corporation

April 2001

対象 :
   Microsoft® PowerPoint® Version 2002
   Microsoft Word Version 2002
   Microsoft Excel Version 2002

概要 : Microsoft Office 10.0 オブジェクト ライブラリには、 Word、PowerPoint および Excel で図表を作成するための新しいオブジェクトが含まれています。この記事では、これらの新しいオブジェクトについて説明し、データベース内のデータから組織図を作成する方法を示しています。

MSDN Online Code Center (英語) で ODC_CreateOrgCht.exe サンプル コードを参照できます。

目次

はじめに
簡単な図表の作成
ノードの追加
ノードへのテキストの追加
社員リストから組織図を作成
まとめ

はじめに

MS-DOS® オペレーティング システムの時代には、描画プログラムで組織図や図表を作成し、それを紙のドキュメントに含めるために、出力した図表を (はさみで) 切り取って、(テープで) 貼り付けていたことを思い出します。もちろん、描画プログラムのマニュアルには描画したものを保存し、それをグラフィックとしてインポートする方法が説明されていましたが、それが完全に正しく機能した (または表示された) という記憶はありません。

その後、Microsoft Windows® オペレーティング システムでは、描画アプリケーションから図表を切り取り、ドキュメントに貼り付ける作業をより容易に行える機能が導入されました。さらに、Windows 環境で描画アプリケーションで保存したグラフィックをインポートする作業は、MS-DOS 環境に比べてはるかに容易で魅力的なものになりましたが、それでも複数の手順を必要とするプロセスでした。

Office XP では、図表を作成する処理が Word、 PowerPoint、および Excel に本来備わった機能になったので、以前よりもはるかに容易に文書、プレゼンテーション、およびスプレッド シートに図表を追加できるようになりました。この記事では、Word や PowerPoint 10.0 のオブジェクト ライブラリに組み込まれた図表作成機能を使って、プログラムから図表を作成する方法を学習します。

注意    Excel 10.0 のオブジェクト ライブラリだけは、わずかな違いがあります。この記事のコード サンプルは、特に注意書きがない限り、何も変更しないで機能するのは、 Word および PowerPoint のみです。

簡単な図表の作成

Shapes コレクションの AddDiagram メソッドを使用して、組織図、ドーナツ型図表、ピラミッド型図表、放射型図表、ターゲット型図表、またはベン図形型図表を作成できます。図表を作成するときの PowerPoint、Word、および Excel の相違点は、アプリケーションで Shapes コレクションにアクセスする方法だけです。PowerPoint では、Master オブジェクト、Slide オブジェクト、および SlideRange コレクションから Shapes コレクションにアクセスします。Word では Document オブジェクトと HeaderFooter オブジェクトからアクセスします。Excel では、 Worksheet オブジェクトと Chart オブジェクトからアクセスします。

以下の関数を使用すると、これら 3 つのアプリケーションのいずれからでも基本図表を作成できます。ここで行う必要のあることは、関数に SlideDocument、または Worksheet オブジェクトを渡し、作成した Shape オブジェクトを呼び出したサブルーチンに返すことだけです。ただし、このコードを実行しても空白のスライド、ページ、またはワークシート以外には何も表示されません。これは、基本図表を作成後にその図表にノードを追加する必要があるためです。

注意    この記事では、ノードを持つ図表と区別するために、ノードを持たない図表を "基本図表" と呼びます。

  Function CreateDiagram(ByRef objDocument As Object, _
      ByVal DiagramType As MsoDiagramType, ByVal intLeft As Integer, _
      ByVal intTop As Integer, ByVal intWidth As Integer, _
      ByVal intHeight As Integer) As Shape

   Set CreateDiagram = objDocument.Shapes.AddDiagram _
      (Type:=DiagramType, Left:=intLeft, Top:=intTop, _
      Width:=intWidth, Height:=intHeight)

End Function

以下のコード行のいずれかを使用して、3 つのアプリケーションからこの関数を呼び出すことができます。

PowerPoint での CreateDiagram 関数の呼び出し

  Set shpVariable = CreateDiagram(objDocument:=ActivePresentation _
   .Slides(1), DiagramType:=msoDiagramRadial, intLeft:=50, _
   intTop:=50, intWidth:=100, intHeight:=100)

Word での CreateDiagram 関数の呼び出し

  Set shpVariable = CreateDiagram(objDocument:=ActiveDocument, _
   DiagramType:=msoDiagramRadial, intLeft:=50, intTop:=50, _
   intWidth:=100, intHeight:=100)

Excel での CreateDiagram 関数の呼び出し

  Set shpVariable = CreateDiagram(objDocument:=ActiveWorkbook _
   .Sheets(1), DiagramType:=msoDiagramRadial, intLeft:=0, _
   intTop:=0, intWidth:=100, intHeight:=100)

ノードの追加

基本図表を作成後に、DiagramNode オブジェクトの AddNode メソッドを使用して、この図表にノードを追加します。放射型図表と組織図を除くあらゆる種類の図表では、図表内のすべてのノードが兄弟ノードになります。したがって、基本図表にノードを追加するときは、その図表の子ノードとして追加します。ただし、放射型図表または組織図を作成するときは、その後子ノードの追加先になる 1 つの最上位レベル ノードを追加します。

以下の関数は、指定した数のノードを指定した図表に追加します。作成する図表の種類が放射型図表または組織図の場合、コードは 1 つの最上位レベル (親) ノードを作成し、残りのノードを子ノードとしてその最上位レベル ノードに追加していることに気付くでしょう。指定した図表がその他の種類の図表の場合、指定した数のノードを指定した図表の子ノードとして追加します。

  Function AddDiagramNodes(ByVal shpDiagram As Shape, _
      ByVal intNumNodes As Integer) As Boolean

   Dim dgnChild As DiagramNode
   Dim intNodes As Integer

   On Error GoTo Error_Handler

   '図表の種類を判断し、必要に応じて最初のノードを追加します。
   Select Case shpDiagram.Diagram.Type

      Case msoDiagramOrgChart, msoDiagramRadial
         '最初のノードを追加します。
         Set dgnChild = shpDiagram.DiagramNode.Children.AddNode

         '残りのノードを最初のノードの子ノードとして追加します。
         For intNodes = 1 To intNumNodes – 1
            dgnChild.Children.AddNode
         Next intNodes

      Case Else
         '最初のノードを追加します。
         Set dgnChild = shpDiagram.DiagramNode.Children.AddNode

         '残りのノードを追加します。
         For intNodes = 1 To intNumNodes - 1
            dgnChild.AddNode
         Next intNodes

   End Select

   AddDiagramNodes = True

Exit_Sub:
   Exit Function

Error_Handler:
   AddDiagramNodes = False
   Resume Exit_Sub

End Function

各 Case ステートメントの For...Next ループ内のコードがわずかに異なっていることに気付くでしょう。最初の Case ステートメント内では 1 つの最上位レベル ノードを作成し、残りのノードを最初のノードの子ノードとして追加しているのに対して、2 番目の Case ステートメント内では最初のノードを作成し、残りのノードを最初のノードの (子ではなく) 兄弟として追加しています。放射型図表や組織図ですべてのノードを子ノードとして追加しようとすると、エラーを受け取るので、このことを覚えておくことが重要です。同様に、1 つのノードを持つピラミッド型図表を作成し、その後ノードをそのノードの子ノードとして追加しようとしてもエラーを受け取ります。

以下のコード行を使用してこの関数にアクセスし、指定した図形に指定した数のノードを追加できます。

  Call AddDiagramNodes(shpDiagram:=shpVariable, intNumNodes:=4)

ノードへのテキストの追加

これで図表が作成できたので、そのノードにノードを説明するテキストを追加してみます。 DiagramNode オブジェクトは、Shape オブジェクトにアクセスする TextShape プロパティを持っています。この Shape オブジェクトから TextFrame オブジェクトにアクセスできます。次に、TextFrame オブジェクトの TextRange プロパティを使って、その Text プロパティおよびノードの Text プロパティにアクセスします。その後 TextRange オブジェクトの Text プロパティを使って、図表ノードにテキストを挿入します。

注意 Excel では、TextRange オブジェクトの Characters プロパティを使って、その Text プロパティおよびノードの Text プロパティにアクセスします。その後、Characters オブジェクトの Text プロパティを使って、図表ノードにテキストを挿入します。

以下のサブルーチンは、既存の図表ノードにテキストを追加し、その新しいテキストの書式を設定します。

注意 このサブルーチンは PowerPoint と Word でのみ機能します。

  Sub AddTextToNode(ByRef objDiagramNode As DiagramNode, _
      ByVal strNodeText As String, _
      Optional ByVal intFontSize As Integer = 10, _
      Optional ByVal strFontName As String = "Tahoma", _
      Optional ByVal blnBold As Boolean = False, _
      Optional ByVal blnItalic As Boolean = False)

   With objDiagramNode.TextShape.TextFrame
      With .TextRange

         'ノードにテキストを追加します。
         .Text = strNodeText

         '新しいテキストを指定した書式に設定します。
         With .Font
            .Bold = blnBold
            .Italic = blnItalic
            .Name = strFontName
            .Size = intFontSize
         End With
      End With
   End With

End Sub

以下のコード行を使用してこの関数にアクセスし、指定したノードにテキストを追加できます。

  Call AddTextToNode(objDiagramNode:=dgnNewNode, _
   strNodeText:="This is text for a node.", _
   intFontSize:=8, blnBold:=True)

テキスト フォントの書式を設定する場合は、関連付けられた Font オブジェクトのプロパティとメソッドにアクセスします。上記のサブルーチンでは、Font オブジェクトの SizeNameBoldItalic、および Underline プロパティを使用してフォント属性の書式を設定し、TextFrame オブジェクトの WordWrap プロパティを使用して、ノードのレイアウト枠内部でテキストを複数行に折り返すかどうかを指定しています。

社員リストからの組織図を作成

これで、図表を作成する方法が理解できたので、社員リストから組織図を作成する方法を示します。このソリューションはダウンロードして参照できます。このソリューションは、1 つのメイン ルーチン、1 つのサポート サブルーチンおよび 5 つの関数で構成されます。

  • CreateOrgChart: その他のサブルーチンと関数を呼び出すメイン サブルーチンです。

  • GetData: データ ソースに接続し、ADO Recordset オブジェクトを返します。

  • GetReports: メイン レコードセットを複製し、社員の所属にしたがってレコードをフィルタ選択します。

  • CreateDiagram: 指定した種類の基本図表を作成します。

  • AddNodes: レコードセット全体を繰り返し調べ必要なノードを追加し、追加した各ノードに所属する社員ノードを再帰的に追加します。

  • AddNewNode: 個別のノードを追加します。

まず始めに、データベースのレコードにアクセスするために、Microsoft ActiveX Data Object 2.5 Library (ADO) への参照設定を追加します。社員情報を保持するために、社員名、肩書き、および上司の名前の 3 つのフィールドを持つ Microsoft Access データベースを使用します。ただし、Microsoft SQL Server ベースのデータベースやその他のデータベースを使うこともできます。使用するデータベースを変更する場合は、CreateOrgChart サブルーチンの strActiveConnection 変数を使用して、別のデータ ソースに対する接続文字列を作成する必要があります。

メイン レコードセットに対して 1 つのグローバル変数が存在します。GetReports 関数はレコードセット内のレコードをフィルタ選択し、その後元のレコードセットを変更するので、レコード全体を使って作業する場合は常にデータベースにアクセスする必要が生じます。このようなアクセスを避けるために、コードではメイン レコードセットを作成し、GetReports 関数でメイン レコードセットを複製し、複製したレコードセットに対してフィルタ選択を行い、別の社員の直属の部下である社員のみを返すようにしています。

CreateOrgChart サブルーチンで、図の先頭に存在する社員の肩書きを表す TITLE_FIRST_NODE という定数を作成しました。この肩書きを持つ社員はデータベースには 1 人しかいないと仮定しています。最上位レベルのノードは 1 つだけ存在できるので、この肩書きと同じ肩書きを持つ社員が複数存在すると、サブルーチンは別の最上位レベル ノードを作成しようとし、エラーを受け取ります。ただし、肩書きの代わりに社員の名前を使用すればこの問題は回避できます。その場合は、ソリューションはその人から始まり、組織内でその人に関連する部分の組織図だけを作成することになります。

最初のノードが追加された後に、残りのノードが追加されます。GetReports 関数は、メイン レコードセットを複製し、直前に追加されたノードの Name フィールドの値と等しい値を ReportsTo フィールドに持つすべてのレコードを選択するフィルタ処理を実行します。返されるレコードセットのレコード数が 1 以上の場合、コードは直属の上司のノードにノードを追加します。ただし、その直属の上司もさらに直属の上司を持つ可能性があるので、AddNodes サブルーチンはすべての所属する社員に対して必要な回数分再帰的にノードを追加します。

AddNewNode 関数は、主たる親ノードと各子ノードを両方追加します。さらに、ノードの Text プロパティに名前と肩書きを挿入します。カスタム列挙定数を指定する省略可能な eNodeType 引数は、ノードが最上位か、アシスタントか、または子ノードかを識別します。アシスタント モードと子ノードの唯一の違いは、 AddNewNode 関数がアシスタント ノードを作成するときに、AddNode メソッドの NodeType 引数に msoDiagramAssistant を指定することだけです。これは、管理アシスタントが組織図で呼び出されるときに、ほかのノードから呼び出されるノードを作成します。

まとめ

はさみや接着剤を片付けて、古い描画アプリケーションを取り除きましょう。Office XP アプリケーションに本来備わる図表作成サポートを使えば、ドキュメントに図表を含めることがこれまでになかったほど簡単になります。