Script pour associer des noms de fichiers images à des références
Bonjour,
Dans un fichier Excel, j'ai des références identifiées par un nombre (environ 39 000 à l'heure actuelle) auxquelles sont associées des données textuelles réparties dans une quinzaine de colonnes; chaque référence étant placée sur une ligne.
Dans un autre onglet du même fichier, j'ai une liste de noms de fichiers images (extension en .jpg) qui doivent être associés aux références du premier onglet. Le nom du fichier correspond à la référence (donc un nombre) + l'extension (.jpg).
Je joins un fichier d'exemple pour que ce soit plus clair.
On m'a fourni un script qui permet d'aller placer chaque nom de fichier image dans une colonne spécifique de la ligne correspondant à la référence à laquelle le fichier image est associé; dans cet exemple, il s'agit de la colonne S du premier onglet.
Sub PlacerImagesDansColonne()
Dim wb As Workbook
Set wb = ThisWorkbook ' Change this to refer to your workbook if needed
Dim imgWs As Worksheet
Set imgWs = wb.Sheets("Sheet2") ' Change the sheet name as required
Dim dataWs As Worksheet
Set dataWs = wb.Sheets("Sheet1") ' Change the sheet name as required
Dim lastRowImg As Long
lastRowImg = imgWs.Cells(imgWs.Rows.Count, "A").End(xlUp).Row ' Get the last row with data in column A of Images worksheet
Dim lastRowData As Long
lastRowData = dataWs.Cells(dataWs.Rows.Count, "A").End(xlUp).Row ' Get the last row with data in column A of Data worksheet
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary") ' Use Scripting Dictionary object to store unique references
Dim i As Long, j As Long, fileName As String
For i = 2 To lastRowImg ' Loop through each row in the Images worksheet starting from row 2
fileName = Trim(imgWs.Cells(i, 1).Value) ' Get the file name including extension
If Not dict.Exists(fileName) And _
fileName <> "" And _
IsNumeric(Left(fileName, InStrRev(fileName, ".") - 1)) Then ' Ensure it has a valid format
For j = 2 To lastRowData ' Loop through each row in the Data worksheet starting from row 2
If dataWs.Cells(j, 1).Value Like "*" & Left(fileName, Len(fileName) - 4) & "*" Then ' Check if reference number matches filename without extension
If dict.Count < 65000 Then ' Prevent adding more than ~65k entries due to dictionary limitation
dict.Add Left(fileName, InStrRev(fileName, ".") - 1), Nothing ' Add reference to the dictionary
dataWs.Cells(j, 19).Value = fileName ' Put the filename into column S (column index is 19 here)
Exit For ' Stop searching once found and proceed to next iteration in outer loop
Else
MsgBox "The limit of distinct references (" & dict.Count & ") has been reached.", vbInformation, "Limit Reached!"
Exit For ' Stop processing when reaching maximum supported entries in the dictionary
end if
End If
Next j
End If
Next i
End Sub
J'aimerais affiner le script sur deux points:
1/ Certains noms d'images possèdent, après le nombre correspondant à la référence, une lettre (a, b, c): par exemple, 8203a.jpg. Il faudrait que ces noms d'images soient également traités par le script (dans mon exemple, 8203.jpg associé à la référence 8203). Pour l'instant, lorsqu'il y a une lettre après le nombre, le script ignore ces noms d'images.
I2/ Il y a parfois plusieurs images associées à une même référence, et dans ce cas à partir de la seconde image, j'ajoute le suffixe -1, -2, etc.
Par exemple:
10457.jpg et 10457-1.jpg
J'aimerais que les autres images (par exemple 10457-1.jpg) soient placées par le script dans les colonnes suivantes (10457-1.jpg dans la colonne T, 10457-2.jpg dans la colonne U, etc. tant qu'il y a des images associées à la même référence).
Merci d'avance pour votre aide!