基于Excel在PowerPoint中制作组织结构图

时间:2017-12-11 10:59:17

标签: excel vba powerpoint

我正在尝试编写一个项目,该项目将基于Excel中的表格在PowerPoint中创建组织结构图。所以,我在Excel中有一个简单的表,有两列:Employee和Reports_to。像这样的东西

Employee    Reports_to
Joe         Eva
Jane        Ann
John        Eva
Eva         Olaf
Ann         Olaf
Bill        Ann
Gilbert     Ann
Olaf    

然后我有一个简单的功能来找到任何老板的所有下属:

Function GetMinions(sMaster As String) As Collection

Dim rngEmp As Range, cl As Range
Dim collMinions As New Collection

With ThisWorkbook.Worksheets(1)
    Set rngEmp = Range(.Range("A2"), .Range("A" & .Rows.Count).End(xlUp))
End With

For Each cl In rngEmp
    If cl.Offset(, 1) = sMaster Then collMinions.Add cl.Value
Next cl

Set GetMinions = collMinions

End Function

我还有一个代码,用于在此幻灯片中创建一个幻灯片和一个组织结构图的新PowerPoint演示文稿。除了根节点之外,我删除了此组织结构图中的所有节点。所有这些都很完美,所以我不粘贴代码。 这是我的工作马,是从头到脚构建组织结构图的宏。

Sub PopulateOrgChart(nd As Object, str As String)
Dim Minions As Collection
Dim hasMinions As New Collection
Dim it As Object
Dim childNd As Object
Dim i As Integer

Set Minions = GetMinions(str)
For i = 1 To Minions.Count
    Set childNd = nd.Nodes.Add
    Debug.Print nd.Level & "    " & childNd.Level
    childNd.TextFrame2.TextRange.Text = Minions.item(i)
    If GetMinions(Minions.item(i)).Count > 0 Then hasMinions.Add childNd
Next i

    For i = 1 To hasMinions.Count
    PopulateOrgChart hasMinions(i), hasMinions(i).TextFrame2.TextRange.Text
Next i
End Sub

我正在使用参数运行此宏(smr是定义的smartart对象):

PopulateOrgChart smr.Nodes(1), "Olaf"

结果是:

enter image description here

正如你所看到的,Eva和Ann都是正确的中级管理人员,除了Joe之外,所有其他人似乎都在第三线,而Joe位于高级经理之下。我试图弄清楚发生了什么,并在设置子节点后放置了这一行:

Debug.Print nd.Level & "    " & childNd.Level

和我的立即窗口显示与我的组织结构图相同的故事:

1    2
1    2
2    2
2    3
2    3
2    3
2    3

为Eva的第一个下属添加节点时,它会为子节点提供与父节点相同的级别。我很困惑,因为宏可以像所有其他员工一样工作。我做错了什么,我怎么能让Joe从属于Eva节点,而不是从根?

1 个答案:

答案 0 :(得分:0)

21小时后没有回答。所以,我被迫找到了回旋处。不是很优雅,但它的工作原理。代替行

Set childNd = nd.Nodes.Add

我已插入代码:

Set childNd = nd.Nodes.Add
If nd.Level = childNd.Level Then
    Set tempNd = childNd
    Set childNd = nd.Nodes.Add
    tempNd.Delete
End If

但是,我不明白为什么添加到节点的第一个节点是兄弟而不是孩子。