Voici un exemple détaillé de code VBA pour créer un organigramme dans Excel. Ce code génère des formes et des connecteurs pour représenter visuellement la hiérarchie des employés.
Explication étape par étape :
1. Structure des données : Nous supposons que les données de l’organigramme sont stockées sous forme de tableau simple dans Excel, où chaque ligne représente un employé, et les colonnes contiennent des informations comme le Nom de l'Employé, le Manager et le Poste.
Exemple :
| Nom de l’Employé | Manager | Poste |
| John Doe | CEO | |
| Jane Smith | John Doe | VP des Ventes |
| Alice Brown | John Doe | VP des RH |
| Bob White | Jane Smith | Responsable Ventes |
2. Structure du code VBA : Le code va parcourir les données, créer des formes pour chaque employé et dessiner des lignes pour représenter la structure hiérarchique.
Exemple de code VBA :
Sub CreateOrgChart()
Dim ws As Worksheet
Dim employeeRange As Range
Dim employee As Range
Dim empName As String
Dim empManager As String
Dim empPosition As String
Dim shapesDict As Object
Set shapesDict = CreateObject("Scripting.Dictionary") ' Pour stocker les formes par nom
' Définir la feuille contenant les données
Set ws = ThisWorkbook.Sheets("Sheet1")
' Définir la plage des données (de A2 à C dernière ligne)
Set employeeRange = ws.Range("A2:C" & ws.Cells(ws.Rows.Count, 1).End(xlUp).Row)
' Supprimer toutes les formes existantes
ws.Shapes.SelectAll
Selection.Delete
' Parcourir chaque ligne d'employé
For Each employee In employeeRange.Rows
empName = employee.Cells(1, 1).Value
empManager = employee.Cells(1, 2).Value
empPosition = employee.Cells(1, 3).Value
' Créer une forme pour l'employé
Dim empShape As Shape
Set empShape = ws.Shapes.AddShape(msoShapeRectangle, 0, 0, 120, 60) ' Propriétés de la forme
empShape.TextFrame.Characters.Text = empName & vbCrLf & empPosition
' Assigner un nom unique à la forme
empShape.Name = empName
shapesDict.Add empName, empShape
' Positionner les formes des employés selon une logique de base
' Exemple : une simple disposition en grille
If shapesDict.Count = 1 Then
empShape.Left = 100
empShape.Top = 100
Else
empShape.Left = 100 + (shapesDict.Count * 150)
empShape.Top = 100 + (Int((shapesDict.Count - 1) / 3) * 100)
End If
' Créer un connecteur si l'employé a un manager
If empManager <> "" Then
Dim managerShape As Shape
Set managerShape = shapesDict(empManager)
' Créer une ligne de connecteur entre le manager et l'employé
Dim conn As Shape
Set conn = ws.Shapes.AddConnector(msoConnectorStraight, managerShape.Left + managerShape.Width / 2, managerShape.Top + managerShape.Height, _
empShape.Left + empShape.Width / 2, empShape.Top)
conn.Line.EndArrowheadStyle = msoArrowheadTriangle
End If
Next employee
' Ajuster le zoom pour adapter l'organigramme à la page
ws.PageSetup.Zoom = False
ws.PageSetup.FitToPagesWide = 1
ws.PageSetup.FitToPagesTall = 1
End Sub
Explication du code :
- Définir la feuille et la plage de données :
Le code commence par définir la feuille de calcul (ws) et la plage de données (employeeRange) correspondant au tableau contenant les informations des employés.
La plage est définie de A2 jusqu’à la dernière ligne utilisée de la colonne C (qui est la colonne « Poste »). - Suppression des formes existantes :
Avant de créer de nouvelles formes, le code supprime toutes les formes existantes pour garantir un espace de travail propre. - Parcours des données des employés : La boucle For Each traite chaque ligne du tableau, récupérant le nom de l’employé, le manager et le poste.
- Création des formes pour chaque employé : Pour chaque employé, une forme rectangle est créée avec
ws.Shapes.AddShape. Le nom et le poste de l’employé sont ajoutés comme texte à l’intérieur de la forme.
Le nom de l’employé est utilisé pour donner un nom unique à chaque forme dans un dictionnaire (shapesDict), permettant de faire référence facilement à cette forme plus tard lors de la création des connecteurs. - Positionnement des formes :
Une logique simple est appliquée pour éviter que les formes se chevauchent. Cela place les formes dans une grille, avec chaque nouvel employé décalé de 150 pixels à droite et 100 pixels vers le bas à mesure que le nombre d’employés augmente. - Création des connecteurs entre les employés et leurs managers : Si un employé a un manager (i.e., empManager n’est pas vide), une ligne de connecteur est dessinée entre la forme du manager et celle de l’employé.
Cela se fait avecws.Shapes.AddConnector, et des propriétés comme le style de la flèche à la fin de la ligne sont définies pour améliorer la visualisation. - Ajuster l’organigramme pour qu’il tienne sur une page : Enfin, le code ajuste les paramètres de mise en page afin que l’organigramme soit redimensionné pour tenir sur une seule page lors de l’impression.
Personnalisation : - Style des formes : Vous pouvez modifier les dimensions, la couleur, la police et l’alignement des formes pour améliorer l’apparence de l’organigramme.
- Logique de positionnement : Vous pouvez personnaliser la logique de positionnement pour une meilleure disposition des formes, notamment pour des organisations plus grandes.
- Plusieurs niveaux : Si vous devez gérer plusieurs niveaux de hiérarchie (par exemple, placer les managers à un niveau supérieur et leurs subordonnés en dessous), vous pouvez introduire des règles de positionnement plus sophistiquées en fonction de la profondeur dans la hiérarchie.