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 :

Mise à jour d'un objet shape ne fonctionne qu'en mode pas à pas [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Août 2009
    Messages
    817
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 817
    Points : 314
    Points
    314
    Par défaut Mise à jour d'un objet shape ne fonctionne qu'en mode pas à pas
    Bonjour,

    J'ai un bout de code qui va sélectionner une zone pour l'afficher dans une photo excel en fonction de critères.
    Ensuite l'image est sauvegardée en local puis rechargée dans une picture de userform.(Merci Jacques Boisgontier, pour son encyclopédie, simple et accessible à tous !).

    Le problème c'est que quand j'excécute pas à pas la macro, je récupère bien l'image mise à jour, mais si j'exécute la macro, alors je récupère l'image précédemment sauvegardée dans le classeur.

    Pensant à un problème lié à l'excution du chargement de la shape, j'ai ajouté
    Application.Wait (Now + TimeValue("0:00:10"))
    de 10" ça fonctionne, mais je préfèrerais la gestion d'un "etat" plutot que de patienter 10 secondes pour rien !

    ---- (ajout: Ca a fonctionné une ou deux fois, mais pas toujours).

    J'ai jamais utilisé le doevents et les avis sont partagés sur cette fonction.
    que me conseileriez vous.
    Merci

    Extraits de mon code
    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
     
    Private Sub UserForm_Initialize()
     
    'Lecture fichier instruction
     
    Workbooks.Open Filename:=Mon_Rep & Input_File, ReadOnly:=True
        Sheets(Feuille_Tra).Activate
     
    ....    
        ActiveSheet.Shapes.Range(Array("Instruction")).Select
        Selection.Formula = "='" & Feuil_Cible & "'!A2:O48"
     
    Application.Wait (Now + TimeValue("0:00:10"))
     
      Set f = Workbooks("Instructions_162.xlsm").Sheets("LISTE_INSTRUC_ET_EXTRUSION")
      Set s = f.Shapes(CStr("Instruction"))
      s.CopyPicture
      f.ChartObjects.Add(0, 0, s.Width, s.Height).Chart.Paste
      f.ChartObjects(1).Chart.Export Filename:="monimage.jpg"
      f.Shapes(f.Shapes.Count).Delete
      Me.Image1.PictureSizeMode = fmPictureSizeModeZoom
      Me.Image1.Picture = LoadPicture("monimage.jpg")
      Kill "monimage.jpg"
     
    Workbooks("Instructions_162.xlsm").Saved = True
    Workbooks("Instructions_162.xlsm").Close
    End Sub

  2. #2
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Fais tiut ce que tu peux pour avoir un code lisible mais sans abuser de select et de activate

    Déjà, tu peux remplacer ces deux lignes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sheets(Feuille_Tra).Activate
     
    ....    
        ActiveSheet.Shapes.Range(Array("Instruction")).Select

    par celle-ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets(Feuille_Tra).Shapes.Range(Array("Instruction")).Select
    Et peut-être avec

    Comme deuxième ligne

    Mais, j'ai l'impression que tu ne peux pas attendre de miracle. Parce que manipuler des images et des formes gruge du temps. Et puis mettre un texte sur une plage de formes, cela n'a pas beaucoup de sens; sauf pour faire passer la beauté avant l'utilité. Et puis donner le chemin de l'image originale directement en pâture à l'userForm plutôt que de la promener dans le classeur avant est plus efficace. Mais bon fancy est souvent ennemi d'efficace. Quand la décoration du classeur passe avant l'efficacité, c'est ce que cela donne; du niaisage à attendre Excel qui finit par coûter cher en main d'ouvre gaspillée à niaiser en attendant le miracle ou le Messie.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  3. #3
    Membre averti
    Inscrit en
    Août 2009
    Messages
    817
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 817
    Points : 314
    Points
    314
    Par défaut
    Merci pour ta réponse,

    Pour ma défense, en tant qu'autodidacte qui ne maîtrise pas certains fondamentaux, je dirais.

    Dans certains cas le sélect direct n'a pas fonctionné (sûrement qu'il y avait une raison), et c'est pour cela que j'ai fait un activate d'abord. (de plus le activate est souvent hérité de l'enregistreur). mais sur le principe je suis d'accord et je promets de tester sur ce cas et de m'améliorer.

    Pour l'affichage oui c'est du décor, mais quand on veut promouvoir l'usage d'une image plutot que que d'une feuille imprimée auprès des utilisateurs, c'est un argument !
    Il ne s'agit pas dans ce cas de données à travailler au sens du tableur, mais d'une restitution mise en forme d'une base de données paramètres.
    Je me vois pas refaire cela un listview.

    Mon appli va piquer des infos dans plusieurs classeurs dans certains cas j'importe dans le classeur courant pour présenter l'image dans ce cas je pensais m'en sortir avec cette fonction.
    maintenant si ça marche pas, il faudra bien que je revoie ma copie.
    Pour le fun je joins l'image concernée
    Nom : 2019-06-26 09_10_55-Start.jpg
Affichages : 364
Taille : 222,0 Ko

    Bon avant de poseter ma réponse j'ai fait quelques tests.
    alors
    Application.DoEvents
    me renvoie une erreur 438 "Propriete ou methode non gérées par cet objet

    par contre en mettant seulement
    DoEvents
    ca marche

    Conclusion, j'aurais dû essayer dès le début de mettre cette instruction, mais j'avais été freiné par les explications souvents complexes autour de celle ci.

    En bref, merci pour la séance de psy, le mets en résolu.
    Denis

  4. #4
    Membre averti
    Inscrit en
    Août 2009
    Messages
    817
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 817
    Points : 314
    Points
    314
    Par défaut
    Bonjour Clément,

    JE reviens vers toi fidèle à ma promesse, j'ai testé sans succès ce qui suis.
    Peux tu me dire où m'aiguiller sur un lien pour que je comprenne pourquoi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      ActiveSheet.Shapes.Range(Array("Instruction")).Select
        Selection.Formula = "='" & Feuil_Cible & "'!A2:O48"
    [
    Pourquoi dans ce contexte cela ne fonctionne pas, j'ai l'erreur 438 Propriete ou méthode non géré....
    [CODE] ActiveSheet.Shapes.Range(Array("Instruction")).Formula = "='" & Feuil_Cible & "'!A2:O48"


    Par ailleurs finalement le
    DoEvents
    ne fonctionne que sur mon poste.


    Alors j'ai tenté un truc, temporiser tant que le shape n'est pas à jour. en plus je pense que le fait que la formule soit à jour cela ne préjuge pas si l'objet est vraiement raffraichit !
    mais bien que le nom du shape soit à jour il ne sort pas de la procédure, je pense que je compare des vahces et des cochons mais ne sais comment comparer des choses comparables


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim Test_Img, Toto
     Toto = "Feuil_Cible & " '!A2:O48""
    While Test_Img <> Toto
    ActiveSheet.Shapes.Range(Array("Instruction")).Select
    Test_Img = Selection.Formula
     MsgBox Selection.Formula & " --- " & Test_Img
    'Stop
    DoEvents
    Wend
    Merci

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    salut
    en effet tu compare une dinde a un cochon de lait pensant que la dinde cours aussi vite que le cochon


    le problème d'une copypicture d'une plage puis sauvegarde en fichier et affichage dans une picture c'est la latence plus importante au niveau de l'accès au clipboard a partir de 2013

    j'ai montré une méthode dans les contributions pour 2016 valable pour 2013
    cherche dans les contrib
    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: 2
    Dernier message: 06/07/2014, 19h40
  2. mise à jour de l'objet javascript : document.location.hostname
    Par DarkPoster14 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 05/06/2012, 10h37
  3. [WD-2007] mise à jour automatique des objets
    Par law56100 dans le forum Word
    Réponses: 0
    Dernier message: 31/08/2009, 14h01
  4. Mise à jour d'un objet dans un schéma dbml
    Par boby62423 dans le forum Linq
    Réponses: 1
    Dernier message: 25/06/2009, 13h51
  5. VBA Outlook - Mise à jour de l'objet et du format du mail
    Par maoboyindo dans le forum VBA Outlook
    Réponses: 7
    Dernier message: 17/11/2008, 17h48

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