IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Insérer des images en VBA : OK. Mais comment les enregistrer avec le document ?


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé

    Homme Profil pro
    Responsable SI
    Inscrit en
    Mars 2004
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Responsable SI

    Informations forums :
    Inscription : Mars 2004
    Messages : 187
    Par défaut Insérer des images en VBA : OK. Mais comment les enregistrer avec le document ?
    Bonjour

    Je suis confronté à un problème "basique" (me semble-t-il) mais auquel je ne trouve néanmoins pas de solution.

    On m'a demandé de générer automatiquement des vignettes de produits depuis des références fournisseur dans un fichier Excel destiné à un client (devis). Jusque là OK.

    J'ai donc codé une petite macro toute bête qui balaye la référence et va rechercher le fichier image pour le coller via InsertPicture (je ne vous remets pas le code, je l'ai trouvé ici même)

    Les images s'insèrent parfaitement, mais... lorsque je sauvegarde le document, elles ne sont pas sauvegardées DANS le document (en d'autres termes mon fichier XLSX pèse 23 Ko...)

    Quelle est donc l'astuce pour programmatiquement insérer des images dans mon fichier Excel, et les intégrer dans ce fichier ?

    Merci

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour,

    déjà en l'effectuant manuellement, juste en consultant les options, les p'tites cases à cocher, avant de valider !
    Une fois l'opération manuelle fonctionnelle, il suffit d'activer au préalable l'Enregistreur de macro puis de
    réitérer l'opération :  une base de code est livrée sur un plateau !     (cf règles du forum …)

    ___________________________________________________________________________________________________________________________
    Je suis Paris, Egypte, Nigeria, New-York, Mogadicio, Barcelone, London, Manchester, Stockholm, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

  3. #3
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Il te suffit de mettre chacune de ces images dans la propriété picture d'un contrôle image (activex).
    Ces contrôles et leur contenu feront dès lors partie intégrantes de ton classeur.

    Ceci étant dit : j'espère que le nombre de ces images n'est pas important. Dans le cas contraire, il est très maladroit d'alourdir ainsi un classeur et mille fois préférable de ne charger les images que lorsque nécessaire depuis des fichiers dans un répertoire relatif ad hoc et distribué avec le classeur.
    Cet aspect a été traité de manière récurrente sur ce forum.

  4. #4
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Par défaut
    Citation Envoyé par cedric_g Voir le message
    je ne vous remets pas le code, je l'ai trouvé ici même
    Bonjour,

    Ici même, dans cette discussion, il n'y a aucun code.
    Ici même, dans ce forum, il y a des millions de lignes de code ...
    Et, vu ce que tu expliques, ça vient très très probablement de ton code !

  5. #5
    Membre confirmé

    Homme Profil pro
    Responsable SI
    Inscrit en
    Mars 2004
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Responsable SI

    Informations forums :
    Inscription : Mars 2004
    Messages : 187
    Par défaut
    Rebonjour

    Finalement je pense avoir trouvé la solution (pas encore testé) : il faut utiliser Pictures.Insert en lieu et place de InsertPicture

    Je teste et je valide.

  6. #6
    Membre confirmé

    Homme Profil pro
    Responsable SI
    Inscrit en
    Mars 2004
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Responsable SI

    Informations forums :
    Inscription : Mars 2004
    Messages : 187
    Par défaut Fausse joie...
    Bonsoir

    Fausse joie : cela ne fonctionne toujours pas !

    Quand j'insère une image via le menu Insertion et que j'enregistre mon fichier, elle est bien intégrée dans ce dernier. Je génère une macro à partir de la MÊME manipulation, je la lance, ça ne fonctionne plus

    Voici le code de ma macro (les noms des images sont en colonne A) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    Sub Picture()
     
        Dim picname As String
        Dim lThisRow As Long
     
        Application.ScreenUpdating = False
        On Error Resume Next
     
        lThisRow = 3
     
        Do While (lThisRow < 132)
     
            Cells(lThisRow, 10).Select 
     
             picname = Cells(lThisRow, 1) 
     
            ActiveSheet.Pictures.Insert("E:\Photos\" & picname & ".jpg").Select
     
            With Selection
                .Left = Cells(lThisRow, 10).Left
                .Top = Cells(lThisRow, 10).Top
     
                .ShapeRange.LockAspectRatio = msoTrue
                .ShapeRange.Height = Cells(lThisRow, 10).Height
            End With
     
            lThisRow = lThisRow + 1
     
        Loop
     
        Range("A3").Select
        Application.ScreenUpdating = True
     
    End Sub
    Rien de transcendant (en enregistrant la macro il me génère la ligne "Activesheet.Pictures.Insert...")

    Lorsque j'enregistre le fichier, les images ne sont pas intégrées dans ce dernier, et du coup si je transferts mon fichier sur un autre poste, les images ne sont plus visibles (il crée en réalité un lien vers le fichier image original...)

    J'ai eu beau chercher dans les options, je ne vois pas ce qui peut faire que ça ne fonctionne pas !

  7. #7
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Seuls sont conservés dans ton classeurs les objets qui y sont insérés en mode création. Idem en ce qui concerne leur contenu.

    Relis maintenant ce que j'ai ajouté hier à mon message de 15 h 53.
    Il t'est toujours possible, par exemple et entre autres, de mettre dans ton classeur (dans des cellules, par exemple) les chemins de tes images. Ce contenu (ces chemins, donc) resteront en mémoire après sauvegarde.
    Rien ne sera alors plus facile que d'utiliser ces chemins pour définir tes images.
    Et ton classeur s'en trouvera allégé et Excel t'en sera reconnaissant.

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonsoir je ne vois pas qui ne fonctionne pas avec une picture et non un activx
    il te faut seulement sauver le classeur apres avoir mis ton image ou a la fin de l'utilsation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub test()
     ActiveSheet.Pictures.Insert ("C:\Users\Public\Pictures\Sample Pictures\Penguins.jpg")
    ThisWorkbook.Save
    End Sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  9. #9
    Membre confirmé

    Homme Profil pro
    Responsable SI
    Inscrit en
    Mars 2004
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Responsable SI

    Informations forums :
    Inscription : Mars 2004
    Messages : 187
    Par défaut
    Citation Envoyé par unparia Voir le message
    Seuls sont conservés dans ton classeurs les objets qui y sont insérés en mode création. Idem en ce qui concerne leur contenu.

    Relis maintenant ce que j'ai ajouté hier à mon message de 15 h 53.
    Il t'est toujours possible, par exemple et entre autres, de mettre dans ton classeur (dans des cellules, par exemple) les chemins de tes images. Ce contenu (ces chemins, donc) resteront en mémoire après sauvegarde.
    Rien ne sera alors plus facile que d'utiliser ces chemins pour définir tes images.
    Et ton classeur s'en trouvera allégé et Excel t'en sera reconnaissant.
    Le soucis est que le document est destiné à être envoyé à un client (c'est une mercuriale... Une liste de tarifs quoi ; il ne comporte que quelques dizaines de lignes, et ils exigent absolument les images des produits)

    C'est un document très courant en commerce lorsque l'on travaille avec des grands comptes (chaînes de magasins ou d'enseignes par exemple)

    Usuellement je génère un PDF via une application de mon cru (VB.Net / SQL Server / DevExpress) mais là il s'agit d'un coup de pouce pour l'un de nos clients revendeur... qui n'a pas de dév. dans son entreprise ;-)


    ThisWorkBook.Save dans le code n'enregistre pas plus les images...

  10. #10
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Quoi ? Tu envoies un classeur, à ton client ?
    Lis ce que dit ma signature. Si, étant ton client, tu m'envoyais un classeur, je t'abandonnerais-là tout net et- sans la moindre explication.

    Par ailleurs : Tu es rémunéré par Microsoft, toi, pour tenter d'imposer l'acquisition de ses produits ?
    Remarque que la question inverse trouverait également sa place : ton client serait-il rémunéré par Microsoft pour tenter de t'imposer l'utilisation de l'un de ses produits ?

    Je crois rêver, des fois ...

  11. #11
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Citation Envoyé par cedric_g Voir le message
    ThisWorkBook.Save dans le code n'enregistre pas plus les images...
    Aucun rapport !     Lire le post #2 …

  12. #12
    Membre confirmé

    Homme Profil pro
    Responsable SI
    Inscrit en
    Mars 2004
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Responsable SI

    Informations forums :
    Inscription : Mars 2004
    Messages : 187
    Par défaut
    @unparia : c'est une réponse à un appel d'offre, ils EXIGENT un fichier EXCEL avec les images des produits ! Excel étant un format quasi standard dans le monde professionnel (22 ans d'expérience, 22 ans qu'on me balance ou on me demande des fichiers Excel... Et j'ai bossé dans différents domaines : centre de gestion, commerce de gros et de détail, web, etc.) ; le fait d'intégrer des images dans un fichier Excel est une hérésie pour moi (je peste fortement quand un fournisseur me balance un tel fichier), mais là c'est ce que l'on me demande.

    Bref, pas la peine de s'emporter. D'ailleurs avant d'envoyer le fichier je vire les macros (réenregistrement au format xlsx)

    Sinon je viens de trouver la solution, que je vous livre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    Sub Picture()
     
        Dim picname As String
        Dim lThisRow As Long
     
        On Error Resume Next
     
        lThisRow = 3
     
        Do While (lThisRow < 132)
     
            Cells(lThisRow, 10).Select
     
            picname = "E:\Photos\" & Cells(lThisRow, 1) & ".jpg"
     
            If Dir(picname) <> "" Then
     
                'On calcule l'aspect ratio car AddPicture ne permet pas de définir ce dernier facilement
                Dim P As StdPicture
                Set P = LoadPicture(picname)
     
                'Ajout d'un shape
                Call ActiveSheet.Shapes.AddPicture(picname, False, True, _
                    Cells(lThisRow, 10).Left, Cells(lThisRow, 10).Top, _
                    Cells(lThisRow, 10).Height * P.Width / P.Height, Cells(lThisRow, 10).Height)
     
            End If
     
            lThisRow = lThisRow + 1
     
        Loop
     
        Range("A3").Select
     
    End Sub
    La solution tient au fait que les objets Shape ont une propriété permettant de stipuler qu'on les sauvegarde avec le document, pas les objets Picture...

    That's all folks !

  13. #13
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    ils EXIGENT un fichier EXCEL
    C'est bien ce que je disais.
    Et ce n'est pas contre TOI, que je m'emporte.

  14. #14
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par Marc-L Voir le message
    Aucun rapport !     Lire le post #2 …
    marcL si ca les gardes j'ai testé
    j'en enregistré le fichier et réouvert et lancer la dub puis fermé quand je reouvre le fichier l'image est toujours la
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub test()
     ActiveSheet.Pictures.Insert ("C:\Users\Public\Pictures\Sample Pictures\Penguins.jpg")
    ThisWorkbook.Save
    End Sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  15. #15
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    T'inquiètes moi aussi et je le pratique depuis bien plus de 10 ans !
    Mais vu ses assertions et comme il n'a pas daigné indiquer sa version dans le préfixe de cette discussion
    (on n'est pas devin, hein !), je lui ai donc demandé de l'effectuer manuellement et une fois Ok
    réitérer via l'Enregistreur de macro, manipulation à la portée de n'importe quel grand débutant !

  16. #16
    Membre confirmé

    Homme Profil pro
    Responsable SI
    Inscrit en
    Mars 2004
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Responsable SI

    Informations forums :
    Inscription : Mars 2004
    Messages : 187
    Par défaut
    Effectivement j'avais omis la version d'Excel dans le titre de mon fil : il s'agissait d'Excel 2016. Mea culpa.

    J'avais effectivement réalisé un enregistrement via macro avant, ce que je n'ai pas précisé (l'éditeur VBA dans Office étant encore "préhistorique", et très éloigné d'un Visual Studio, j'ai souvent l'habitude de procéder de la sorte... Je code rarement en VBA en fait)

    Je serai plus précis lors de ma prochaine intervention.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/02/2017, 08h19
  2. comment insérer des images dans un formulaire
    Par Fusain dans le forum IHM
    Réponses: 1
    Dernier message: 08/06/2007, 17h38
  3. [VBA-W]Insérer des images du web/du réseau
    Par wizdom dans le forum VBA Word
    Réponses: 1
    Dernier message: 22/04/2007, 15h56
  4. [VBA-WORD] je voudrais insérer des images automatiquement.
    Par SharkAngel dans le forum VBA Word
    Réponses: 1
    Dernier message: 21/09/2006, 11h24
  5. [VBA-PP] macro pour insérer des images dans PowerPoint
    Par mashpro dans le forum VBA PowerPoint
    Réponses: 4
    Dernier message: 01/08/2006, 22h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo