Banque d’images : compléter la liste d’images
On continue la série Gérer une banque d’images sur Access (cliquez ici pour consulter la liste des articles de cette saga, bientôt autant d’épisodes que dans les Feux de l’Amour, une référence !).
Dans l’article Alimenter une banque d’images automatiquement, je donnais un bout de code qui recense les images d’un dossier et stocke leur chemin dans une table Access. Mais ce code VBA recense systématiquement tout le dossier à chaque fois. En d’autres termes, si vous lancez le programme 2 fois sur le même dossier, vous obtenez 2 fois la même liste d’images dans la table.
Dans cet article, vous trouverez une version améliorée : cette fois, le programme n’indexe les images qu’une seule fois dans le dossier (en se basant uniquement sur le nom du fichier Image et le chemin du dossier). A la fin de la procédure, il signale le nombre d’images recensées, et éventuellement le nombre de doublons ignorés.
Avant toute chose
Le code qui suit annule et remplace la procédure ChargerImages
de l’article Alimenter une banque d’images automatiquement. Vous aurez besoin de tout le reste de l’article original pour que les choses fonctionnent correctement. Du coup, pensez à le consulter pour tout le reste de la mise en œuvre.
Si vous comparez les 2 portions de code, vous verrez que l’essentiel se joue au niveau du FindFirst
qui cherche dans la table si une combinaison Image/Dossier de même nom existe déjà. Si c’est le cas, NoMatch
prend la valeur False
, et on se contente de décompter un doublon et de passer. Dans le cas où NoMatch
vaut True
, aucune correspondance n’a été trouvée, on peut donc ajouter l’image dans la table.
Et je voudrais bien savoir qui, chez Microsoft, a décidé de formuler le NoMatch
de façon négative, ce qui ne simplifie pas la lecture du code… et mes explications ! 😉
Le code VBA
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
' --- ' CHARGER TOUTES LES IMAGES D'UN DOSSIER DANS LA BASE ' --- ' Entrée : strDossier <- Nom du dossier à parcourir. ' strExtension <- Extension des fichiers images. ' Sub ChargerImages( _ ByVal strDossier As String, _ Optional ByVal strExtension As String = "*.jpg") Dim rst As DAO.Recordset Dim strFichier As String Dim intImages As Integer Dim intDoublons As Integer ' Ajouter un à la fin du dossier, si nécessaire strDossier = AddBackslash(strDossier) ' Ouvrir la table Set rst = CurrentDb.OpenRecordset("tblImages", dbOpenDynaset) ' Lecture des images du dossier intImages = 0 intDoublons = 0 strFichier = Dir(strDossier & strExtension, vbNormal) While strFichier <> "" ' Vérifier que l'image n'a pas déjà été référencée rst.FindFirst "[Nom Fichier] = '" & Replace(strFichier, "'", "''") _ & "' AND [Dossier] = '" & Replace(strDossier, "'", "''") & "'" If rst.NoMatch Then ' Ajouter l'image dans la table rst.AddNew rst("Nom Image") = FilenameWithoutExt(strFichier) rst("Nom Fichier") = strFichier rst("Dossier") = strDossier rst.Update intImages = intImages + 1 Else ' L'image existe déjà, on décompte un doublon intDoublons = intDoublons + 1 End If ' On passe au fichier suivant strFichier = Dir Wend ' On ferme ! rst.Close Set rst = Nothing MsgBox "Opération terminée !" _ & vbCrLf & intImages & " image(s) ajoutée(s)" _ & vbCrLf & intDoublons & " doublon(s) ignoré(s)", _ vbInformation End Sub |