VBAで組織図を作る
まずはサンプルをあさってみる、とMSDNにそのものズバリなのがあった。
概要 : Microsoft Office 10.0 オブジェクト ライブラリには、 Word、PowerPoint および Excel で図表を作成するための新しいオブジェクトが含まれています。この記事では、これらの新しいオブジェクトについて説明し、データベース内のデータから組織図を作成する方法を示しています。
おっし。これでやってみるべ。
とりあえず新規Excelブックでマクロを登録してサンプルを動かしてみる。
Sub createOrgChart() Dim shpValiable As Shape Set shpVariable = CreateDiagram(objDocument:=ActiveWorkbook _ .Sheets(1), DiagramType:=msoDiagramRadial, intLeft:=0, _ intTop:=0, intWidth:=100, intHeight:=100) Call AddDiagramNodes(shpVariable, 10) End Sub 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 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 Call AddTextToNode(objDiagramNode:=dgnChild, _ strNodeText:="Parent.", _ intFontSize:=8, blnBold:=True) '残りのノードを最初のノードの子ノードとして追加します。 For intNodes = 1 To intNumNodes - 1 Call AddTextToNode(objDiagramNode:=dgnChild.Children.AddNode, _ strNodeText:="Child.", _ intFontSize:=8, blnBold:=False) Next intNodes Case Else '最初のノードを追加します。 Set dgnChild = shpDiagram.DiagramNode.Children.AddNode Call AddTextToNode(objDiagramNode:=dgnChild, _ strNodeText:="This is text for a node.", _ intFontSize:=8, blnBold:=True) '残りのノードを追加します。 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 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 'ノードにテキストを追加します。 .Characters.Text = strNodeText '新しいテキストを指定した書式に設定します。 With .Font .Bold = blnBold .Italic = blnItalic .Name = strFontName .Size = intFontSize End With End With End With End Sub
ノードはできるんだが、テキストが反映されねぇ('A`)
よく読んでみると
Excelで書く場合は
注意 Excel では、TextRange オブジェクトの Characters プロパティを使って、その Text プロパティおよびノードの Text プロパティにアクセスします。その後、Characters オブジェクトの Text プロパティを使って、図表ノードにテキストを挿入します。
ってなってたんだが、そもそもTextRangeオブジェクトってのが無い。
その代わりにTextFrame.Characters.Textがあったからこっちを使ってみる。
結果
「Character クラスの Text プロパティに設定できませんでした。」
('A`)ヴァー
とりあえず試してみたこと
- ActiveSheet.Unprotect
- (node).Shape.Locked = False
(node).Shape.ControlFormat.LockedText = False - ActiveSheet.Protect Scenarios:=True, UserInterfaceOnly:=False
うんこっこー('A`)
なんつーか
非常に面倒な案件掴んだ?
さてさて、どーすっか。