Créer un organigramme et un trombinoscope dans Excel
Date de publication : 11/03/2007 , Date de mise à jour : 12/05/2007
Par
SilkyRoad (silkyroad.developpez.com)
Cette page montre comment créer un organigramme et un trombinoscope dans Excel.
Testé avec Excel2002/Windows XP.
I. Introduction
II. Description
III. Les procédures
IV. Téléchargement
I. Introduction
Ce tutoriel propose un exemple d'organigramme et un trombinoscope dans Excel.
Vous pourrez visualiser dans un UserForm la structure organisationnelle d'une équipe de travail
ou d'une association, l'organigramme d'une entité... et aussi retrouver le nom d'une personne
à partir de sa photo:
Le classeur disposant d'une option pour afficher toutes les images jpg du répertoire sous forme de
planche contact.
Cette présentation est avant tout un support de cours pour:
* Utiliser un TreeView.
* Créer une page html dynamiquement.
* Visualiser la page html dans un WebBrowser
(
Navigateur Web Microsoft).
* Utiliser un module de classe pour gérer le contenu du WebBrowser
(Identification de l'évènement Clic sur les différentes images de la page html).
II. Description
Pour commencer, vous devez mettre en place les informations nécessaires à la création
de l'organigramme, dans l'onglet
Structure.
Chaque colonne (de
B à
M) définit un niveau d'arborescence dans le TreeView.
Les numéros de téléphone et de fax sont stockés dans les colonnes
O et
P.
La croix "x" dans la colonne
N sert à différencier les fonctions
(Responsable d'exploitation, administratif, fabrication...) et le nom des personnes.
Le nom et le prénom sont volontairement dans la même cellule afin de limiter
les risques d'homonymes, et simplifier la gestion des images.
Vous pourrez bien entendu modifier la démo en fonction de vos préférences.
Les images (non obligatoires pour faire fonctionner le classeur) doivent être placées dans le
même répertoire que le classeur.
Les photos doivent être nommées de manière identique à l'onglet
Structure:
Par exemple
Nom01 prenom01.jpg
Un contrôle
TreeView est utilisé pour
visualiser l'organigramme.
Lors de l'initialisation du UserForm, la procédure boucle sur les cellules de la
feuille
Structure afin de mettre en place l'arborescence du TreeView.
| Vba |
For Each Cell In Feuil2.Range("A1:A" & Feuil2.Range("N65533").End(xlUp).Row)
NumCol = Cell.End(xlToRight).Column
NumLig = Cell.Row
If NumCol = 2 Then
TreeView1.Nodes.Add , , "maClé" & NumLig & NumCol, _
UCase(Feuil2.Cells(NumLig, NumCol)), "Img1", "Img1"
Else
k = Feuil2.Cells(NumLig, NumCol).Offset(0, -1).End(xlUp).Row
j = Feuil2.Cells(NumLig, NumCol).Offset(0, -1).Column
If Feuil2.Cells(NumLig, 14) = "x" Then
TreeView1.Nodes.Add _
"maClé" & k & j, tvwChild, "maClé" & NumLig & NumCol, _
Feuil2.Cells(NumLig, NumCol), "Img2", "Img2"
Else
TreeView1.Nodes.Add _
"maClé" & k & j, tvwChild, "maClé" & NumLig & NumCol, _
UCase(Feuil2.Cells(NumLig, NumCol)), "Img1", "Img1"
End If
End If
Next Cell
|
Par défaut L'arborescence est fermée.
Cochez la CheckBox "
Déployer la totalité de l'arborescence" pour afficher toute la structure.
Un double clic sur chaque noeud déploie le niveau inférieur.
Le contrôle
ImageList permet
d'afficher un petite image sur les noeuds du TreeView: un point rouge pour un titre de fonction, une
flèche verte pour le nom des personnes.
Dès que vous cliquez sur un nom dans le TreeView, les informations associées à la personne
s'affichent dans l'UserForm:
* Nom Prénom
* Numéro de téléphone
* Fonction
* La photo (si elle existe dans le même répertoire que le classeur).
Ce n'est qu'un exemple et vous pourrez par la suite adapter les champs en fonction de vos besoins.
Un contrôle
WebBrowser est
utilisé comme support pour le trombinoscope.
Lorsque vous cliquez sur le bouton "
Visualiser le trombinoscope", une page html est
créée dynamiquement, basée sur les photos disponibles dans le répertoire:
| Vba |
chemin = ThisWorkbook.Path
Fichier = Dir(chemin & "\*.jpg")
Open ThisWorkbook.Path & "\browserImage.html" For Output As #1
Print #1, "<HTML>"
Print #1, "<HEAD>"
Print #1, "<TITLE>" & chemin & "</TITLE>"
Do
S = chemin & "\" & Fichier
ProprietesImages = Left(Fichier, Len(Fichier) - 4)
X = "<A><IMG WIDTH=120 HEIGHT=120 SRC='" & S & _
"'ALT='" & ProprietesImages & "'></IMG></A>"
"'ALT='" & ProprietesImages & "'></IMG></A>"
Print #1, X
Fichier = Dir
Loop Until Fichier = ""
Close #1
WebBrowser1.Navigate ThisWorkbook.Path & "\browserImage.html"
|
Le TreeView est masqué pour que le WebBrowser soit placé au premier plan.
Les images sont présentées sous forme de vignettes. Une infobulle est aussi créée dans la page html,
pour afficher le nom et le prénom de la personne lorsque le curseur de la souris passe sur l'image.
Ensuite, un clic sur l'image permet de récupérer les informations complètes au sujet de la
personne sélectionnée (Nom, Prénom, Numéro de téléphone, Fonction).
Remarque:
La page html ne gère pas les caractères spéciaux dans le nom des fichiers images
(les apostrophes par exemple).
L'évènement Clic sur les images est géré par un module de classe.
Toutes les images sont d'abord intégrées dans la classe lorsque la page html est totalement
chargée dans le WebBrowser:
| Vba |
Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
Dim Cl As Classe1
Dim i As Integer
Dim imgHtml As HTMLImg
Set Collect = New Collection
Set maPageHtml = WebBrowser1.Document
For i = 0 To maPageHtml.images.Length - 1
Set imgHtml = maPageHtml.images.Item(i)
Set Cl = New Classe1
Set Cl.Imge = imgHtml
Collect.Add Cl
Next i
End Sub
|
Ensuite, le module de classe va pouvoir gérer l'évènement onclick sur
chaque image de la page html:
| Vba |
Option Explicit
Public WithEvents Imge As MSHTML.HTMLImg
Private Function Imge_onclick() As Boolean
Dim Cible As String, Fichier As String
Dim m As Integer
Cible = Imge.alt
For m = 1 To UserForm1.TreeView1.Nodes.Count
If Cible = UserForm1.TreeView1.Nodes.Item(m).Text Then
UserForm1.Label2 = UserForm1.TreeView1.Nodes.Item(m).Text
UserForm1.Label3 = "Téléphone : " & Feuil2.Cells(m, 15)
UserForm1.Label4 = "Fax : " & Feuil2.Cells(m, 16)
UserForm1.Label5 = "Fonction : " & UserForm1.TreeView1.Nodes.Item(m).Parent
Fichier = ThisWorkbook.Path & "\" & Cible & ".jpg"
If Dir(Fichier) <> "" Then
UserForm1.Image1.Picture = LoadPicture(Fichier)
Else
Set UserForm1.Image1.Picture = Nothing
End If
End If
Next m
End Function
|
La procédure nécessite d'activer la référence Microsoft HTML Object Library.
Dans l'éditeur de macros (Alt+F11):
Menu
Outils
Références
Cochez la ligne "Microsoft HTML Object Library"
Cliquez sur le bouton OK pour valider.
Cette référence (ou bibliothèque) sert à piloter tous les types d'objets contenus dans une page html.
Cliquez sur le bouton "Visualiser l'organigramme" pour réafficher le TreeView.
III. Les procédures
Dans un module standard:
| Vba |
Option Explicit
Public Collect As Collection
Sub Lancer()
UserForm1.Show
End Sub
|
Dans le module objet du UserForm:
| Vba |
Option Explicit
Option Compare Text
Dim maPageHtml As HTMLDocument
Private Sub UserForm_Initialize()
Dim NumCol As Integer, j As Integer
Dim NumLig As Integer, k As Integer
Dim Cell As Range
Dim Image1 As String, Image2 As String
Image1 = ThisWorkbook.Path & "\redball.gif"
Image2 = ThisWorkbook.Path & "\grnarrow.gif"
Me.ImageList1.ListImages.Clear
Me.ImageList1.ListImages.Add 1, "Img1", LoadPicture(Image1)
Me.ImageList1.ListImages.Add 2, "Img2", LoadPicture(Image2)
Set Me.TreeView1.ImageList = Me.ImageList1
For Each Cell In Feuil2.Range("A1:A" & Feuil2.Range("N65533").End(xlUp).Row)
NumCol = Cell.End(xlToRight).Column
NumLig = Cell.Row
If NumCol = 2 Then
TreeView1.Nodes.Add , , "maClé" & NumLig & NumCol, _
UCase(Feuil2.Cells(NumLig, NumCol)), "Img1", "Img1"
Else
k = Feuil2.Cells(NumLig, NumCol).Offset(0, -1).End(xlUp).Row
j = Feuil2.Cells(NumLig, NumCol).Offset(0, -1).Column
If Feuil2.Cells(NumLig, 14) = "x" Then
TreeView1.Nodes.Add _
"maClé" & k & j, tvwChild, "maClé" & NumLig & NumCol, _
Feuil2.Cells(NumLig, NumCol), "Img2", "Img2"
Else
TreeView1.Nodes.Add _
"maClé" & k & j, tvwChild, "maClé" & NumLig & NumCol, _
UCase(Feuil2.Cells(NumLig, NumCol)), "Img1", "Img1"
End If
End If
Next Cell
TreeView1.Style = 5
End Sub
Private Sub UserForm_Activate()
End Sub
Private Sub CheckBox1_Click()
Dim i As Byte
If CheckBox1 Then
For i = 1 To TreeView1.Nodes.Count
TreeView1.Nodes.Item(i).Expanded = True
Next
Else
For i = 1 To TreeView1.Nodes.Count
TreeView1.Nodes.Item(i).Expanded = False
Next
End If
TreeView1.Nodes.Item(1).EnsureVisible
End Sub
Private Sub TreeView1_Click()
Dim leNom As String, Fichier As String
If Feuil2.Cells(TreeView1.SelectedItem.Index, 14) <> "" Then
Label2 = TreeView1.SelectedItem.Text
Label3 = "Téléphone : " & Feuil2.Cells(TreeView1.SelectedItem.Index, 15)
Label4 = "Fax : " & Feuil2.Cells(TreeView1.SelectedItem.Index, 16)
Label5 = "Fonction : " & TreeView1.SelectedItem.Parent
leNom = TreeView1.SelectedItem.Text
Fichier = ThisWorkbook.Path & "\" & leNom & ".jpg"
If Dir(Fichier) <> "" Then
Image1.Picture = LoadPicture(Fichier)
Else
Set Image1.Picture = Nothing
End If
End If
End Sub
Private Sub CommandButton1_Click()
Dim Fichier As String
Dim S As String, X As String, chemin As String
Dim ProprietesImages As String
If WebBrowser1.Visible = True Then
WebBrowser1.Visible = False
Label1.Visible = True
CheckBox1.Visible = True
CommandButton1.Caption = "Visualiser le trombinoscope"
Exit Sub
End If
Label1.Visible = False
CheckBox1.Visible = False
WebBrowser1.Visible = True
CommandButton1.Caption = "Visualiser l'organigramme"
chemin = ThisWorkbook.Path
Fichier = Dir(chemin & "\*.jpg")
Open ThisWorkbook.Path & "\browserImage.html" For Output As #1
Print #1, "<HTML>"
Print #1, "<HEAD>"
Print #1, "<TITLE>" & chemin & "</TITLE>"
Do
S = chemin & "\" & Fichier
ProprietesImages = Left(Fichier, Len(Fichier) - 4)
X = "<A><IMG WIDTH=120 HEIGHT=120 SRC='" & S & _
"'ALT='" & ProprietesImages & "'></IMG></A>"
"'ALT='" & ProprietesImages & "'></IMG></A>"
Print #1, X
Fichier = Dir
Loop Until Fichier = ""
Close #1
WebBrowser1.Navigate ThisWorkbook.Path & "\browserImage.html"
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If Dir(ThisWorkbook.Path & "\browserImage.html") <> "" Then _
Kill ThisWorkbook.Path & "\browserImage.html"
End Sub
Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
Dim Cl As Classe1
Dim i As Integer
Dim imgHtml As HTMLImg
Set Collect = New Collection
Set maPageHtml = WebBrowser1.Document
For i = 0 To maPageHtml.images.Length - 1
Set imgHtml = maPageHtml.images.Item(i)
Set Cl = New Classe1
Set Cl.Imge = imgHtml
Collect.Add Cl
Next i
End Sub
Private Sub WebBrowser1_BeforeNavigate2(ByVal pDisp As Object, _
URL As Variant, Flags As Variant, TargetFrameName As Variant, _
PostData As Variant, Headers As Variant, Cancel As Boolean)
Set Collect = Nothing
Set maPageHtml = Nothing
End Sub
|
Dans un module de classe nommé Classe1:
| Vba |
Option Explicit
Public WithEvents Imge As MSHTML.HTMLImg
Private Function Imge_onclick() As Boolean
Dim Cible As String, Fichier As String
Dim m As Integer
Cible = Imge.alt
For m = 1 To UserForm1.TreeView1.Nodes.Count
If Cible = UserForm1.TreeView1.Nodes.Item(m).Text Then
UserForm1.Label2 = UserForm1.TreeView1.Nodes.Item(m).Text
UserForm1.Label3 = "Téléphone : " & Feuil2.Cells(m, 15)
UserForm1.Label4 = "Fax : " & Feuil2.Cells(m, 16)
UserForm1.Label5 = "Fonction : " & UserForm1.TreeView1.Nodes.Item(m).Parent
Fichier = ThisWorkbook.Path & "\" & Cible & ".jpg"
If Dir(Fichier) <> "" Then
UserForm1.Image1.Picture = LoadPicture(Fichier)
Else
Set UserForm1.Image1.Picture = Nothing
End If
End If
Next m
End Function
|
IV. Téléchargement


Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur.
La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.