Comment insérer et remplir un treeview dans un formulaire Access
Insérer un treeview
Tout d'abord, il faut insérer ce contrôle ActiveX : menu Insertion/Contrôle Activex... et choisissez Microsoft TreeView control
Le treeview se place alors sur votre formulaire
Un double clic sur celui-ci vous permet d'éditer ses propriétés spécifiques. Pour éditer ses propriétés par rapport au formulaire, faites ALT + Entrée.
Personnellement, j'utilise les réglages suivants qui font ressembler le treeview à l'arborescence de l'explorateur :

Ces propriétés peuvent aussi être spécifiées dans le code VBA
Pour personnaliser les icônes utilisées par le treeview, vous pouvez aussi insérer un contrôle ImageList (Microsoft ImageList control). N'oubliez pas de nommer chaque image (key) et choisissez plutôt des images en 16*16.

La propriété ImageList du TreeView vous permet d'indiquer le nom du contrôle ImageList à utiliser pour les images. Pour notre tutoriel, nous utiliserons deux images (IMG_FOLD et IMG_USER)
Données du treeview
Il faut une table ou une requête. Si vous voulez utiliser une source extérieure de données, du type fichier texte tabulé, vous pouvez utiliser les commandes de l'objet FileSystemObject ou bien importer ce fichier dans une table temporaire.
Ce tutoriel utilise une table qu'on appellera Treeview. Les champs sont les suivants :
N°Entite (numéro auto) clé primaire
EntiteCourt (texte 16) Libellé court du noeud
Entite (texte 90) Libellé long
TypeEntite (texte 8 liste de choix : 4;"niveau 4";3;"niveau 3";2;"niveau 2";1;"niveau 1")
N°EntiteS (entier long) Numéro du noeud supérieur (en référence à N°Entite)
La procédure de construction du treeview crée chaque noeud (entité) « parent » et ses « enfants ». Un noeud enfant peut être créé si son parent existe déjà. On utilisera donc une requête « R_Treeview_triee » qui trie les entités par ordre croissant de leur TypeEntite pour éviter un plantage du code.
Ecriture du code
Pour que ça fonctionne bien, votre code vba doit faire référence (Outils/Références...) à :
Sub RemplirTreeviewEntites(Optional EntiteAAfficher As Long)
On Error GoTo ErreursRemplirTreeviewEntites
' définition des variables
Dim trwarbo As TreeView
Dim mynode As Node
Dim Mabase As Database
Dim RSEntites As DAO.Recordset
Dim txtSQL As String
Dim j As Integer
' ouverture de la requête du formulaire en cours
Set Mabase = CurrentDb
txtSQL = "SELECT * FROM R_Treeview_triee;"
Set RSEntites = Mabase.OpenRecordset(txtSQL, dbOpenSnapshot)
' instanciation de l'objet treeview
Set trwarbo = Me.TV1.Object
With trwarbo
.Nodes.Clear
.ImageList = Me.ImageList1.Object
.HideSelection = False
.HotTracking = True
.LineStyle = tvwRootLines
End With
'remplissage du treeview avec le contenu de la requête
Do While Not RSEntites.EOF
'niveau1
If IsNull(RSEntites![N°entiteS]) = True Then
Set mynode = trwarbo.Nodes.Add(, , "Ent" & RSEntites![N°Entite], RSEntites![EntiteCourt], "IMG_FOLD")
mynode.Bold = True
mynode.ForeColor = RGB(98, 162, 197)
Else
'niveaux2 à 4
Select Case Left(RSEntites![TypeEntite], 1)
Case 2
trwarbo.Nodes.Add "Ent" & RSEntites![N°entiteS], tvwChild, "Ent" & RSEntites![N°Entite], RSEntites![EntiteCourt], "IMG_FOLD"
Case 3
trwarbo.Nodes.Add "Ent" & RSEntites![N°entiteS], tvwChild, "Ent" & RSEntites![N°Entite], RSEntites![EntiteCourt], "IMG_FOLD"
Case 4
trwarbo.Nodes.Add "Ent" & RSEntites![N°entiteS], tvwChild, "Ent" & RSEntites![N°Entite], RSEntites![EntiteCourt], "IMG_USER"
End Select
End If
RSEntites.MoveNext
Loop
trwarbo.Refresh
TV1.Requery
'affichage de du noeud demandé
If EntiteAAfficher <> 0 Then
trwarbo.Nodes.Item("Ent" & EntiteAAfficher).Selected = True
Else
trwarbo.Nodes(1).Selected = True
End If
'libération du recordset
Set RSEntites = Nothing
Exit Sub
ErreursRemplirTreeviewEntites:
Select Case Err
Case 13 'EntiteCourt est vide
If IsNull(RSEntites![EntiteCourt]) Then
Beep
MsgBox "L'arborescence contenant les Entités ne peut pas s'afficher correctement" & vbCrLf & "car l'entité n° " & RSEntites![N°Entite] & " n'a pas de libellé court." & vbCrLf & vbCrLf & "Vous devez modifier cette entité.", vbCritical, "L'application a rencontré une erreur"
End If
Exit Sub
Case 35601 'N°EntiteS introuvable
Beep
MsgBox "L'arborescence contenant les Entités ne peut pas s'afficher correctement" & vbCrLf & "car l'entité n° " & RSEntites![N°Entite] & " (" & RSEntites![EntiteCourt] & ") indique une entité parente qui n'existe pas." & vbCrLf & vbCrLf & "Vous devez modifier cette entité.", vbCritical, "L'application a rencontré une erreur"
Exit Sub
Case Else
MsgBox "Erreur n° " & Err & " : " & Err.Description, vbCritical
Exit Sub
End Select
End Sub
Le paramètre optionnel EntiteAAfficher vous permet de construire le treeview et d'afficher l'entité désirée (par exemple : RemplirTreeviewEntites(25)).
Lorsqu'on crée un noeud dans le treeview (trwarbo.Nodes.Add), on doit lui donner un nom alphanumérique, c'est pourquoi j'ai choisi d'appeler chaque noeud Entxxx, xxx étant le N°Entite.