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 :

Export sous forme d'image [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Essayez en "activant" le Chart :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    With Chart1
       .Paste
       .Activate
       .Export Chemin & NomImage, "jpg"
    End With
    ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    With Chart1
       .Activate
       .Paste
       .Export Chemin & NomImage, "jpg"
    End With
    Second essai : préciser les noms des paramètres nommés utilisés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    With Chart1
       .Paste
       .Activate
    End With
    ActiveChart.Export Filename:=Chemin & NomImage, FilterName:="jpg"

  2. #2
    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
    Citation Envoyé par Pierre Fauconnier Voir le message
    Patrick,

    La solution demandée n'est pas de savoir ce qu'il y a dans le clipboard (on s'en fout, en fait), la solution demandée est d'obtenir un fichier image qui est la représentation fidèle de la plage souhaitée.

    Tout test qui n'aboutirait pas à ce résultat est invalide. Par contre, teste la solution de la toute première discussion (celle mise en lien dans le premier message de cette discussion-ci) en 2007, sans boucle, api et compagnie. Obtiens-tu une un fichier image correct? Si oui, ça permettrait de savoir que 2007 travaille comme 2010, et donc que le problème est ultérieur à 2010. Il serait alors intéressant de tester en 2013 pour essayer de voir à partir de quand ça pose problème (bien que plusieurs facteurs puissent entrer en ligne de compte).

    Mais quoi qu'il en soit, en 2016, ça ne fonctionne plus (pas de fichier image fidèle), et c'est bien cela qui doit être résolu (obtention de ladite image), et pas des tests sur des api qui vérifient que... Et je ne pense pas que ce soit l'appel de la fonction de l'api qui soit en cause.

    j'avais deja testé tout au debut :elle fonctionne sauf que l'auteur du post 1 dans le lien a oublié de deleter le 2 chart

    @eric si ca plante au 2d c'est deja plus significatif ca voudrais dire que il y a un temps requis aussi pour le delete du 1 er chart et la creation du 2d
    l'ors du plantage dans le debug est que l'on est bon ?
    essayer un doevents juste avant next mais bon si c'est ce que je crois on a un serieux soucis de memoire alloué

    peut etre aussi essayer avec un seul chart
    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

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut Patrick et Pijaku.

    • Pour Patrick : La première image est générée mais elle est vide.
    • Pour Pijaku : Tu as fait un essai sur Excel 2016 ? Je n'ai pas le temps dans la journée, je teste dès que je peux.

  4. #4
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour Eric,

    Je ne peux pas tester avant ce soir.

    Pour être tout à fait honnête et complet, j'ai trouvé cette solution ICI sur social.msdn.microsoft.com

  5. #5
    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
    re
    ok donc si l'image est blanche le .paste ne fonctionne pas ce qui veux dire que meme avec l'api dans le do/loop le clipboard de contient pas encore les information de l'image ou le paste n'atteint pas le chart
    mais qu'est ce qui ont foutus che MS avec 2016?
    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

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2014
    Messages : 41
    Par défaut
    Bonjour, (Ce message s'est croisé avec le dernier de Patrick ; je vais essayer la solution proposée. Résultat : cette boucle ne s'arrête pas non plus...)
    Comme je le précisais dans ma question d'origine, il semble que le Paste n'ait pas le temps de s'exécuter en mode automatique.
    Voici mon code (qui fonctionnait avec Excel 2010) qui me permet de créer et de sauvegarder l'image d'un shape. (NB : il n'y a pas de MsgBox ici ou ailleurs dans ma procédure)
    Je m'en sers pour créer des petites animations techniques pour mon site.
    Un schéma technique est composé de plusieurs shapes que j'anime grâce à des routines spécifiques et après chaque mouvement, "je prends la photo" de l'ensemble des shapes regroupés dans un seul shape créé pour l'occasion et nommé "Groupe A". Enfin, avec tous les fichiers créés, grâce à "GIF Movie Gear", j'obtiens une animation gif que je place sur mon site.
    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
    37
     
    Sub CaptureImage(strChemin As String, strFichierNomPrefixe As String, intNum As Integer)
    ' Créé et sauvegarde l'image du Shape nommé "Groupe A"
    ' Paramètres :
    ' - strChemin = répertoire du fichier image créé
    ' - strFichierNomPrefixe = préfixe du nom du fichier image à créer
    ' - intNum = numéro de l'image
     
      ' Déclaration des variables
      Dim shpCadre As Shape, chtChart As Chart
      Dim strPictureNum As String, strPictureNom As String
     
      ' Définition des variables
      Set shpCadre = ActiveSheet.Shapes("Groupe A")
      strPictureNum = "000"
      Mid(strPictureNum, 4 - Len(Trim(CStr(intNum)))) = Trim(CStr(intNum))
      strPictureNom = strChemin & strFichierNomPrefixe & strPictureNum & ".png"
     
      ' Création de l'image dans un chart, sauvegarde, suppression du chart et dégroupage des shapes
      With ActiveSheet
        shpCadre.CopyPicture
        Set chtChart = .ChartObjects.Add(shpCadre.Left, shpCadre.Top, shpCadre.Width, shpCadre.Height).Chart
        With chtChart
          .Paste
          '.Activate
          'Do
            'DoEvents
            'hPicAvail = IsClipboardFormatAvailable(2)
          'Loop While hPicAvail = 0
          .Export strPictureNom, "PNG"
        End With
        .ChartObjects(ActiveSheet.ChartObjects.Count).Delete
        Set chtChart = Nothing
        .Shapes("Groupe A").Ungroup
      End With
     
    End Sub
    Vous noterez les essais faits (la boucle avec IsClipBoardFormatAvailable qui ne fonctionne pas et le Activate qui génère une erreur).

  7. #7
    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
    re
    teste le poste 26 avec l'ajout de la ligne comme precisé
    si il y a erreur quelle ligne ?
    et fait moi plaisir pour hotter tout doute fait le test dans un fichier vierge

    d'autant plus que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strPictureNom = strChemin & strFichierNomPrefixe & strPictureNum & ".png"
    nan nan!!! png pas bon c'est bitmap,jpg,ou gif et c'est tout meme si ca te parrais bon les metadonnées ne correspondront pas au format du fichier
    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

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    J'ai essayé pour ma part les solutions de Franck. Rien n'y a fait.

    On dirait qu'il faut vraiment une interruption du process, car en mettant un point d'arrêt puis en lançant avec deux F5 pressés coup sur coup, l'arrêt est très bref et l'image est bien créée.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2014
    Messages : 41
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    J'ai essayé pour ma part les solutions de Franck. Rien n'y a fait.
    On dirait qu'il faut vraiment une interruption du process, car en mettant un point d'arrêt puis en lançant avec deux F5 pressés coup sur coup, l'arrêt est très bref et l'image est bien créée.
    J'en arrive à la même conclusion.
    Je vais faire le test proposé par Patrick.

    SUPER ! J'ai créé un nouveau dossier Excel avec une seule feuille et fait un copier-coller du code proposé par Patrick (légèrement modifié quant aux plages à traiter) et les deux images ont bien été créées et posées sur le bureau.
    Donc ça marche ainsi. Il reste à truover pourquoi ça ne marche pas avec mon fichier.

  10. #10
    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
    ok super d'accords
    a tu a jouté la ligne entre la 21 et 22 comme je le dit dans le post ???c'est important pour ce dont je doute
    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

  11. #11
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    @Pierre :
    En effet, cela ne fonctionne pas.

    @Jacques :
    J'ai tenté une boucle DoEvents de 3 secondes avant et après le Paste, cela ne fonctionne pas non plus.

    Un beau gros bug quoi.
    Je vous laisse en vous lisant car je n'ai rien de plus à proposer.
    A++

  12. #12
    Membre averti
    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2014
    Messages : 41
    Par défaut Vive Patriiiiiiiiiiick !
    Merci Patrick !
    J'ai repris mon fichier d'origine dans lequel j'ai modifié ma routine de la façon suivante :
    - ajout du vidage du presse-papier
    - ajout de la boucle test IsClipboardFormatAvailable(14)<>0
    - ajout de la boucle test .Chart.Pictures.Count<>0
    - mais surtout, et je crois que la solution était là, ajout de .Parent
    C'est ce dernier point qui constitue la vraie différence entre les deux codes, celui qui marchait sous Excel 2010 mais pas sous Excel 2016 et celui qui marche sous Excel 2016.
    La question qui reste posée : Pourquoi cette différence ?
    La nouvelle routine est donc :
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    Sub CaptureImage(strChemin As String, strFichierNomPrefixe As String, intNum As Integer)
    ' Créé et sauvegarde l'image du Shape nommé "Groupe A"
    ' Paramètres :
    ' - strChemin = répertoire du fichier image créé
    ' - strFichierNomPrefixe = préfixe du nom du fichier image à créer
    ' - intNum = numéro de l'image
     
      ' Déclaration des variables
      Dim shpCadre As Shape, chtChart As Chart
      Dim strPictureNum As String, strPictureNom As String
     
      ' Définition des variables
      Set shpCadre = ActiveSheet.Shapes("Groupe A")
      strPictureNum = "000"
      Mid(strPictureNum, 4 - Len(Trim(CStr(intNum)))) = Trim(CStr(intNum))
      strPictureNom = strChemin & strFichierNomPrefixe & strPictureNum & ".png"
     
      ' Vidage du presse-papier
      With CreateObject("htmlfile").parentwindow.clipboardData.clearData("Text"): End With
     
      ' Création de l'image dans un chart, sauvegarde, suppression du chart et dégroupage des shapes
      With ActiveSheet
        Set chtChart = .ChartObjects.Add(0, 0, 1, 1).Chart
        shpCadre.CopyPicture
        Do: DoEvents: hPicAvail = IsClipboardFormatAvailable(14): Loop While hPicAvail = 0
        With chtChart
          With .Parent
            .Width = shpCadre.Width
            .Height = shpCadre.Height
            .Activate
            With .Chart
              .Paste
              Do: DoEvents: Loop While .Pictures.Count = 0
              .Export strPictureNom, "PNG"
              .Pictures(1).Delete
            End With
          End With
        End With
        .ChartObjects(ActiveSheet.ChartObjects.Count).Delete
        .Shapes("Groupe A").Ungroup
        Set chtChart = Nothing
        Set shpCadre = Nothing
      End With
     
    End Sub

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

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Ouais ...
    Plus je lis tous les messages, plus je commence à penser que le stop (qui, utilisé, permet la complétion graphique du Paste), plus je pense que des messages système sont encore en cours de traitement entre Paste et Export.
    Tenter l'utilisation de la fonction RedrawRepaint ? -->> je ne crois personnellement pas que cela soit un vrai remède. Je chercherais plutôt à temporiser cette mise à jour par utilisation de la fonction InvalidateRectLong de la librairie user32 de l'api de windows, dont l'effet serait de mettre à jour la fenêtre graphique dès réception d'un message système WM_PAINT message. L'effet n'est pas immédiat, mais il sera forcément là à un moment ou à l'autre. On peut le provoquer si l'on agit par exemple sur la position d'une fenêtre. C'est par exemple ce que j'ai choisi de faire dans une autre discussion récente (Un Frame Transparent avec VBA/Excel).
    Tenter cela. C'est peut-être une solution à ce problème purement graphique.
    Une telle solution implique toutefois un liminaire : l'extraction nécessaire du handle de la fenêtre concernée .
    C'est du boulot .

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [WD-2007] Exporter une équation sous forme d'image depuis Word
    Par citizen87 dans le forum Word
    Réponses: 2
    Dernier message: 30/11/2011, 10h06
  2. [Tableaux] Exporter un tableau sous forme d'image
    Par debutanteVB.NET dans le forum Langage
    Réponses: 2
    Dernier message: 27/10/2008, 11h35
  3. Affichage lien sous forme d'image
    Par neoboy dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 24/01/2008, 15h57
  4. Récupérer la valeur d'un submit sous forme d'image
    Par Jim_Nastiq dans le forum Langage
    Réponses: 6
    Dernier message: 28/04/2006, 10h12
  5. Export sous forme d'INSERT SQL
    Par Kraken dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 04/09/2003, 11h40

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