XL 2016 Export d'images + renommer celles-ci !

  • Initiateur de la discussion Initiateur de la discussion fougeron
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

fougeron

XLDnaute Nouveau
Bonjour à tous,

Je suis novice en Excel et j'essaie de trouver mon bonheur pour réussir à trouver une solution à mon problème. J'ai un fichier avec en colonne A des noms et en colonne B des images (photos) qui correspondent aux noms de la colonne A. J'essaie de faire un export des images qui seraient nommées par le nom qui correspond à chaque image en colonne A.

J'ai trouvé des macros sur ce forum qui arrivent à me faire un export et à renommer mais chaque images est vierge (blanche) ! Donc, ça ne fonctionne pas. En cherchant sur internet j'ai trouvé cette macro !

Sub ExtractionImagesFeuille()
Dim Pict As Picture
Dim Nb As Byte
Dim ChartObj As ChartObject

For Each Pict In ActiveSheet.Pictures
Pict.CopyPicture 'copie l'image
Set ChartObj = ActiveSheet.ChartObjects.Add(0, 0, Pict.Width, Pict.Height)
ChartObj.Activate
ChartObj.Chart.Paste 'colle l'image dans un graphique temporaire
ChartObj.Chart.Export "C:\Users\m.fougeron\downloads\" & Pict.Name & ".jpg", "jpg" 'Sauvegarde au format image, dans le même répertoire que ce classeur.
Nb = ActiveSheet.ChartObjects.Count
ActiveSheet.ChartObjects(Nb).Delete 'Supprime le graphique
Next Pict

End Sub

Elle fonctionne parfaitement ! Elle me fait un export des photos. Par contre j'ai de modifier ça pour que cette Macro me renomme les photos avec les noms de la colonne A mais je n'y arrive pas... Je commence à désespérer !

De plus, cette macro exporte les photos par rapport à leurs tailles dans le fichier excel ! est-il possible d'avoir un export à la taille réelle de l'image avant l'intégration dans excel ?

Je vous joins un exemple en pièce jointe ! La macro est déjà intégrée dedans.

Si à tout hasard l'un de vous peut m'expliquer comment faire, ce serait top.

Merci à vous d'avoir pris le temps de me lire.
 

Pièces jointes

pour info
une methode pour connaitre les dim d'une image
VB:
Sub testx()
    dimensions = dimention_image("H:\fond d'ecran\paysages\paysage3.jpg")
Debug.Print Join(dimensions, "X")
End Sub
Function dimention_image(chemin)
    Dim Img As Object
    With CreateObject("WIA.ImageFile"): .LoadFile chemin: dimention_image = Array(.Width, .Height): End With
End Function
 
Re

On ne peut pas obliger nos petits camarades de jeu à se rappeler qu'à la base Excel est un tableur.
Et qu'il existe moult logiciels pour gérer/traiter les images.

Personnellement, je n'ai jamais eu l'occasion de faire défiler 1938 images et de lire leur noms dans des cellules Excel, dans le cadre d'un boulot. 😉
Ca doit prendre un sacré bout de temps. 😉
 
Bonsoir lolostaps

[Pour infos]
L'usage c'est de créer sa propre discussion pour y poser sa question
C'est que tu as fait 😉
Et si les réponses tardent à venir, il faut faire ce qu'on appelle "un up"
(C'est à dire, se répondre à soi même dans sa discussion pour que celle-ci se ré-affiche en haut de la liste)
[/Pour infos]

NB: Poster sa question dans le fil d'un autre rend la lecture du fil moins fluide
(On sait plus qui a posé la question initiale et on ne sait plus à qui on réponds)
 
Bonjour @patricktoulon et à tous,

Après plusieurs tests sur des PNG sur Feuille Excel (Plus de 500) sur une feuille a exporter, voici une solution fiable que j'ai validée et que je souhaite partager pour éviter les images blanches lors de l'exportation de graphiques ou d'images dans Excel. Cette astuce repose sur l'utilisation de certaines commandes spécifiques en VBA. Voici les points essentiels :

L'astuce clé :​

Entre ces deux lignes, activer le graphique temporaire est indispensable pour coller l'image correctement sans obtenir de PNG blanc : à Partir d'Office 2016

' Copier la forme sous forme d'image (bitmap)
shp.CopyPicture Appearance:=xlScreen, Format:=xlPicture

' Astuce : rendre le graphique actif
TempChart.Parent.Activate ' Évite les erreurs d'image blanche


' Coller l'image dans le graphique
TempChart.Paste

Commandes essentielles pour fiabiliser l'exécution :​

  1. Vider le presse-papier entre chaque copie pour assurer la disponibilité des données dans le clipboard :
    With CreateObject("htmlfile").parentwindow.clipboardData.clearData("Text"): End With
  2. Introduire une petite pause et permettre à Excel de traiter les événements en arrière-plan :
    Sleep (250) ' Pause de 0.25 secondes
    DoEvents ' Laisse Excel traiter les autres événements

Résultat :

Avec cette méthode, aucune image blanche n'est générée, même avec un volume important de traitements. L'activation explicite du graphique temporaire et l'utilisation de ces commandes permettent une exportation fiable.

re
pour l'export avec un chart on en a rien fout'tt que ce soit des png,tiff,gif,jpget même des wmf
du moment que tu fait un copypicture et non un simple copy
maintenant on est sur un autre problème avec les VERSIONS SUP A 2007
et j'ai répondu sur un autre forum
ICI
EN effet il y a une latence plus importance pour que le clipboard digère les informations
ce qui fait que soit tu a des images blanches soit carrément un plantage
j'ai bien quelques piste au sujet de ce petit bug mais c'est pas bien précis faut dire que microsoft ne m'a pas aidé sur ce point
bref bonne lecture 😉

VB:
'Solution : Explication ci-dessous
'   * Sélectionner dynamiquement le dossier de sauvegarde des PNG (Jpg et ou autres)
'   * Verifie si il s'agit d'un Png dans la feuille Excel
'   * Vide l'espace papier
'   * Crée un graphique chart (vide)
'   * Copie chaques PNG dans l'espace papier
'   * fait une pause de 250 milisecondes
'   * laisse excel traité les autres évenements.
'   * CharObj.Activate (Soit "TempChart.Parent.Activate") : Obligatoire aprés les version Excel 2013 pour Evite l'Export PNG Blanc(2016 --->>> Office 365)
'   * Exporter l'image dans le graphique qui contiendra le PNG
'   * Supprimer le graphique temporaire
Option Explicit
'
'  Code complet pour la compatibilité VBA7 et non-VBA7 :
#If VBA7 Then
    Private Declare PtrSafe Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Integer) As Long
    Private Declare PtrSafe Sub Sleep Lib "Kernel32" (ByVal dwMilliseconds As Long)
#Else
    Private Declare Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Integer) As Long
    Private Declare Sub Sleep Lib "Kernel32" (ByVal dwMilliseconds As Long)
#End If
'
Sub ExporterImagesChoixDossier()
    Dim ws As Worksheet
    Dim shp As Shape
    Dim ImgCounter As Integer
    Dim FolderPath As String
    Dim imgName As String
    Dim CharObj As ChartObject
    Dim TempChart As Chart
    Dim objShell As Object
    Dim hPicAvail As Long
'
    ' Affiche une boîte de dialogue pour choisir un dossier
        Set objShell = CreateObject("Shell.Application")
            FolderPath = objShell.BrowseForFolder(0, "Sélectionnez le dossier où enregistrer les images", 0).Self.Path
'
    ' Si aucun dossier sélectionné, on quitte
        If FolderPath = "" Then
            MsgBox "Le dossier spécifié n'existe pas: L'exportation est annulée. " & FolderPath, vbExclamation
            Exit Sub
        End If
'
    ' Ajoute un séparateur de chemin si nécessaire
        If Right(FolderPath, 1) <> "\" Then FolderPath = FolderPath & "\"
'
    ' Référence à la feuille active
        Set ws = ActiveSheet
'   
    ' Initialiser le compteur d'images
        ImgCounter = 1
'
    ' Parcourt toutes les formes de la feuille active
        For Each shp In ws.Shapes
            ' Vérifie si la forme est une image
                If shp.Type = msoPicture Or shp.Type = msoLinkedPicture Then
                '
                ' Vider le presse papier : On vide le clipboard entre chaque copie pour tester vraiment le available
                    With CreateObject("htmlfile").parentwindow.clipboardData.clearData("Text"): End With
                '
                ' Ajouter un graphique temporaire
                    Set CharObj = ws.ChartObjects.Add(Left:=0, Width:=shp.Width, Top:=0, Height:=shp.Height)
                    Set TempChart = CharObj.Chart
                '
                '   Vérifiez que shp.Type renvoie 13 ou 11.
                '   msoLinkedPicture = 11 (Image liée)
                '   msoPicture = 13 (Image insérée)
                '   Les autres types (ex. msoTextBox, msoShape) ne sont pas compatibles.
                '   Debug.Print shp.Type
                '
                ' Copier la forme sous forme d'image (bitmap)
                    shp.CopyPicture Appearance:=xlScreen, Format:=xlPicture
                '
                ' Coller l'image dans le graphique
                    Sleep (250) 'Pause 0.5 secondes
                    DoEvents ' laisse excel traité les autres évenements.
                    TempChart.Parent.Activate ' Countournement Stop = ' <<< point d'arrêt ( touche F9 )
                    TempChart.Paste ' <<< Point d'arrêt (touche F9) sur cette ligne après Office 2013 /
                '                     (Jusqu'à Office 2013 = Pas besoin de faire un point d'arrêt manuel soit pas d'image blanche)
                '                     (Mais après Office 2013 --> vers Office 365 et versions ultérieures = Image blanche si TempChart.Parent.Activate
                '                      n'est pas défini au préalable "Cf ligne du dessus")                '
                ' Construire le nom du fichier
                    imgName = FolderPath & "Image_" & ImgCounter & ".png"
                '
                ' Chemin
                    'Debug.Print FolderPath & imgName
                '
                ' Exporter l'image du graphique
                    On Error Resume Next
                        TempChart.Export Filename:=imgName, FilterName:="PNG" ' préparation pour le fichier joint attachement
                            If Err.Number = 0 Then
                                ImgCounter = ImgCounter + 1 ' Augmenter le compteur si l'export a réussi
                            Else
                                MsgBox "Erreur lors de l'exportation de l'image : " & Err.Description, vbExclamation
                            End If
                    On Error GoTo 0
                '
                ' Supprimer le graphique temporaire
                    CharObj.Delete
            End If
        Next shp
'   
    ' Message de confirmation
        If ImgCounter > 1 Then
            'MsgBox "Exportation terminée. " & (ImgCounter - 1) & " images exportées vers " & imgPathChoix, vbInformation
            MsgBox ImgCounter - 1 & " images ont été exportées dans " & FolderPath, vbInformation
        Else
            MsgBox "Aucune image n'a été exportée.", vbExclamation
        End If
End Sub

Ps : C'est l'équivalent de l'option dans le format d'image (les différents choix de compression d'image, mais par VBA) ?

ne pas oublier aussi le poids que peut engendrer 1938 images sur le fichier global

un passage moulinette WIA serait le bien venu me semble t-il

si le cœur lui en dis je donnerais volontiers la fonction de réduction de poids lors de l'importation (librairie WIA)

Cdt
Laurent
 
Dernière édition:
Notre forum d’entraide est 100 % gratuit et le restera.
Aucune formation payante, aucun fichier à acheter, rien à vendre. Mais comme tout site, nous devons couvrir nos frais pour continuer à vous accompagner.
Soutenez-nous en souscrivant à un compte membre : c’est rapide, vous choisissez simplement votre niveau de soutien et le tour est joué.

Je soutiens la communauté et j’accède à mon compte membre

Discussions similaires

Réponses
21
Affichages
7 K
Retour