我正在尝试编写一个项目,该项目将基于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"
结果是:
正如你所看到的,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节点,而不是从根?
答案 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
但是,我不明白为什么添加到节点的第一个节点是兄弟而不是孩子。