Pouvoir enregistrer une image à un nom spécifique
Bonjour,
J'essaye d'automatiser le fait d'enregistrer une image qui se trouve dans une cellule avec un nom qui se trouve dans une autre cellule sur la même ligne, sauf que je ne parviens pas à le faire, je me retrouve à le faire manuellement et c'est pénible.
Auriez-vous une idée de comment je pourrai:
- automatiser l'enregistrement en indiquant à excel quelle colonne prendre pour l'image et quelle colonne prendre pour le nom
- garder les dimensions réelles de l'image (que ça ne la rende pas plus petite)
J'ai mis ci-joint un fichier exemple.
Merci d'avance!
J'ai trouvé une formule Excel mais qui ne fonctionne pas chez moi (l'auteur de cette formule l'a appelée "save picture from Excel") même en changeant le savepath, je ne comprends pas pourquoi. Cela enregistre une image qui n'est pas dans mon fichier, probablement car "Picture 1" n'existe pas. Il faudrait que j'arrive à modifier cela pour qu'il prenne la cellule de l'image et ensuite Il ne manquerait plus qu'à rajouter l'information du nom avec la cellule dédiée. C'est possible ou j'ai tout faux?
Sub SavePictureFromExcel()
Dim myPic As Shape
Dim tempChartObj As ChartObject
Dim savePath As String
Set myPic = ActiveSheet.Shapes("Picture 1")
Set tempChartObj = ActiveSheet.ChartObjects.Add(0, 0, myPic.Width, myPic.Height)
savePath = "C:\Users\marks\Downloads\mySavedPic.jpg"
'Copy picture into chart, then export chart
myPic.Copy
tempChartObj.Chart.ChartArea.Select
tempChartObj.Chart.Paste
tempChartObj.Chart.Export savePath
tempChartObj.Delete
End SubBonsoir,
une adaptation d'un code que j'ai intégrer dans mon jeu de QCM USF suite à une demande :
Sub LouReeD()
Dim ligne, Sh As Object, ShWay
ligne = 2
With ActiveSheet
Do
If .Cells(ligne, 1).Value = "" Then Exit Do
For Each Sh In .Shapes
If Not Intersect(.Cells(ligne, 2), Sh.TopLeftCell) Is Nothing Then
Sh.Copy
With Sh.Parent.ChartObjects.Add(0, 0, Sh.Width, Sh.Height).Chart
While .Shapes.Count = 0
DoEvents
.Paste
Wend
ShWay = ActiveWorkbook.Path & "\" & ActiveSheet.Cells(ligne, 1).Value & ".jpg"
.Export ShWay, "PNG"
.Parent.Delete
End With
Exit For
End If
Next
ligne = ligne + 1
Loop
End With
End SubIci les images sont crées dans le dossier du classeur.
@ bientôt
LouReeD
Merci beaucoup cela fonctionne!
Par contre si l'image est dans une petite cellule cela l'enregistre en tout petit, est-il possible de modifier cela ou bien comme c'est la taille de l'image dans excel il faut faire avec?
Il faut alors (peut-être) faire des tests avant ceci :
With Sh.Parent.ChartObjects.Add(0, 0, Sh.Width, Sh.Height).Chart
afin de modifier des valeurs trop petites et voir ce que cela donne, par exemple :
If Sh.Width < 10 then Sh.Width = 150
@ bientôt
LouReeD
Le code :
Sub LouReeD()
Dim Ligne, Sh As Object, ShWay, Largeur
Application.ScreenUpdating = False
Ligne = 2
With ActiveSheet
Do
If .Cells(Ligne, 1).Value = "" Then Exit Do
For Each Sh In .Shapes
If Not Intersect(.Cells(Ligne, 2), Sh.TopLeftCell) Is Nothing Then
If Sh.Width < 500 Then
Largeur = Sh.Width
Sh.Width = 600
End If
Sh.Copy
With Sh.Parent.ChartObjects.Add(0, 0, Sh.Width, Sh.Height).Chart
While .Shapes.Count = 0
DoEvents
.Paste
Wend
ShWay = ActiveWorkbook.Path & "\" & ActiveSheet.Cells(Ligne, 1).Value & ".Png"
.Export ShWay, "PNG"
.Parent.Delete
End With
Sh.Width = Largeur
Exit For
End If
Next
Ligne = Ligne + 1
Loop
End With
End Sub@ bientôt
LouReeD
Merci! Est-il facile de transformer ta formule dans un bouton qui me donne la possibilité d'indiquer la colonne pour l'image et pour le nom?
Bonsoir,
ce n'est pas compliqué, on ajoute deux variables et deux InputBox et voilà le code :
Sub LouReeD()
Dim Ligne, Sh As Object, ShWay, Largeur, Réponse, ColonneI, ColonneN
Réponse = InputBox("Veuillez indiquer la colonne du nom des images", "Désignation de la colonne pour le nom")
ColonneN = Asc(UCase(Réponse)) - 64
Réponse = InputBox("Veuillez indiquer la colonne des images", "Désignation de la colonne pour l'image")
ColonneI = Asc(UCase(Réponse)) - 64
' un petit test de cohérence mais il en faudrait d'autre...
If ColonneI = ColonneN Then MsgBox ("Ces colonnes ne peuvent être identiques..."): End
Application.ScreenUpdating = False
Ligne = 2
With ActiveSheet
Do
If .Cells(Ligne, ColonneN).Value = "" Then Exit Do
For Each Sh In .Shapes
If Not Intersect(.Cells(Ligne, ColonneI), Sh.TopLeftCell) Is Nothing Then
If Sh.Width < 500 Then
Largeur = Sh.Width
Sh.Width = 600
End If
Sh.Copy
With Sh.Parent.ChartObjects.Add(0, 0, Sh.Width, Sh.Height).Chart
While .Shapes.Count = 0
DoEvents
.Paste
Wend
ShWay = ActiveWorkbook.Path & "\" & ActiveSheet.Cells(Ligne, ColonneN).Value & ".Png"
.Export ShWay, "PNG"
.Parent.Delete
End With
Sh.Width = Largeur
Exit For
End If
Next
Ligne = Ligne + 1
Loop
End With
End Sub@ bientôt
LouReeD
Merci beaucoup !! Cependant, une erreur survient lorsque le script se lance après qu'une ou deux images aient été enregistrées:
Cela enregistre pourtant bien les premières images dans le dossier où se trouve le fichier Excel, qu'est-ce qui provoque l'erreur?
Edit: je constate des modifications dans le fichier (des noms d'images qui viennent s'inscrire sous certaines images, des images qui deviennent grandes dans le fichier), serait-ce dû au fait qu'un filtre est appliqué?
Pour le filtre peut-être ! Il faut tout donner comme info dès le départ !
Ensuite, dès qu'il y a une erreur, un shape "blanc" peu rester sur la feuille et du coup si on relance le code cela provoque l'erreur indiquée. Il faut que le fichier soit "propre" avant le fonctionnement.
Je regarde ce que je peux faire.
@ bientôt
LouReeD
Un nouvel essai pour prendre en compte que les lignes peuvent être masquées :
Sub LouReeD()
Dim Ligne, Sh As Object, ShWay, Largeur, Réponse, ColonneI, ColonneN
Réponse = InputBox("Veuillez indiquer la colonne du nom de ces images", "Désignation de la colonne pour le nom")
ColonneN = Asc(UCase(Réponse)) - 64
Réponse = InputBox("Veuillez indiquer la colonne des images", "Désignation de la colonne pour l'image")
ColonneI = Asc(UCase(Réponse)) - 64
' un petit test de cohérence mais il en faudrait d'autre...
If ColonneI = ColonneN Then MsgBox ("Ces colonnes ne peuvent être identiques..."): End
Application.ScreenUpdating = False
Ligne = 2
With ActiveSheet
Do
If .Cells(Ligne, ColonneN).Value = "" Then Exit Do
If .Cells(Ligne, ColonneN).EntireRow.Hidden = False Then
For Each Sh In .Shapes
If Not Intersect(.Cells(Ligne, ColonneI), Sh.TopLeftCell) Is Nothing Then
If Sh.Width < 500 Then
Largeur = Sh.Width
Sh.Width = 600
End If
Sh.Copy
With Sh.Parent.ChartObjects.Add(0, 0, Sh.Width, Sh.Height).Chart
While .Shapes.Count = 0
DoEvents
.Paste
Wend
ShWay = ActiveWorkbook.Path & "\" & ActiveSheet.Cells(Ligne, ColonneN).Value & ".Png"
.Export ShWay, "PNG"
.Parent.Delete
End With
Sh.Width = Largeur
Exit For
End If
Next
End If
Ligne = Ligne + 1
Loop
End With
End SubJ'ai juste ajouté une condition "EntireRow.Hidden = Flase", comme quoi la ligne doit être visible pour que le code soit exécuté.
@ bientôt
LouReeD
Désolé je ne pensais pas que l'information du filtre était importante haha.. Désormais tout fonctionne correctement, merci beaucoup!
Merci pour vos remerciements !
@ bientôt
LouReeD