How to Create Organization chart in Excel?
Do you want to do add Org Chart thru this menu option?
Click on Excel Menu -> Insert -> Smart Art. Choose Hierarchy charts in pop up menu.
Select the Org charts of your choice & enter each level of chart. There is more detailed explanation for manual creation of Org chart in this page.
Or like this …
Automatic: What if you want a customized automatic table to understand the flow of control?
Excel VBA Code – Build Org Chart – Hierarchy Flow
Do you already have a Organization Reporting structure as in Table-1?
Then create Org chart or Hierarchy Tree using these steps.
Table-1:
| Employee 1 | Employee 2 |
| Employee 1 | Employee 3 |
| Employee 2 | Employee 4 |
| Employee 3 | Employee 7 |
| Employee 2 | Employee 8 |
| Employee 2 | Employee 9 |
| Employee 4 | Employee 5 |
| Employee 4 | Employee 6 |
| Employee 5 | Employee 10 |
- Create a empty blank workbook with 3 sheets. Copy paste the Org reporting details in Sheet1 like this:
- Press Alt + F11. Insert a new module.
- Copy paste the VBA code in this page to the VBA project.
Press F5 to get the Hierarchy Table in Sheet3.
VBA Code to build Hierarchy Table
Here is the code that is worth a shot.
It does not create any graphical representation.
Instead it splits the table-1 as per the level of control & present a table format that is almost like a horizontal organizational hierarchy chart.
'--------------------------------------------------------------------------------
'Code by author@officetricks.com (or) kumarapush777 (Fiverr)
'Visit https://officetricks.com to get more Free & Fully Functional VBA Codes
'--------------------------------------------------------------------------------
'Build Organization Chart from Reporting Hierarchy Table
Sub Build_Hierarchy_Officetricks()
Dim iSh As Worksheet, oSh As Worksheet, hSh As Worksheet
Dim iRow As Double, oRow As Double, hRow As Double
Dim iCol As Double, oCol As Double, hCol As Double
Dim iParent As String, iChild As String
Dim oNode As String, bParentFound As Boolean, bChildFound As Boolean
Dim cParent As Range, cChild As Range, hLevel As Double, cHierarchy As Range
'Assign Cell Values
Set iSh = ThisWorkbook.Sheets(1)
Set oSh = ThisWorkbook.Sheets(2)
oSh.Activate
oSh.Cells.ClearContents
'Find Ranking Number for Each Node
'Loop Thru Each Cell
iRow = 1
While iSh.Cells(iRow, 1) <> ""
iParent = iSh.Cells(iRow, 1)
iChild = iSh.Cells(iRow, 2)
oRow = 1
bParentFound = False
bChildFound = False
Do While oSh.Cells(oRow, 1) <> ""
oNode = oSh.Cells(oRow, 1)
If VBA.Trim(VBA.UCase(oNode)) = VBA.Trim(VBA.UCase(iParent)) Then
bParentFound = True
Set cParent = oSh.Cells(oRow, 1)
Else
If VBA.Trim(VBA.UCase(oNode)) = VBA.Trim(VBA.UCase(iChild)) Then
bChildFound = True
Set cChild = oSh.Cells(oRow, 1)
End If
End If
If bParentFound And bChildFound Then
Exit Do
End If
oRow = oRow + 1
Loop
If bParentFound = False Then
While oSh.Cells(oRow, 1) <> ""
oRow = oRow + 1
Wend
oSh.Cells(oRow, 1) = iParent
oSh.Cells(oRow, 2) = 0
Set cParent = oSh.Cells(oRow, 1)
End If
If bChildFound = False Then
While oSh.Cells(oRow, 1) <> ""
oRow = oRow + 1
Wend
oSh.Cells(oRow, 1) = iChild
Set cChild = oSh.Cells(oRow, 1)
End If
oSh.Cells(cChild.Row, 2).Formula = "=1+" & oSh.Cells(cParent.Row, 2).Address
oSh.Columns.AutoFit
iRow = iRow + 1
Wend
'Sort Nodes Based on its Ranking
oSh.Sort.SortFields.Clear
oSh.Sort.SortFields.Add Key:=Range("B1:B" & oRow), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With oSh.Sort
.SetRange Range("A1:B" & oRow)
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'Build Hierarchy Chart Table or Organization Chart
'Place Each Node in its Hierarchy Level
Set hSh = ThisWorkbook.Sheets(3)
hSh.Activate
hSh.Cells.ClearContents
oRow = 1
hRow = 1
Do While oSh.Cells(oRow, 1) <> ""
oNode = oSh.Cells(oRow, 1)
hLevel = oSh.Cells(oRow, 2) + 2
Set cHierarchy = Find_First_In_Range(oNode, hSh.Cells)
If cHierarchy Is Nothing Then
hSh.Cells(hRow, hLevel) = oSh.Cells(oRow, 1)
hSh.Cells(hRow, 1) = "."
Else
hRow = cHierarchy.Row
End If
iRow = 1
Do While iSh.Cells(iRow, 1) <> ""
iParent = iSh.Cells(iRow, 1)
iChild = iSh.Cells(iRow, 2)
If iParent = oNode Then
hRow = hRow + 1
hSh.Rows(hRow & ":" & hRow).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
hSh.Cells(hRow, hLevel + 1) = iChild
hSh.Cells(hRow, 1) = "."
End If
iRow = iRow + 1
Loop
oRow = oRow + 1
Loop
hSh.Columns.AutoFit
'Process Completed
MsgBox "Process Completed"
End Sub
Function Find_First_In_Range(FindString As String, iRng As Range) As Range
Dim Rng As Range
If Trim(FindString) <> "" Then
With iRng
Set Rng = .Find(What:=FindString, _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False)
End With
End If
Set Find_First_In_Range = Rng
End Function
This code creates this Org table in 2 steps.
- In first Step it decides the ranking for each employee & building a ranking table.
- Then based on that ranking table, the position of each Employee is decided.
The resulting table structure will look almost like a tree, easy to understand the flow on control & who is reporting to whom.
Also, this can be improvised further to color the background cells of nodes as per their position or control ranking.