2017-12-11 11 views
0

Excelの表に基づいてPowerPointで組織図を作成するプロジェクトを作成しようとしています。だから、Excelの2つの列、EmployeeとReports_toという単純なテーブルがあります。私も、このスライド内の1枚のスライドと1、組織図と新しいPowerPointプレゼンテーションを作成しているコードを持ってExcelでのPowerPointでの組織図の作成

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 

:その

Employee Reports_to 
Joe   Eva 
Jane  Ann 
John  Eva 
Eva   Olaf 
Ann   Olaf 
Bill  Ann 
Gilbert  Ann 
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グラフィックオブジェクトを定義している)の引数でこのマクロを実行しています:

PopulateOrgChart smr.Nodes(1), "Olaf" 

そして結果は次のとおりです。

enter image description here

あなたが見ることができるように、エヴァとアンはどちらも中位のマネージャーとして適切な場所にあり、他のすべてのマネージャーはトップマネージャーの直下に配置されているJoeを除いて3行目でOKと思われます。私は何が起こっているかを把握しようとした子ノードを設定した後、この行を置いています

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

と私のイミディエイトウィンドウには、私の組織図と同じ話を示します。

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

ノードを追加するときEvaの最初の部下のために、それは子供に親と同じレベルを与える。マクロが他のすべての従業員にとって期待通りに機能するので、私はかなり混乱しています。私が間違ってやっていることは、どのようにしてJoeをルートにではなく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 

は、私は理解していません。

関連する問題