XL 2019 Coller une image dans une UserForm

Marc Vanlindt

XLDnaute Nouveau
Bonjour à tous.
Dans ma feuille excel, j'ai une image que je voudrais copier dans ma Userform1.Image1.
Comment puis-je réaliser cela en VBA ?
Merci d'avance pour vos réponses.
Marc
 

Pièces jointes

  • CollerImageUSF.xlsm
    47.4 KB · Affichages: 10
Solution
Désolé. J'ai sans doute mal utilisé cjoint... Mais sur tu fais un click droit sur le le nom du ficher (juste après "Document joint :", tu choisis l'option "Enregistrer la cible du lien" et il sera télécharger.
oui j'ai vu après
mais comme j'ai bloqué certaines partie de ce menu j'ai du le remettre pour le faire
et après test ce fichier comme je te l'ai dis l'image a bien été extraite
avec mon code de base et tout mes autres méthodes fonctionnent aussi
ce code date d'il y a 7 ans il ne m'a jamais fait défaut
VB:
Sub extract_image_In_File()
    Dim OBJstream, BB() As Byte, b As Long, bytTemp(0 To 1) As Byte, tablo, by As Byte
    Dim filetoopen As Variant
     filetoopen = Application.GetOpenFilename("jpeg Files...

Marc Vanlindt

XLDnaute Nouveau
Bonjour Marc, Patrick,

J'ai eu la même approche avec ChatGPT, Bard et Aria. Les trois donnent du code ... que je ne suis pas arrivé à faire marcher. 😓
Par contre j'ai trouvé MP3Tag ( Lien ) . Petit utilitaire qui donne les tags et la pochette des MP3, et on peut charger la pochette.
... avec deux bémols bien sur :) :
1- Je ne suis pas arrivé à automatiser le chargement des pochettes, seulement une par une.
2- Les fichiers générés sont en png.
Mais on peut facilement les convertir en jpg.
Au cas où ça vous intéresse ...
Bonjour Sylvanu.
Je connais bien (et même très bien) Mp3Tag. C'est un logiciel surpuissant pour les tags et c'est avec lui que je mets à jours tous mes tags, y compris les pochettes) et j'exporte mes fichiers musicaux au format .csv pour les récupérer en Excel.
Pour les pochettes, il faut sélectionner l'ensemble des morceaux d'un même cd, coller ou charger le fichier image (click droit sur la zone image) et choisir l'option voulue.
Pour avoir le format jpg, click droit sur l'image, option "ajuster". Cela permet d'avoir réduire le volume si l'image est trop grand (et prend ainsi beaucoup de place au sein du mp3) et de choisir le format (de mémoire, c'est png, jpg ou bmp.
C'est un programme que j'utilise (presque) tous les jours.
Si tu as un besoin spécifique, n'hésite pas à me contacter.
Voici quelques liens pour des infos utiles :
 

patricktoulon

XLDnaute Barbatruc
Désolé. J'ai sans doute mal utilisé cjoint... Mais sur tu fais un click droit sur le le nom du ficher (juste après "Document joint :", tu choisis l'option "Enregistrer la cible du lien" et il sera télécharger.
oui j'ai vu après
mais comme j'ai bloqué certaines partie de ce menu j'ai du le remettre pour le faire
et après test ce fichier comme je te l'ai dis l'image a bien été extraite
avec mon code de base et tout mes autres méthodes fonctionnent aussi
ce code date d'il y a 7 ans il ne m'a jamais fait défaut
VB:
Sub extract_image_In_File()
    Dim OBJstream, BB() As Byte, b As Long, bytTemp(0 To 1) As Byte, tablo, by As Byte
    Dim filetoopen As Variant
     filetoopen = Application.GetOpenFilename("jpeg Files (*.jpg;*.mp3), *.jpg;*.mp3", 1, "ouvrir une image")
    If filetoopen = False Then Exit Sub
  
    Set OBJstream = CreateObject("ADODB.Stream")    'object utilisé ADODB stream
    OBJstream.Open: OBJstream.Type = 1    ' open with no arguments makes the stream an empty container
    OBJstream.LoadFromFile (filetoopen)    'on load le fichier dans l'object
    BB = OBJstream.Read()    ' on prend directement tout le paquet
    '**************************************
    ReDim tablo(UBound(BB))
    For i = 0 To UBound(BB): tablo(i) = BB(i): Next
    code = "255,216" & Split(Split(Join(tablo, ","), "255,216")(1), "255,217")(0) & "255,217"
   Debug.Print code
   tablo = Split(code, ",")
    jpegFile = FreeFile
    Open Environ("userprofile") & "\Desktop\imagetemp.jpg" For Binary Access Write Lock Write As jpegFile
    For i = 0 To UBound(tablo)
        If IsNumeric(tablo(i)) Then by = tablo(i): Put jpegFile, , by
    Next i
    Close jpegFile
End Sub
 

Marc Vanlindt

XLDnaute Nouveau
oui j'ai vu après
mais comme j'ai bloqué certaines partie de ce menu j'ai du le remettre pour le faire
et après test ce fichier comme je te l'ai dis l'image a bien été extraite
avec mon code de base et tout mes autres méthodes fonctionnent aussi
ce code date d'il y a 7 ans il ne m'a jamais fait défaut
VB:
Sub extract_image_In_File()
    Dim OBJstream, BB() As Byte, b As Long, bytTemp(0 To 1) As Byte, tablo, by As Byte
    Dim filetoopen As Variant
     filetoopen = Application.GetOpenFilename("jpeg Files (*.jpg;*.mp3), *.jpg;*.mp3", 1, "ouvrir une image")
    If filetoopen = False Then Exit Sub
 
    Set OBJstream = CreateObject("ADODB.Stream")    'object utilisé ADODB stream
    OBJstream.Open: OBJstream.Type = 1    ' open with no arguments makes the stream an empty container
    OBJstream.LoadFromFile (filetoopen)    'on load le fichier dans l'object
    BB = OBJstream.Read()    ' on prend directement tout le paquet
    '**************************************
    ReDim tablo(UBound(BB))
    For i = 0 To UBound(BB): tablo(i) = BB(i): Next
    code = "255,216" & Split(Split(Join(tablo, ","), "255,216")(1), "255,217")(0) & "255,217"
   Debug.Print code
   tablo = Split(code, ",")
    jpegFile = FreeFile
    Open Environ("userprofile") & "\Desktop\imagetemp.jpg" For Binary Access Write Lock Write As jpegFile
    For i = 0 To UBound(tablo)
        If IsNumeric(tablo(i)) Then by = tablo(i): Put jpegFile, , by
    Next i
    Close jpegFile
End Sub
Je crois savoir pourquoi. Un Mp3 permet d'avoir plusieurs images (Front Cover, Back cover, other...)
Dans le fichier "Optimisme" il y avait 3 images. Je les ai supprimées et remplacée par une seule image. J'ai essayé avec ton code et... ça marche !
 

patricktoulon

XLDnaute Barbatruc
du genre comme ça par exemple
VB:
Sub extractImageTest()
    Dim by As Byte, jpegFile&, TbL
    Dim filetoopen As Variant
    filetoopen = Application.GetOpenFilename("jpeg Files (*.jpg;*.mp3), *.jpg;*.mp3", 1, "ouvrir une image")
    If filetoopen = False Then Exit Sub
    TbL = GetBinaryArrayJpg_OnFile(filetoopen)
    If Not IsArray(TbL) Then MsgBox "Un problème dans l'extraction c'est produit": Exit Sub
    jpegFile = FreeFile
    Open Environ("userprofile") & "\Desktop\imagetemp.jpg" For Binary Access Write Lock Write As jpegFile
    For i = 0 To UBound(TbL)
        If IsNumeric(TbL(i)) Then by = TbL(i): Put jpegFile, , by
    Next i
    Close jpegFile

End Sub

'cette fonction récupère juste l'array de bits concernant le jpg
Function GetBinaryArrayJpg_OnFile(Fichier)
    Dim OBJstream, BB() As Byte, b As Long, tablo
    Set OBJstream = CreateObject("ADODB.Stream")
    OBJstream.Open: OBJstream.Type = 1
    OBJstream.LoadFromFile (Fichier)
    BB = OBJstream.Read()
    ReDim tablo(UBound(BB))
    For i = 0 To UBound(BB): tablo(i) = BB(i): Next
    code = "255,216" & Split(Split(Join(tablo, ","), "255,216")(1), "255,217")(0) & ",255,217"
    GetBinaryArrayJpg_OnFile = Split(code, ",")
End Function
 

Marc Vanlindt

XLDnaute Nouveau
du genre comme ça par exemple
VB:
Sub extractImageTest()
    Dim by As Byte, jpegFile&, TbL
    Dim filetoopen As Variant
    filetoopen = Application.GetOpenFilename("jpeg Files (*.jpg;*.mp3), *.jpg;*.mp3", 1, "ouvrir une image")
    If filetoopen = False Then Exit Sub
    TbL = GetBinaryArrayJpg_OnFile(filetoopen)
    If Not IsArray(TbL) Then MsgBox "Un problème dans l'extraction c'est produit": Exit Sub
    jpegFile = FreeFile
    Open Environ("userprofile") & "\Desktop\imagetemp.jpg" For Binary Access Write Lock Write As jpegFile
    For i = 0 To UBound(TbL)
        If IsNumeric(TbL(i)) Then by = TbL(i): Put jpegFile, , by
    Next i
    Close jpegFile

End Sub

'cette fonction récupère juste l'array de bits concernant le jpg
Function GetBinaryArrayJpg_OnFile(Fichier)
    Dim OBJstream, BB() As Byte, b As Long, tablo
    Set OBJstream = CreateObject("ADODB.Stream")
    OBJstream.Open: OBJstream.Type = 1
    OBJstream.LoadFromFile (Fichier)
    BB = OBJstream.Read()
    ReDim tablo(UBound(BB))
    For i = 0 To UBound(BB): tablo(i) = BB(i): Next
    code = "255,216" & Split(Split(Join(tablo, ","), "255,216")(1), "255,217")(0) & ",255,217"
    GetBinaryArrayJpg_OnFile = Split(code, ",")
End Function
Grâce à ton code, j'ai enfin ce que je voulais. Je travaille maintenant à intégrer tout ça à mon programme de gestion de MP3. Je pense que, demain dans la journée, ce sera fait.
Je l'ai déjà intégrer dans feuille test et ça marche parfaitement.
Je la joint en annexe. Il suffit maintenant de mettre le chemin complet dans la cellule K1 et cliquer sur le bouton. L'image s'affiche dans une userform.
Encore merci car, sans toi, je n'y serais jamais arrivé.
Bonne soirée.
Marc
 

Pièces jointes

  • Read-Image-Mp3.xlsm
    25.8 KB · Affichages: 2

Marc Vanlindt

XLDnaute Nouveau
je viens de passer je ne sais combien de temps sur chatgpt
je lui ai demander de faire mieux que moi plus ortodoxe bref
il m'en a sorti des trucs
rien qui fonctionne

and the winner is patricktoulon!!! 🤣 🤣
C'est exactement la même scénario que j'ai eu avec ChatGpt, des morceaux de code qui génèrent des erreur à n'en plus finir, des tentatives de corrections aussi lourdes les une que les autres mais qui jamais ne fonctionnent, etc.. Bon. Si on lui demande : X+X = 4 Que vaut X ? Il répondra correctement. (Voir image !)
Fortiche, hein ?:rolleyes::rolleyes::rolleyes:
Là-dessus, je vais me coucher.
Bonne nuit!
 

Pièces jointes

  • 2x.png
    2x.png
    13.5 KB · Affichages: 5

Discussions similaires

Réponses
14
Affichages
345

Membres actuellement en ligne

Statistiques des forums

Discussions
314 708
Messages
2 112 097
Membres
111 416
dernier inscrit
philipperoy83