¨ Structure de la table de données
Pour ce faire nous se baser sur une table de donnée ayant la
structure suivante :
* La colonne Code contient les indices comptables et/ou
administratifs de la structure concernée.
* La colonne « Niveau » comporte le niveau
hiérarchique de chaque structure. A chaque niveau est attribué un code appelé
« NUM_NIVEAU ».
* La colonne « Libelle » contient les libellés de
chaque structure.
* La colonne « Rattachement » indique la structure
mère la structure en question.
¨ Modalité de création de l’organigramme
Il suffit de sélectionner la structure mère et ensuite
cliquer sur créer organigramme, comme le détaille la figure ci-dessous :
Ainsi, pour l’exemple choisit, l’organigramme crée est le
suivant :
¨ Fonctionnement du code VBA
La préparation de l’organigramme
via le code VBA suit les étapes suivantes défalquées entre opérations manuelles
et opérations préparées via le code VBA.
¨ Code pour Dessiner l’organigramme
Sub DESSINER_ORGANIGRAME()
Dim ligne As Double
Dim STR
ligne = 1
'Définition des paramètres de travail
Set GRAPHE = Sheets("GRAPHE")
Set donnee = Sheets("DONNEE")
Tbl =
donnee.Range("A2:E" &
donnee.[A65000].End(xlUp).Row).Value
CODE_STR = donnee.Cells(ActiveCell.Row,
1).Value
n = UBound(Tbl)
' Supprimer les graphes déjà effectués dans les
traitements précédents
For Each s In GRAPHE.Shapes
If s.Type = 17 Or s.Type = 1 Then s.Delete
Next
' Définition des tailles des graphes à créer
colonne = 0
inth = 180
intv = 32
'Créer un shape pour la structure sélectionnée
CREER_SHAPE CODE_STR, ligne
'Boucle pour créer le shape pour les sous
structure niveau 1
For i = 1 To NBRE_DIRECT_RATTACHE(CODE_STR)
ligne =
ligne + i - 1
STR =
STR_RATTACHE_i(CODE_STR, i)
CREER_SHAPE STR, ligne
connect_str "C" &
CODE_STR, "C" & STR 'Connecter les structures
'Boucle pour créer le shape pour les sous
structure niveau 2
For j = 1 To NBRE_DIRECT_RATTACHE(STR)
ligne = ligne + j - 1
CREER_SHAPE STR_RATTACHE_i(STR,
j), ligne
connect_str "C" & STR, "C" & STR_RATTACHE_i(STR,
j) 'Connecter les structures
'Boucle pour créer le shape pour les sous
structure niveau 3
If j = NBRE_DIRECT_RATTACHE(STR) Then
ligne = ligne - j
Else
ligne = ligne -
j + 1
End If
Next
ligne =
ligne + NBRE_DIRECT_RATTACHE(STR) - i + 1
Next
End Sub
¨ Fonction utilisée : Nombre de structures rattachées directement
Function NBRE_DIRECT_RATTACHE(ByVal CODE_STR As Double)
'Retourne le nombre de structure rattaché
Dim Plage As Range
With Worksheets("donnee") 'en colonne "A" à partir de A2
Set Plage = .Range(.Cells(2, 4), .Cells(.Rows.Count, 4).End(xlUp))
End With
NBRE_DIRECT_RATTACHE
= Application.CountIf(Plage, CODE_STR)
End Function
¨ Fonction utilisée : CREER_SHAPE
Function CREER_SHAPE(ByVal Code_s As Long, ByVal ligne As Integer)
Set débutOrg = GRAPHE.Range("b2")
'ligne = ligne + i - 1
hauteurshape = 25
largeurshape = 160
If ExisteShape("C" & Code_s) Then Exit Function
GRAPHE.Shapes.AddShape(msoShapeFlowchartAlternateProcess, 10, 10, largeurshape, Hauteur(Code_s)).Name
= "C" &
Code_s
GRAPHE.Shapes("C" & Code_s).Line.ForeColor.SchemeColor = 1
txt =
STR(Code_s)
With GRAPHE.Shapes("C" & Code_s)
.TextFrame.Characters.Text
= txt
.TextFrame.Characters(Start:=1, Length:=1000).Font.Size = 8
.TextFrame.Characters(Start:=1, Length:=1000).Font.ColorIndex = 0
.TextFrame.Characters(Start:=1, Length:=Len(txt)).Font.Bold =
True
.Fill.ForeColor.RGB
= colorer(Code_s)
.TextFrame.Characters(Start:=1, Length:=Len(txt)).Font.Color =
vbBlack
End With
GRAPHE.Shapes("C" & Code_s).Left = débutOrg.Left + (NIV_STR(Code_s)
- NIV_STR(CODE_STR)) * inth
GRAPHE.Shapes("C" & Code_s).Top = débutOrg.Top + intv *
ligne
End Function
¨ Fonction utilisée : Connecter les structures dessinées
La principale fonctionnalité de
cette fonction est « .Shapes.AddConnector »
destinée à connecter deux shapes :
Function connect_str(ByVal cPere As String, ByVal cFils As String)
Dim coul_ligne
coul_ligne = Sheets("DONNEE").Range("I2").Value
GRAPHE.Shapes.AddConnector(msoConnectorElbow, 100, 100, 100, 100).Name = cPere & cFils
GRAPHE.Shapes(cPere & cFils).Line.ForeColor.SchemeColor
= coul_ligne
GRAPHE.Shapes(cPere & cFils).ConnectorFormat.BeginConnect
GRAPHE.Shapes(cPere), 4
GRAPHE.Shapes(cPere &
cFils).ConnectorFormat.EndConnect GRAPHE.Shapes(cFils), 2
End Function
¨ Fonction utilisée : retourner les structures rattachées à chaque structure
Function STR_RATTACHE_i(ByVal STR_C As Double, ByVal rang As Integer)
'Renvoi les ligne des differentes
structure rattaché
Set f = Sheets("DONNEE")
Dim lig_, col_ As Double
Dim fil() As Double
Dim Plage As Range
Dim Cel As Range
With Worksheets("donnee")
'en colonne "A" à partir de A2
Set Plage = .Range(.Cells(2, 4), .Cells(.Rows.Count, 4).End(xlUp))
End With
If rang <=
NBRE_DIRECT_RATTACHE(STR_C) Then
i =
0
For Each Cel In Plage
lig_ = Cel.Row
col_ = Cel.Column
If f.Cells(lig_, 4).Value = STR_C Then
i = i + 1
ReDim Preserve fil(i)
fil(i) = lig_ 'f.Cells(lig_,
1).Value
End If
Next
STR_RATTACHE_i = f.Cells(fil(rang), 1).Value
Else
MsgBox "Rang : " & rang & " Supérieur à la taille : " & NBRE_DIRECT_RATTACHE(STR_C)
End If
End Function
¨ Fonction utilisée : colorer les shapes en fonction du niveau de la structure
Function colorer(ByVal Code_s As Long)
Select Case TYP_STR(Code_s)
Case "CENTRAL"
colorer
= donnee.Cells(2, 7).Interior.Color
Case "DIRECTION"
colorer
= donnee.Cells(3, 7).Interior.Color
Case "DIVISION"
colorer
= donnee.Cells(4, 7).Interior.Color
Case "DG"
colorer
= donnee.Cells(5, 7).Interior.Color
Case "SERVICE"
colorer
= donnee.Cells(6, 7).Interior.Color
End Select
End Function
¨ Fonction utilisée : déterminer le type structure
Function TYP_STR(ByVal CODE_STR As Double)
Dim Plage As Range
With Worksheets("donnee") 'en colonne "A" à partir de A2
Set Plage = .Range(.Cells(2, 1), .Cells(.Rows.Count, 2).End(xlUp))
End With
TYP_STR =
WorksheetFunction.VLookup(CODE_STR, Plage, 2, False)
End Function
¨ Fonction utilisée : déterminer la structure en fonction de son code
Function STR(ByVal CODE_STR As Double)
Dim Plage As Range
With Worksheets("donnee") 'en colonne "A" à partir de A2
Set Plage = .Range(.Cells(2, 1), .Cells(.Rows.Count, 3).End(xlUp))
End With
STR =
WorksheetFunction.VLookup(CODE_STR, Plage, 3, False)
End Function
Bonjour,
RépondreSupprimerD’où vient la fonction ExisteShape? Car en exécutant le programme, il me dit qu’elle n’est pas définie... Je ne sais pas comment faire marcher vos programmes.
Merci de votre réponse
Function ExisteShape(nomshape)
RépondreSupprimerFor Each s In ActiveSheet.Shapes
If s.Name = nomshape Then ExisteShape = True
Next s
End Function
c'est dommage qu'il n'y ait pas plus d'explications
RépondreSupprimerBonjour, D'abord, merci d'avoir partagé ces codes. Toutefois, je n'arrive pas à les faire fonctionner car il manque le code NIV_STR .
RépondreSupprimerPouvez-vous le partager s'il-vous-plaît ?
Je vous remercie par avance.
Emilie