formateur informatique

Largeur, Hauteur et résolution des images en VBA Excel

Accueil  >  Bureautique  >  Excel  >  Excel VBA  >  Largeur, Hauteur et résolution des images en VBA Excel
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Abonner à Youtube    Vidéos astuces Instagram
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. Tableau Excel pour importer les noms des images du dossier avec leurs propriétés

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,
Déclencher un code VBA Excel au clic sur un bouton de la feuille

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,
Récupérer les images et leurs propriétés en VBA Excel

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.

 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn