2017-12-11 4 views
0

Excel의 표를 기반으로 PowerPoint에서 조직도를 만드는 프로젝트를 작성하려고합니다. 그래서 필자는 Employee와 Reports_to라는 두 개의 열이있는 Excel에서 간단한 테이블을 가지고 있습니다. 그Excel 기반 PowerPoint에서 조직도 만들기

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 프레젠테이션을 만드는 코드가 . 이 조직도에서 루트 노드를 제외한 모든 노드를 삭제합니다. 모든 것은 완벽하게 작동하므로 코드를 붙여 넣지는 않습니다. 그리고 여기 내 작업 말, 조직도를 작성하는 매크로가 있습니다.

PopulateOrgChart smr.Nodes(1), "Olaf" 

을 그리고 그 결과는 다음과 같습니다 :

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 개체를 정의) 인수와 함께이 매크로를 실행하고

enter image description here

당신이 볼 수 있듯이, 에바와 Ann은 모두 중급 관리자로서 올바른 위치에 있으며, 다른 모든 관리자는 3 번째 줄에서 정상인 관리자 바로 아래에 배치 된 Joe를 제외하고는 괜찮은 것으로 보입니다. 나는 무슨 일이 일어나고 있는지 알아 내려고 노력하고 자식 노드 설정 한 후이 라인에 놓여있다 :

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

내 직접 실행 창 내 조직 차트와 같은 이야기를 보여

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

추가 노드를 Eva의 첫 번째 부하 직원에게는 부모에게 동일한 수준의 권한을 부여합니다. 매크로가 다른 모든 직원에게 예상대로 작동하기 때문에 나는 매우 혼란 스럽습니다. 내가 뭘 잘못하고 어떻게 조를 루트에 있지 않고 에바 노드에 종속시킬 수 있습니까?

답변

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 

, 나는 이해가 안 돼요.

관련 문제