Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :
Propriétés des images en VBA Excel
Dans le volet précédent, nous avons appris à récolter tous les fichiers d'un dossier pour lister ces derniers sur une
feuille Excel avec leurs attributs. Sur la base de ces acquis, nous proposons désormais de récolter, non pas tous les fichiers d'un dossier, mais seulement les
images qu'il contient. Et grâce à une
nouvelle classe que nous allons instancier en
VBA , nous allons être en mesure de dresser leurs propriétés, comme la
largeur en pixels , la
hauteur et l'
extension mais aussi la
résolution en
pixels par pouce .
Classeur Excel à télécharger
Pour réaliser cette étude, nous suggérons d'appuyer les travaux sur un
classeur Excel offrant une grille destinée à recevoir ces données et un bouton destiné à désigner un dossier à analyser.
Nous découvrons un
tableau Excel destiné à importer les
noms des fichiers de
type image avec leurs
propriétés . Sur la droite, un bouton est matérialisé par l'icône d'un dossier. Au clic sur ce dernier, une
boîte de dialogue doit permettre à l'utilisateur de désigner un
dossier pour importer toutes les informations des photos qui s'y trouvent.
La procédure au Clic
Nous devons commencer par créer la
procédure VBA qui déclenchera l'exécution du code au clic sur ce bouton à l'icône d'un dossier. Ce bouton se nomme
dossier .
Réaliser le raccourci clavier ALT + F11 pour basculer dans l'éditeur VBA Excel ,
Dans l'explorateur sur la gauche, double cliquer sur l'élément Feuil1 (listeFichiers),
En haut de la feuille de code, avec la liste déroulante de gauche, choisir l'objet dossier ,
Avec la liste déroulante de droite, choisir l'événement MouseUp ,
Nous passons ainsi entre les bornes de la
procédure évènementielle dossier_MouseUp . Son code se déclenchera dès que l'utilisateur aura cliqué sur l'image à l'icône du dossier.
Dans les bornes de cette procédure, ajouter les déclarations et affectation suivantes :
...
Dim boite As FileDialog: Dim chemin As String: Dim ligne As Integer: Dim leFichier As String
Dim objetFichier As Object: Dim leDossier As Object: Dim chaqueFichier As Object
Dim objImg As Object: Dim ext As String
Range("B6:F1000").Value = ""
...
Comme dans le volet précédent, nous déclarons des
objets pour piloter les
boîtes de dialogue standards d'Office mais aussi les
fichiers du disque . Nous déclarons aussi des
variables pour mémoriser le
chemin d'accès à chaque fichier que nous allons parcourir ou encore un compteur pour faire progresser l'indice de ligne des données récoltées à inscrire les unes en dessous des autres sur la feuille. Mais ce qui est nouveau, c'est que nous déclarons un
objet que nous nommons
objImg . Son rôle sera d'
instancier la classe permettant d'accéder aux
propriétés des images parcourues par la boucle que nous engagerons. Enfin, nous réinitialisons la zone d'importation (Range("B6:F1000").Value ="") pour la purger des potentielles précédentes analyses.
La classe des boîtes de dialogue
Les variables et objets étant déclarés, nous pouvons commencer par
instancier la classe permettant de piloter les
boîtes de dialogue standards . Ainsi, l'utilisateur pourra désigner un dossier dans lequel il s'agira d'importer et d'analyser les images qu'il contient.
A la suite du code, ajouter les instructions VBA suivantes :
...
Set boite = Application.FileDialog(msoFileDialogFolderPicker)
If boite.Show Then chemin = boite.SelectedItems(1)
If chemin <> "" Then
End If
...
Nous le savons désormais pertinemment, c'est la
méthode FileDialog de l'
objet VBA Application qui permet d'instancier cette classe des boîtes de dialogue. Avec le
paramètre msoFileDialogFolderPicker , nous offrons à l'utilisateur celle lui permettant de désigner un
dossier . Et c'est ainsi que nous initialisons (Set) notre
objet boite . De fait, grâce à la
méthode héritée Show , nous affichons cette boîte de dialogue. Et grâce à sa
collection héritée SelectedItems , nous récupérons le
chemin d'accès au dossier spécifié (1). Si l'utilisateur n'a pas cliqué sur le bouton Annuler, donc qu'il a bien défini un dossier à analyser (If chemin <> "" Then), nous poursuivons le traitement, sinon et implicitement, nous l'avortons.
La classe des fichiers
C'est au tour de la classe permettant de
manipuler les fichiers d'être instanciée. En effet, il est question de passer en revue tous les fichiers hébergés par le dossier choisi par l'utilisateur.
Dans l'instruction conditionnelle, ajouter les lignes VBA suivantes :
...
ligne = 6
[B3].Value = "Chemin : " & chemin
Set objetFichier = CreateObject("scripting.filesystemobject")
Set leDossier = objetFichier.getfolder(chemin)
...
Tout d'abord, nous calons la
variable ligne sur le premier indice (6) du tableau d'importation. Dans la cellule de titre en
B3 , nous inscrivons le
chemin d'accès au dossier choisi par l'utilisateur. C'est alors la
fonction VBA CreateObject qui entre en jeu pour
instancier la classe des fichiers (scripting.filesystemobject). Dès lors, la
méthode héritée getfolder de l'
objet objetFichier permet de désigner le dossier (chemin) à analyser. Et c'est ainsi que notre
objet leDossier est initialisé (Set).
La classe des images
C'est maintenant la
classe des images que nous devons instancier pour être en mesure de récolter les attributs de chaque photo que nous allons parcourir.
A la suite du code de l'instruction conditionnelle, ajouter la ligne VBA suivante :
...
Set objImg = CreateObject("WIA.ImageFile")
...
L'incontournable
fonction VBA CreateObject avec le
paramètre WIA.ImageFile permet d'initialiser (Set) l'
objet objImg . Nous exploiterons bientôt ses propriétés et méthodes héritées pour restituer les attributs des images que nous allons parcourir.
Parcourir les fichiers du dossier
Précisément, il est temps d'enclencher la
boucle d'analyse du dossier désigné par l'utilisateur.
A la suite du code de l'instruction conditionnelle, ajouter les lignes VBA suivantes :
...
For Each chaqueFichier In leDossier.Files
leFichier = chemin & "\" & chaqueFichier.Name
ext = objetFichier.GetExtensionName(leFichier)
If ext = "jpg" Or ext = "png" Or ext = "bmp" Then
End If
Next chaqueFichier
...
Grâce à l'
objet chaqueFichier dans une
boucle For Each , nous parcourons la
collection des fichiers contenus dans le dossier (leDossier.Files). Pour chacun et tour à tour, nous prélevons son
chemin d'accès complet dans la
variable chemin . Nous enregistrons son
extension (GetExtensionName) dans la
variable ext . Extension que nous testons (If ext = "jpg" Or ext = "png" Or ext = "bmp" Then) pour exclure tout ce qui n'est pas une image.
Charger les propriétés de l'image
Dans cette boucle parcourant les fichiers du dossier et dans cette instruction conditionnelle imbriquée, c'est maintenant qu'entrent en jeu les propriétés et méthodes de la classe permettant d'accéder aux
attributs des fichiers image .
Toujours à la suite du code dans l'instruction conditionnelle, ajouter les lignes VBA suivantes :
...
objImg.LoadFile leFichier
Cells(ligne, 2).Value = Replace(chaqueFichier.Name, "." & ext,"")
Cells(ligne, 3).Value = objImg.Width
Cells(ligne, 4).Value = objImg.Height
Cells(ligne, 5).Value = ext
Cells(ligne, 6).Value = Int(objImg.HorizontalResolution)
ligne = ligne + 1
...
Grâce à la
méthode héritée LoadFile , nous chargeons le fichier en cours d'analyse. C'est ainsi que nous sommes en mesure de diffuser ses différentes propriétés sur la ligne en cours (ligne). Nous exploitons tout d'abord la
fonction VBA Replace pour conserver le
nom du fichier sans son extension , pour l'inscrire en
colonne B (2). Puis, ce sont les
propriétés héritées Width ,
Height et
HorizontalResolution qui renseignent respectivement sur la
largeur , la
hauteur et la
résolution de l'image en cours d'analyse. La
fonction Int est utilisée pour arrondir les résolutions qui sont retournées avec des décimales.
Décharger les objets
Pour finir et avant de tester le code, comme vous le savez, nous devons détruire les objets qui ne sont plus utilisés. C'est ainsi que nous allons pouvoir alléger la mémoire de l'ordinateur.
A la toute fin du code, avant le End Sub, ajouter les instructions VBA suivantes :
...
Next chaqueFichier
End If
Set boite = Nothing
Set objetFichier = Nothing
Set leDossier = Nothing
Set chaqueFichier = Nothing
End Sub
...
C'est la réinitialisation (Set) à Nothing qui permet de détruire les différents objets et de les sortir de la mémoire de l'ordinateur.
Enregistrer les modification (CTRL + S) et basculer sur la feuille Excel (ALT + Tab),
Cliquer sur le bouton à l'icône du dossier,
Dans la boîte de dialogue, entrer dans un dossier contenant des images,
Puis, cliquer sur le bouton Ok pour lancer le processus d'analyse,
C'est ainsi que nous sommes de retour sur la
feuille Excel et comme vous pouvez l'apprécier, ce sont tous les
noms des images du dossier avec leurs
attributs qui sont rapatriés et organisés dans le tableau prévu à cet effet.