I. Description▲
Le contrôle ListView permet d'afficher des informations sous différentes présentations. Les données visualisées peuvent
être issues de sources très diverses: La saisie d'un formulaire, le contenu de fichiers, le résultat de requêtes
SQL...
Quatre modes d'affichage sont disponibles:
Icone (Constante lvwIcon)
Petit Icone (Constante lvwSmallIcon)
Liste (Constante lvwList)
Détails (Constante lvwReport)
Une fois stockées dans la ListView, les données sont facilement manipulables.
Il est possible de changer le mode d'affichage, trier les colonnes, supprimer
ou ajouter des lignes, appliquer une mise en forme, réexporter le contenu
de la ListView...
Des images et icônes peuvent être associées aux items d'une ListView.
Les chapitres suivants présentent principalement des exemples en mode "Détails".
II. Exemples d'utilisation▲
II-A. Alimenter une ListView▲
Chaque ligne d'une ListView peut être définie en 2 parties:
ListView1.ListItems(x) spécifie la ligne x et la 1ere colonne de cette ligne.
ListView1.ListItems(x).ListSubItems(y) permet de spécifier les
colonnes adjacentes. Par exemple
ListView1.ListItems(5).ListSubItems(1) indique la 2eme colonne dans la 5eme ligne de la
ListView.
La syntaxe pour ajouter une ligne:
ListView1.ListItems.Add [Index], [Key], [Text], [Icon], [SmallIcon]
[Index]: Facultatif.
Indique le numéro de ligne ou doit être
ajouté la nouvel élément. Les données sont ajoutées à la suite de la dernière ligne si
l'argument n'est pas spécifié.
[Key]: Facultatif.
Attribue une clé unique qui fiabilise
l'identification des lignes.
[Text]: Facultatif.
Indique le texte qui va s'afficher dans la première
colonne de la ListView.
[Icon]: Facultatif.
Spécifie l'image qui doit s'afficher quand
la ListView est en mode lvwIcon.
[SmallIcon]: Facultatif.
Spécifie l'image qui doit s'afficher
quand la ListView est en mode lvwSmallIcon, lvwList ou lvwReport.
La syntaxe pour ajouter un sous élément (Les colonnes de droite dans la ligne spécifiée):
ListView1.ListItems(1).ListSubItems.Add [Index], [Key], [Text], [ReportIcon], [TooltipText]
1:
Spécifie le numéro de ligne dans la ListView.
[Index]: Facultatif.
Indique le numéro de colonne pour l'ajout
d'une donnée. La valeur 1 correspond à la 2eme colonne d'une ListView.
[Key]: Facultatif.
Attribue une clé unique qui fiabilise l'identification des lignes.
[Text]: Facultatif.
Indique le texte qui va s'afficher dans la ListView.
[ReportIcon]: Facultatif.
Permet d'afficher un icône ou une image dans le sous élément spécifié.
[TooltipText]: Facultatif.
Permet d'ajouter une infobulle dans le
sous élément spécifié.
La syntaxe pour définir les colonnes:
Pour ajouter des éléments dans les colonnes, vous devez préalablement définir leur nombre,
dimensions et textes d'entête:
ListView1.ColumnHeaders.Add [Index], [Key], [Text], [Width], [Alignment], [Icon]
[Index]: Facultatif
[Key] Facultatif.
Attribue une clé unique qui fiabilise l'identification des entêtes.
[Text]: Facultatif.
Spécifie le texte qui va s'afficher dans l'entête.
[Width]: Facultatif.
Spécifie la largeur de la colonne. La valeur par défaut est de 72 points.
[Alignment]: Facultatif.
Spécifie l'alignement dans la colonne. Les constantes disponibles:
lvwColumnLeft(Valeur par défaut), lvwColumnCenter, lvwColumnRight.
[Icon]: Facultatif.
Spécifie l'image qui doit s'afficher dans l'entête.
Ce premier exemple montre le principe de remplissage d'une Listview.
Private
Sub
UserForm_Initialize
(
)
'----- remplissage ListView------------------------
With
ListView1
'Définit le nombre de colonnes et Entêtes
With
.ColumnHeaders
'Supprime les anciens entêtes
.Clear
'Ajoute 3 colonnes en spécifiant le nom de l'entête
'et la largeur des colonnes
.Add
, , "Nom"
, 80
.Add
, , "Ville"
, 50
.Add
, , "Age"
, 50
End
With
'Remplissage de la 1ere colonne (création de 3 lignes)
With
.ListItems
.Add
, , "Riri"
.Add
, , "Fifi"
.Add
, , "Loulou"
End
With
'Remplissage des colonnes 2 et 3 dans la 1ere ligne
.ListItems
(
1
).ListSubItems.Add
, , "Ville01"
.ListItems
(
1
).ListSubItems.Add
, , 30
'Remplissage des colonnes 2 et 3 dans la 2eme ligne
.ListItems
(
2
).ListSubItems.Add
, , "Ville02"
.ListItems
(
2
).ListSubItems.Add
, , 27
'Remplissage des colonnes 2 et 3 dans la 3eme ligne
.ListItems
(
3
).ListSubItems.Add
, , "Ville03"
.ListItems
(
3
).ListSubItems.Add
, , 41
End
With
'--------------------------------------------------
'Spécifie l'affichage en mode "Détails"
ListView1.View
=
lvwReport
End
Sub
Cette macro est un exemple simplifié et il est bien entendu possible de créer des boucles
afin d'optimiser le remplissage.
II-B. Lire et Modifier le contenu des lignes▲
Une fois affichées dans le contrôle ListView, les données peuvent être lues et modifiées par
macro.
Cette procédure boucle sur l'ensemble de la ListView et transfére les
informations dans une feuille de calcul.
Private
Sub
CommandButton2_Click
(
)
Dim
i As
Integer
, j As
Integer
'Boucle sur toutes les lignes
For
i =
1
To
ListView1.ListItems.Count
Cells
(
i, 1
) =
ListView1.ListItems
(
i).Text
'Boucle sur les colonnes
For
j =
1
To
ListView1.ColumnHeaders.Count
-
1
Cells
(
i, j +
1
) =
ListView1.ListItems
(
i).ListSubItems
(
j).Text
Next
j
Next
i
End
Sub
Les informations contenues dans la ListView peuvent facilement être modifiées:
Par exemple, changer le texte dans la 3eme colonne de la première ligne.
ListView1.listItems
(
1
).listSubItems
(
2
).Text
=
"Test"
Un autre exemple pour modifier le texte dans la 1ere colonne de la 4eme ligne.
ListView1.ListItems
(
4
).Text
=
"Les données"
Les données de la 1ere colonne peuvent être modifiées manuellement dans le contrôle ListView.
Vous pouvez empêcher la modification manuelle des données en spécifiant la
valeur 1 (lvwManual) dans la propriété LabelEdit.
ListView1.labeledit
=
1
II-C. Utiliser les clés (Key)▲
Vous avez vu dans le chapitre II-A qu'il est possible d'attribuer des clés uniques aux éléments
d'une ListView (Items, SubItems, Entêtes de colonnes). Quelques soient les déplacements effectués
(suite à un tri par exemple), vos données peuvent être retrouvées à partir de cette clé d'identification.
Cet exemple récupère le contenu de l'Item auquel est attribué la clé "K20".
Nota:
La procédure renvoie une erreur si la clé n'existe pas dans la ListView.
MsgBox
ListView1.ListItems
(
"K20"
).Text
Et pour récupérer un sous élément spécifique "K21" dans l'élément "K20":
MsgBox
ListView1.ListItems
(
"K20"
).ListSubItems
(
"K21"
).Text
Vous pouvez aussi récupérer la clé d'une ligne.
La procédure renvoie une chaine vide si aucune clé n'est attribuée.
MsgBox
ListView1.ListItems
(
2
).Key
Cette macro permet d'attribuer une clé au ListItem de la 2eme ligne. Si une clé existait
dèja pour cet élément, celle ci sera écrasée. Par contre si vous essayez d'attribuer une clé
déja associée à un autre élément, la procédure renvoie un message d'erreur: Ce qui est logique
puisque la clé doit être unique.
Private
Sub
CommandButton2_Click
(
)
'Lit la clé d'origine
MsgBox
ListView1.ListItems
(
2
).Key
'Attribue une nouvelle clé au ListItem de la 2eme ligne
ListView1.ListItems
(
2
).Key
=
"MaNouvelleClé"
'Vérification de la nouvelle clé
MsgBox
ListView1.ListItems
(
2
).Key
End
Sub
II-D. Supprimer des lignes▲
Vous avez la possibilité de supprimer des lignes précises dans la ListView.
'Supprime la 3eme ligne dans la ListView
ListView1.ListItems.Remove
3
'Un autre exemple pour supprimer une ligne à partir de sa clé ("K20")
'ListView1.ListItems.Remove "K20"
'Supprime la ligne active
ListView1.ListItems.Remove
(
ListView1.SelectedItem.Index
)
Vous pouvez aussi effacer toutes les données d'une ListView.
ListView1.ListItems.Clear
II-E. La mise en forme des données▲
Il est possible de modifier la mise en forme de la ListView afin de
personnaliser la visualisation des informations:
Cet exemple modifie la couleur du texte dans le 2eme sous élément de la 1ere ligne.
ListView1.listitems
(
1
).ListSubItems
(
2
).ForeColor
=
RGB
(
100
, 0
, 100
)
Appliquer un format dans une "cellule de la listview
ListView1.ListItems
(
2
).ListSubItems.Add
, , Format
(
1234567
.89
, "##,##0.00"
)
Vous pouvez utiliser la propriété FullRowSelect pour surligner la ligne entière
lors d'une sélection.
ListView1.FullRowSelect
=
True
Le propriété Gridlines permet d'afficher un quadrillage dans la ListView.
Cette propriété est très utile pour améliorer la lisibilité des données.
ListView1.Gridlines
=
True
Une option du contrôle permet d'afficher des cases à cocher dans la colonne de gauche.
Me.ListView1.CheckBoxes
=
True
Vous pouvez ensuite indiquer le statut par défaut de la CheckBox. Si vous ne spécifiez pas ce paramètre, la case ne sera pas visible tout de suite: Vous devrez cliquer sur le bord gauche de la Ligne pour faire apparaitre la CheckBox.
Dim
i As
Integer
For
i =
1
To
ListView1.ListItems.Count
ListView1.ListItems
(
i).Checked
=
False
Next
i
Ensuite cet exemple utilise l'évènement ItemCheck pour identifier quand une checkBox
est cochée ou décochée. La mise en forme est modifiée (couleur bleue et en gras).
Private
Sub
ListView1_ItemCheck
(
ByVal
Item As
MSComctlLib.ListItem
)
Dim
j As
Integer
If
Item.Checked
=
True
Then
Item.ForeColor
=
RGB
(
0
, 0
, 255
) 'Changement couleur
Item.Bold
=
True
'Gras
For
j =
1
To
Item.ListSubItems.Count
Item.ListSubItems
(
j).ForeColor
=
RGB
(
0
, 0
, 255
)
Item.ListSubItems
(
j).Bold
=
True
Next
j
Else
Item.ForeColor
=
RGB
(
1
, 0
, 0
) 'Changement couleur
Item.Bold
=
False
For
j =
1
To
Item.ListSubItems.Count
Item.ListSubItems
(
j).ForeColor
=
RGB
(
1
, 0
, 0
)
Item.ListSubItems
(
j).Bold
=
False
Next
j
End
If
End
Sub
Vous pouvez choisir de masquer les en-têtes de colonnes en utilisant la propriété HideColumnHeaders.
ListView1.HideColumnHeaders
=
True
La macro suivante spécifie que les données doivent être centrées dans la colonne créée.
ListView1.ColumnHeaders.Add
, , "Ville"
, 50
, lvwColumnCenter
La propriété AllowColumnReorder autorise le déplacement des colonnes les unes par rapport aux
autres, par un glisser/déposer.
ListView1.AllowColumnReorder
=
True
II-F. Trier les colonnes▲
Les ListView possèdent une propriété Sorted.
Si vous placez cette propriété à True, les Items de la première colonne seront triés
par défaut. Vous pouvez spécifier la colonne de tri en indiquant une valeur dans la
propriété SortKey. L'index de la première colonne est 0.
La propriété SortOrder définit le sens du tri: lvwAscending
(Croissant) ou lvwDescending (Décroissant).
Cet exemple utilise l'évènement ColumnClick. Le premier clic effectue un tri décroissant
de la colonne cliquée. Le deuxième clic effectue un tri croissant.
' ------ Tri lors de la sélection d'une colonne ----------
Private
Sub
ListView1_ColumnClick
(
ByVal
ColumnHeader As
MSComctlLib.ColumnHeader
)
ListView1.Sorted
=
False
ListView1.SortKey
=
ColumnHeader.Index
-
1
If
ListView1.SortOrder
=
lvwAscending Then
ListView1.SortOrder
=
lvwDescending
Else
ListView1.SortOrder
=
lvwAscending
End
If
ListView1.Sorted
=
True
End
Sub
Cet autre exemple permet de trier une colonne contenant des dates.
La procédure est adaptée d'une solution donnée par
Jacques Malatier sur le site developpez.com.
La macro transforme les dates au format décimal, effectue le
tri puis repasse au format DD/MM/YYYY.
' ------ Tri d'une colonne contenant des Dates -------
Private
Sub
ListView1_ColumnClick
(
ByVal
ColumnHeader As
MSComctlLib.ColumnHeader
)
Dim
i As
Integer
, j As
Integer
ListView1.Sorted
=
False
ListView1.SortKey
=
ColumnHeader.Index
-
1
'Boucle sur toutes les lignes
For
i =
1
To
ListView1.ListItems.Count
'Passage des données au format décimal
ListView1.ListItems
(
i).ListSubItems
(
ColumnHeader.Index
-
1
).Text
=
_
CDec
(
CDate
(
ListView1.ListItems
(
i).
_
ListSubItems
(
ColumnHeader.Index
-
1
).Text
))
Next
i
' ------ Application du tri -----------
If
ListView1.SortOrder
=
lvwAscending Then
ListView1.SortOrder
=
lvwDescending
Else
ListView1.SortOrder
=
lvwAscending
End
If
ListView1.Sorted
=
True
'--------------------------------------
'Boucle sur toutes les lignes
For
i =
1
To
ListView1.ListItems.Count
'Ensuite on revient au format DD/MM/YYYY
ListView1.ListItems
(
i).ListSubItems
(
ColumnHeader.Index
-
1
).Text
=
_
Format
(
CDate
(
ListView1.ListItems
(
i).ListSubItems
_
(
ColumnHeader.Index
-
1
).Text
), "DD/MM/YYYY"
)
Next
i
End
Sub
II-G. La multi sélection▲
Pour autoriser la multi sélection, vous devez tout d'abord passer la
propriété Multiselect à True.
Ensuite sélectionnez les lignes en gardant enfoncée la touche Ctrl.
Cet exemple permet de boucler sur les lignes sélectionnées.
Dim
i As
Integer
For
i =
1
To
ListView1.ListItems.Count
'Affiche le contenu de la 1ere colonne pour chaque ligne sélectionnée
If
ListView1.ListItems
(
i).Selected
=
True
Then
_
MsgBox
ListView1.ListItems
(
i).Text
Next
Remarque:
La première ligne est toujours sélectionnée par défaut lors de l'initialisation.
Si vous avez besoin de la déselectionner, utilisez:
ListView1.ListItems
(
1
).Selected
=
False
Set
ListView1.SelectedItem
=
Nothing
Cet autre exemple permet de désélectionner toutes les lignes.
Private
Sub
CommandButton2_Click
(
)
Dim
X As
Integer
For
X =
1
To
ListView1.ListItems.Count
ListView1.ListItems
(
X).Selected
=
False
Next
Set
ListView1.SelectedItem
=
Nothing
End
Sub
Pour vérifier si au moins une ligne est sélectionnée dans la listview,
utilisez:
Private
Sub
CommandButton1_Click
(
)
Dim
LstItem As
ListItem
On
Error
Resume
Next
Set
LstItem =
ListView1.SelectedItem
On
Error
GoTo
0
If
LstItem Is
Nothing
Then
MsgBox
"Aucune ligne n'est sélectionnée."
Else
MsgBox
"Il y a au moins une ligne de sélectionnée."
End
If
End
Sub
II-H. Affichage dans la zone visible▲
La méthode EnsureVisible fait apparaître la ligne spécifiée dans la fenêtre de la ListView.
La macro suivante déplace le 50eme item dans la partie visible de la Listview.
Listview1.ListItems
(
50
).EnsureVisible
Si vous souhaitez afficher le 50eme item de la listView dans la première ligne de la
partie visible (l'équivalent de TopIndex dans une ListBox), utilisez.
Private
Sub
CommandButton2_Click
(
)
Dim
i As
Integer
For
i =
1
To
ListView1.ListItems.Count
ListView1.ListItems
(
i).EnsureVisible
'50 est la ligne que vous souhaitez placer dans tout en haut de la zone visible
If
50
=
ListView1.GetFirstVisible.Index
Then
Exit
For
Next
i
End
Sub
Un autre exemple pour sélectionner et visualiser la dernière ligne d'une ListView.
Private
Sub
CommandButton2_Click
(
)
ListView1.ListItems
(
ListView1.ListItems.Count
).EnsureVisible
ListView1.ListItems
(
ListView1.ListItems.Count
).Selected
=
True
ListView1.SetFocus
End
Sub
II-I. Images et icônes▲
Des images ou îcones peuvent être associés aux lignes du contrôle. Les arguments Icon et SmallIcon
indiquent les images qui doivent être affichées en fonction du mode de présentation défini:
SmallIcon pour les modes lvwSmallIcon, lvwList, lvwReport.
Icon pour le mode lvwIcon.
Les images sont stockées dans une imageList.
Consultez l'exemple dans le tutoriel consacré au contrôle ImageList
Les entêtes de colonne peuvent aussi contenir des îcones.
Pour cet exemple, ajoutez des contrôles ListView et ImageList dans l'UserForm.
Private
Sub
UserForm_Initialize
(
)
Dim
X As
Integer
'Supprime toutes les anciennes images de l'ImageList
Me.ImageList1.ListImages.Clear
'Définit la dimension des images
Me.ImageList1.ImageHeight
=
16
'Hauteur
Me.ImageList1.ImageWidth
=
16
'Largeur
'Charge les images dans l'ImageList
Me.ImageList1.ListImages.Add
, "Im2"
, LoadPicture
(
"C:\fourmiz.JPG"
)
Me.ImageList1.ListImages.Add
, "Im3"
, LoadPicture
(
"C:\slcplappl.ico"
)
'-------- Associe les images à la ListView ------------
Set
Me.ListView1.ColumnHeaderIcons
=
Me.ImageList1
'------------------------------------------------------
With
ListView1
With
.ColumnHeaders
.Clear
'------------------------------------------------------------------------
'Le dernier argument attribue une image à l'entête, en utilisant les clés
'de l'ImageList
.Add
, , "Nom"
, 80
, , "Im2"
.Add
, , "Ville"
, 50
, , "Im3"
.Add
, , "Age"
, 50
End
With
'------------------------------------------------------------------------
'Remplissage 1ere colonne
With
.ListItems
.Add
, , "Riri"
.Add
, , "Fifi"
.Add
, , "Loulou"
End
With
'Remplissage colonnes 2 et 3
.ListItems
(
1
).ListSubItems.Add
, , "Ville01"
.ListItems
(
1
).ListSubItems.Add
, , "30"
.ListItems
(
2
).ListSubItems.Add
, , "Ville02"
.ListItems
(
2
).ListSubItems.Add
, , "27"
.ListItems
(
3
).ListSubItems.Add
, , "Ville03"
.ListItems
(
3
).ListSubItems.Add
, , "41"
End
With
'Spécifie l'affichage en mode Icône lors du lancement du UserForm
ListView1.View
=
lvwReport
End
Sub
De la même manière, il est aussi possible d'associer une image aux SubItems.
Private
Sub
UserForm_Initialize
(
)
Dim
X As
Integer
'Supprime toutes les images de la liste
Me.ImageList1.ListImages.Clear
'Définit la dimension des images
Me.ImageList1.ImageHeight
=
16
'Hauteur
Me.ImageList1.ImageWidth
=
16
'Largeur
'Charge les nouvelles images
Me.ImageList1.ListImages.Add
, "Im2"
, LoadPicture
(
"C:\fourmiz.JPG"
)
Me.ImageList1.ListImages.Add
, "Im3"
, LoadPicture
(
"C:\slcplappl.ico"
)
'-------------------------------------------
'Associe les images à la ListView
Set
Me.ListView1.SmallIcons
=
Me.ImageList1
Set
Me.ListView1.Icons
=
Me.ImageList1
'-------------------------------------------
With
ListView1
'définit le nombre de colonnes et Entêtes (titres et tailles des colonnes)
With
.ColumnHeaders
.Clear
.Add
, , "Nom"
, 80
.Add
, , "Ville"
, 50
.Add
, , "Age"
, 50
End
With
'Remplissage 1ere colonne
With
.ListItems
.Add
, , "Riri"
.Add
, , "Fifi"
.Add
, , "Loulou"
End
With
'Remplissage colonnes 2 et 3
'-------------------------------------------
'Le dernier argument attribue une image aux SubItems, en utilisant les clés
'de l'ImageList
.ListItems
(
1
).ListSubItems.Add
, , "Ville01"
, "Im2"
.ListItems
(
1
).ListSubItems.Add
, , "30"
, "Im3"
.ListItems
(
2
).ListSubItems.Add
, , "Ville02"
, "Im2"
.ListItems
(
2
).ListSubItems.Add
, , "27"
, "Im3"
.ListItems
(
3
).ListSubItems.Add
, , "Ville03"
, "Im2"
.ListItems
(
3
).ListSubItems.Add
, , "41"
, "Im3"
End
With
'Spécifie l'affichage en mode Icône lors du lancement du UserForm
ListView1.View
=
lvwReport
End
Sub
Ce dernier exemple liste les fichiers d'un répertoire ainsi que certaines de leurs
propriétés. L'îcone de l'executable qui ouvre ces fichiers s'affiche aussi,
dans le style du volet droit de l'explorateur Windows.
'--------- Procédure à placer dans le module objet du UserForm ----------------
'Ajoutez:
'Un Label (LaBel1)
'Une ImageList (ImageList1)
'Une ListView (ListView1)
'Un commandButton (CommandButton1)
'
'Adaptez le répertoire cible
'
Option
Explicit
Private
Sub
UserForm_Initialize
(
)
'Définit les entêtes de colonnes
With
ListView1
With
.ColumnHeaders
.Clear
'Supprime les anciens entêtes
'Ajout des colonnes
.Add
, , "Nom fichier"
, 200
.Add
, , "Taille"
, 40
, lvwColumnRight
.Add
, , "Créé le"
, 60
, lvwColumnCenter
.Add
, , "Modifié le"
, 60
, lvwColumnCenter
.Add
, , "Commentaires"
, 200
, lvwColumnLeft
End
With
.View
=
lvwReport 'affichage en mode Rapport
.Gridlines
=
True
'affichage d'un quadrillage
.FullRowSelect
=
True
'Sélection des lignes comlètes
End
With
End
Sub
Private
Sub
CommandButton1_Click
(
)
'Adaptez le répertoire cible
ElementsRepertoire "C:\Documents and Settings\michel\Repertoire"
End
Sub
Private
Sub
ElementsRepertoire
(
Chemin As
String
)
Dim
objShell As
Object, strFileName As
Object
Dim
objFolder As
Object
Dim
i As
Integer
Dim
Executable As
String
Set
objShell =
CreateObject
(
"Shell.Application"
)
Set
objFolder =
objShell.NameSpace
(
CStr
(
Chemin))
Label1 =
Chemin
'Suppression des ancien éléments
ListView1.ListItems.Clear
'Supprime les anciens îcones et définit la taille d'affichage
With
ImageList1
.ListImages.Clear
.ImageWidth
=
16
.ImageHeight
=
16
End
With
'Boucle sur les fichiers du dossier cible
'******************************
For
Each
strFileName In
objFolder.Items
'Vérifie s'il s'agit d'un sous dossier (non pris en compte)
If
strFileName.IsFolder
=
False
Then
i =
i +
1
'Recherche l'executable associé pour ouvrir les fichiers
Executable =
FindExecutable
(
Chemin &
"\"
&
objFolder.GetDetailsOf
(
strFileName, 0
))
'Récupère le 1er icone de l'executable dans l'ImageList
ImageList1.ListImages.Add
, "cle"
&
i, GetIconFromFile
(
Executable, 0
, False
)
'Associe la l'ImageList à la ListView
ListView1.SmallIcons
=
ImageList1
With
ListView1
'Ajoute une ligne
.ListItems.Add
, , objFolder.GetDetailsOf
(
strFileName, 0
)
'Stocke le chemin complet qui servira à ouvrir le fichier
.ListItems
(
i).Tag
=
Chemin &
"\"
&
strFileName
'---------------
'Pour plus de détails sur la méthode utilisée pour récupérer les propriétés des fichiers:
'http://silkyroad.developpez.com/VBA/ProprietesClasseurs/#LIV-C
'---------------
'Ajoute une infobulle contenant le type de fichier et le nom de l'auteur
.ListItems
(
i).TooltipText
=
"Type: "
&
objFolder.GetDetailsOf
(
strFileName, 2
) &
_
" , Auteur: "
&
objFolder.GetDetailsOf
(
strFileName, 9
)
'Ajoute les sous éléments (Taille, Créée le, Modifié le, Commentaires)
.ListItems
(
i).ListSubItems.Add
, , _
objFolder.GetDetailsOf
(
strFileName, 1
)
.ListItems
(
i).ListSubItems.Add
, , _
Format
(
objFolder.GetDetailsOf
(
strFileName, 4
), "DD/MM/YYYY"
)
.ListItems
(
i).ListSubItems.Add
, , _
Format
(
objFolder.GetDetailsOf
(
strFileName, 3
), "DD/MM/YYYY"
)
.ListItems
(
i).ListSubItems.Add
, , _
objFolder.GetDetailsOf
(
strFileName, 14
)
'Associe l'îcone au type de fichier
.ListItems
(
i).SmallIcon
=
"cle"
&
i
End
With
End
If
Next
strFileName
End
Sub
'Ouvre le fichier par un double clic sur la ligne
Private
Sub
ListView1_DblClick
(
)
Dim
leFichier As
String
'Le chemin complet est stocké dans le Tag
leFichier =
ListView1.ListItems.Item
(
ListView1.SelectedItem.Index
).Tag
Unload Me
If
Right
(
leFichier, 4
) =
".xls"
Then
ThisWorkbook.FollowHyperlink
leFichier
Else
ShellExecute 0
, "open"
, leFichier, ""
, ""
, vbNormalFocus
End
If
End
Sub
'---------- Dans un module Standard -----------------------------------------
'**************************************************************
'Nécessite d'activer la référence "Standard OLE Types"
'**************************************************************
Option
Explicit
Declare
Function
SHGetFileInfo Lib
"shell32.dll"
Alias "SHGetFileInfoA"
_
(
ByVal
pszPath As
Any, ByVal
dwFileAttributes As
Long
, psfi As
SHFILEINFO, _
ByVal
cbFileInfo As
Long
, ByVal
uFlags As
Long
) As
Long
Public
Declare
Function
FindExecutableA Lib
"shell32.dll"
_
(
ByVal
lpFile As
String
, ByVal
lpDirectory As
String
, ByVal
lpResult As
String
) As
Long
Public
Const
MAX_FILENAME_LEN =
256
Public
Declare
Function
OleCreatePictureIndirect _
Lib
"olepro32.dll"
(
PicDesc As
PicBmp, RefIID As
GUID, _
ByVal
fPictureOwnsHandle As
Long
, IPic As
IPicture) As
Long
Public
Declare
Function
ShellExecute Lib
"shell32.dll"
Alias "ShellExecuteA"
_
(
ByVal
hwnd As
Long
, ByVal
lpOperation As
String
, ByVal
lpFile As
String
, _
ByVal
lpParameters As
String
, ByVal
lpDirectory As
String
, ByVal
nShowCmd As
Long
) As
Long
Public
Type
PicBmp
Size As
Long
tType As
Long
hBmp As
Long
hPal As
Long
Reserved As
Long
End
Type
Public
Type
GUID
Data1 As
Long
Data2 As
Integer
Data3 As
Integer
Data4
(
7
) As
Byte
End
Type
Public
Type
SHFILEINFO
hicon As
Long
iIcon As
Long
dwAttributes As
Long
szDisplayName As
String
*
260
szTypeName As
String
*
80
End
Type
Public
Function
GetIconFromFile
(
FileName As
String
, IconIndex As
Long
, _
UseLargeIcon As
Boolean
) As
IPicture
'**************************************************************
'Necessite d'activer la reference "Standard OLE Types"
'**************************************************************
Dim
b As
SHFILEINFO
Dim
retval As
Long
Dim
pic As
PicBmp
Dim
IPic As
IPicture
Dim
IID_IDispatch As
GUID
retval =
SHGetFileInfo
(
FileName, 0
, b, Len
(
b), &
H100)
With
IID_IDispatch
.Data1
=
&
H20400
.Data4
(
0
) =
&
HC0
.Data4
(
7
) =
&
H46
End
With
With
pic
.Size
=
Len
(
b)
.tType
=
3
'vbPicTypeIcon
.hBmp
=
b.hicon
End
With
Call
OleCreatePictureIndirect
(
pic, IID_IDispatch, 1
, IPic)
Set
GetIconFromFile =
IPic
End
Function
Public
Function
FindExecutable
(
S As
String
) As
String
'trouve quel executable ouvre le fichier cible
Dim
i As
Integer
Dim
S2 As
String
S2 =
String
(
MAX_FILENAME_LEN, 32
) &
Chr
$(
0
)
i =
FindExecutableA
(
S &
Chr
$(
0
), vbNullString
, S2)
If
i >
32
Then
FindExecutable =
Left
$(
S2, InStr
(
S2, Chr
$(
0
)) -
1
)
Else
FindExecutable =
""
End
If
End
Function
Sub
LancerUserForm
(
)
UserForm1.Show
End
Sub
II-J. Identifier l'utilisation du clic droit▲
Il n'existe pas d'évènement spécifique BeforeRightClick, mais vous pouvez détourner
l'action MouseDown pour identifier l'utilisation du clic droit de la souris sur une ListView.
Private
Sub
ListView1_MouseDown
(
ByVal
Button As
Integer
, ByVal
Shift As
Integer
, _
ByVal
x As
stdole.OLE_XPOS_PIXELS
, ByVal
y As
stdole.OLE_YPOS_PIXELS
)
'Button correspond au clic de la souris
'1= clic gauche
'2= clic droit
'Shift: Indique quelle touche du clavier est enfoncée lors de l'évènement:
'0 = Pas de touche enfoncée
'1 = Touche Shift
'2 = Touche Ctrl
'4 = Touche Alt
'X renvoie la position horizontale dans la listview
'Y renvoie la position verticale
If
Button =
2
Then
MsgBox
"Vous avez effectué un clic droit."
End
Sub