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 :

Pourquoi mon code Fonctionne en PAS à PAS sur Excel-2016 et en mode normal sur d'EXcel-2013 ? [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 88
    Par défaut Pourquoi mon code Fonctionne en PAS à PAS sur Excel-2016 et en mode normal sur d'EXcel-2013 ?
    Bonsoir,

    Le code suivant tiré d'une de mes macro s’exécute très bien à partir d'un Excel 2013 32bits installé sur un PC en W7 pro.
    Fonctionne aussi très bien s'il est exécuté lentement en pas à pas sur un Excel 2016 64 bits installé sur un PC en W10 pro.
    Par contre il ne fonctionne plus sur ce dernier dès lors que le pas à pas est exécuté trop rapidement ou s'il est exécuté automatiquement.
    J'ai bien une image de créé dont la taille est correcte mais qui est toute blanche comme si le Paste n'avait pas eu lieu et comme le code fonctionne en pas à pas, je ne vois pas du tout où chercher.
    J'ai tenté de ralentir l'exécution du code en mettant une tempo mais ça n'a pas fonctionné.

    Auriez vous déjà rencontré ce genre de problème ou une idée pour m'en sortir ?

    D'avance merci pour vos commentaires.

    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
     
    ThisWorkbook.Worksheets("RTT").Range("A:AC").Select 'feuille RTT
    Selection.CopyPicture Appearance:=xlPrinter, Format:=xlPicture
     
    With ThisWorkbook.Worksheets("RTT")
            With .ChartObjects.Add(0, 0, _
                Selection.Width, Selection.Height).Chart
                .Paste
                .ChartArea.Border.LineStyle = 0
            End With
            With .ChartObjects(1)
                .Top = 0
                .Left = 0
               'Exportation de l'image dans un fichier
                .Chart.Export Chemin & "\" & FichierImage, "BMP"
                .Delete
            End With
    End With

  2. #2
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Bonjour,

    il faut ajouter une ligne avec DoEvents pour laisser au programme le temps de finir ce qu'on lui demande avant de passer à la ligne suivante.
    Reste à savoir dans votre code quelle est l'action qui met du temps à s'exécuter et mettre DoEvents juste après. A vous de placer ce DoEvents au bon endroit.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        'exécution Action longue
        DoEvents
        'Suite du Programme
    Cdlt

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 88
    Par défaut
    Merci ARTURO83 pour cette proposition.
    J'ai bien testé de mettre DoEvents un peu partout entre chacune des lignes du code, mais ça ne m'a rien changé au résultat.

    Par contre, j'ai fait un autre test.
    J'ai exécuté la macro en vitesse normale avec la touche F5, tout en la stoppant par un point d'arrêt avant de continuer son exécution toujours avec la touche F5.
    À chacun de mes essais, j'ai décalé le point d'arrêt d'une ligne afin de voir si le résultat obtenu changeait et surtout à quel moment.
    J'ai constaté que le résultat n'est correct que si le point d'arrêt est positionné sur .Paste.
    Positionné sur les lignes d'avant ou d'après ce .Paste le résultat est incorrect.

  4. #4
    Expert confirmé
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Par défaut
    Bonjour,

    Essayez d'activer l'objet avant l'export.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            With .ChartObjects(1)
                .Top = 0
                .Left = 0
               'Exportation de l'image dans un fichier
                .Activate
                .Chart.Export Chemin & "\" & FichierImage, "BMP"
                .Delete
            End With

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 88
    Par défaut
    Merci Arkham46 de t'intéresser à mon problème.
    J'ai activer l'objet avec .Activate comme tu le préconise mais celà n'a rien changé chez moi

    Le problème est que sous Excel 2016, le code se déroule normalement et j'ai bien une image bmp de créée dans mon dossier sauf que cette image bmp est blanche. L'export à bien eu lieu me semble-t-il mais d'un objet vide.
    La copie d'une partie de l'écran à bien lieu puisque j'ai encore la copie de l'image dans le presse papier que je peux coller dans un document Word en sortie de procédure.
    Et l'objet graphique est bien créé mais c'est comme si le collage (.Paste) ne se fait pas en exécution automatiquement mais qu'il fonctionne très bien si je stop sur .Paste et que je poursuit le code ensuite sur Excel 2016.
    Comme je l'ai dit au par avant, sans rien changer au code, j'obtient l'image correcte quelque soit les autres version d'Excel (2003,2007,2010 ou 2013). Seule la version Excel 2016 me donne un fichier BMP de même taille qu'avec les autres versions mais dont le contenu est blanc (vide).

  6. #6
    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
    c'est pas "comme si" c'est un fait l'object n'est pas dispo!! pour vba tout de suite l'ors de sa creation sur 2016 testé!!!
    le phenomene est encore plus flagrant avec des pc un peu faiblards
    alternative que j'ai proposé pour 2016
    https://www.developpez.net/forums/d1...-excel-2016-a/

    attirer son atten,tion sur la gestion d'attente des object
    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

  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 a tester sur 2016
    a tester sur 2016 voir si le phénomene de l'image blanche exporter subsiste

    fonction
    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
    Option Explicit
    #If VBA7 Then
        Private Declare ptrsafe Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Integer) As Long
    #Else
        Private Declare Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Integer) As Long
    #End If
     
    Function selection_to_image_E_2016(ByRef Obj As Object, ByVal chemin As String, ByVal sname As String)
        Dim chart1 As Object, hPicAvail As Long, T, I&
        With CreateObject("htmlfile").parentwindow.clipboardData.clearData("Text"): End With    'on vide le clipboard entre chaque copie pour tester vraiment le available
        With Obj
            Set chart1 = .Parent.ChartObjects.Add(0, 0, 1, 1).Chart    'avant tout on ajoute un chart
            With chart1
                With .Parent
                    .Width = Obj.Width: .Height = Obj.Height: .Left = Obj.Width + 20:    'on dimentionne le parent du chart aux dimentions de l'ojet a capturer(range,image,shapes(groupe shape)
                    Obj.CopyPicture    'on copy en mode picture (le format est don metafile)
                    T = Timer
                    Do: DoEvents: hPicAvail = IsClipboardFormatAvailable(14): Loop While hPicAvail = 0 Or (Timer - T) < 3    'gestion d'attente du meatafichier dans le clipboard
                    If hPicAvail = 0 Then MsgBox "pas de données ""WMF"" dans le clipboard:exit function "    'sorti si pas de données "wmf"
                    .Select    'selection du parent du chart
                    .Chart.Paste ' collage des données du clipboard(l'image) dans le chart
                    Do: DoEvents: Loop While .Chart.Pictures.Count = 0 'gestion d'attente que vba detecte  qu'il y ai bien une image dans le chart
                    .Chart.Export chemin & sname, "jpg" 'export en fichier physique du chart en image
                    .Chart.Pictures(1).Delete    'on delete l'image collée (important si les plages capturées sont differentes en terme de dimension)
                End With
            End With
            chart1.Parent.Delete
        End With
    End Function
    exporter une plage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub test()
        Dim x
        x = selection_to_image_E_2016(Sheets(1).Range("A1:F10"), Environ("userprofile") & "\DeskTop\", "plage_toto.jpg")
    End Sub
    exporter une shape ou une image d'un sheets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub test2()
        Dim x
        x = selection_to_image_E_2016(Sheets(1).Shapes(1), Environ("userprofile") & "\DeskTop\", "shape_toto.jpg")
    End Sub
    j'ai absolument besoins que ce soit testé sur 2013 ou 2016 les versions anterieures c'est bon
    c'est pour la mise a jour de ma contrib a savoir en faire une fonction generique
    merci pour les retours
    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

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 17/02/2011, 14h45
  2. Pourquoi mon code ne fonctionne pas sur Linux
    Par Amaury_35 dans le forum Langage
    Réponses: 2
    Dernier message: 24/08/2009, 09h58
  3. [XMLHttpRequest] Pourquoi ce code fonctionne sous IE8 et pas sur Firexox 3.0.11
    Par homeostasie dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 23/07/2009, 14h50
  4. pourquoi mon code ne fonctionne pas
    Par jmlb35 dans le forum VBA Access
    Réponses: 2
    Dernier message: 30/06/2008, 19h02
  5. Réponses: 6
    Dernier message: 12/04/2007, 13h58

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