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 :

Problème libération mémoire sur lecture OnAction d'un shape


Sujet :

Macros et VBA Excel

  1. #21
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Points : 1
    Points
    1
    Par défaut
    Sauf que je ne peut pas lancer une macro par le clique sur le shape...

  2. #22
    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
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    mais si
    en testant le ".parent "dans la fonction ------> exit sub ou function si la condition n'est pas remplie

    au plaisir

  3. #23
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Points : 1
    Points
    1
    Par défaut
    JE récupère comment le clique sur la forme si son OnAction est vide?
    Et s'il n'est pas vide mais avec un lien sur un autre classeur, cela ouvrira ce dernier....
    Je suis donc bien obliger de lire cette propriété.

  4. #24
    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
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    je ne t'ai pas dis d'enlever le onaction

    mais de le rajouter dans le alternativetext avec ce qu'il y a deja

    ce qui induit une modification dans la macro qui est appelée
    un exemple facile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if split(sh.alternativetext,"/")(1)<>activesheet.name then exit sub
    etant donné que tu a ajouté le ".parent" auparavant comme je te l'ai indiqué
    si cette condition n'est pas remplie alors bye bye

    c'est pas compliqué

    au plaisir'

  5. #25
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Points : 1
    Points
    1
    Par défaut
    Donc Excel va ouvrir l'ancien classeur, donc je ne suis pas avancer.

    Bon je laisse tomber...

    JE relancerai Excel quand il serra à court de mémoire...

    Vive les logiciels fermés

  6. #26
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Points : 1 925
    Points
    1 925
    Billets dans le blog
    5
    Par défaut
    Bonsoir,
    N'étant pas un pro et loin de l'être selon ma propre conviction, je pourrais peut-être solutionner ton problème, si je le comprenais.
    si tu expliquais un peu plus de façon détaillée et claire ce que tu veux faire tu pourras avoir une aide conséquente?
    Copier des Shapes d'un classeur vers un autre a été compris.

    Effacer les OnAction ou lire les OnAction pour quel but? quelque chose m'échappe.

    Les macros sont ils stockés dans le classeur source ou ailleurs mais visibles pour le classeur de destination ?

  7. #27
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Points : 1
    Points
    1
    Par défaut
    Bonsoir,

    Tout simplement, lorsque je recopie les formes du Classeur1 avec la macro MaMacro liée dans Classeur2, la propriété OnAction devient "Classeur1!MaMacro". Donc quand je clique sur la forme copiée, Excel rouvre le Classeur1 alors que je voudrai qu'il exécute MaMacro de Classeur2. C'est pour ça que j'ai une autre macro qui scanne toutes les formes pour voir si elles sont bien liées au bon classeur.

  8. #28
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Points : 1 925
    Points
    1 925
    Billets dans le blog
    5
    Par défaut
    Re,

    ... alors que je voudrai qu'il exécute MaMacro de Classeur2...
    juste après la copie, l'instruction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monShape.OnAction = "Classeur2!" & MaMacro
    n'est pas une solution?

  9. #29
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Points : 1
    Points
    1
    Par défaut
    Le faire après la copie n'est pas possible (si macro désactivée ou autre) donc faut bien que je vérifie en boucle (ajout pendant le cycle).
    De plus, je suis bien obligé de lire OnAction pour savoir si c'est bien MaMacro qui doit y être ou MaDeuxièmeMacro, ou même rien...

    De toute façon, c'est bien un bug dans Excel, donc il DOIT être corrigé.

  10. #30
    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
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    bonjour

    purée c'est pas difficile

    étape 1
    copie du shapes 'ca c'est fait
    étape 2
    après la copie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    with shapes (xxx)
    .alternativetext=.alternativetext & "/" &le nom de la macro"
    .onaction=split(.alternativetext ,"/")(1)
    end with
    ainsi le nouveau shapes copie parfaite a ces propres paramètres (textremplacement et onaction ect......t)
    simplement en le mémorisant dans le "alternativetext"
    non de dieu!!!!

    il ne faut pas mettre la faute sur tes applications a chaque fois que tu comprends pas quelques chose

    d'ailleurs si tu savais exactement ce que tu voudrais faire (plan )et si tu avait fait une petite recherche tu aurais trouver comment lire le code dans les modules par vba et aussi comment écrire du code par vba
    ce qui t'aurais amener a ma conclusion

    1 copie du shapes
    2 copie de la macro d'un classeur a l'autre
    3 en modifiant certaines variables ,paramètres etc...)tout ce que tu veux en fait
    4 je vais boire un café tu a maintenant matière a réflection
    5 en espérant que c'est assez pro pour toi
    au plaisir

  11. #31
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Nul part j'ai dit que c'est une macro qui copiait les formes. Cela peut très bien être fait par l'utilisateur alors que les macros sont désactivées (voir post #29).
    Si c'était la macro qui faisait la copie, je n'aurai pas besoin de lire le OnAction étant donné que je connait l'objet copié et donc lui affecterai la bonne valeur direct.

    Le cas présent, c'est que je peux avoir un shape copié par l'utilisateur (avec un simple copier-coller) venant d'un autre classeur du même type (avec la même application), et là vb ne peux pas le savoir, surtout s'il est désactivé.

    L'exemple que je donne (code du post #1) c'est juste la ligne qui fait défaut dans mon code de plusieurs milliers de lignes. Alors VBA, je connais merci. Écrire dans les modules VB, je sais faire aussi (mes modules se mettent à jour suivant une base de donnée, ainsi j'assure que le classeur soit avec la dernière version). Et je ne vois pas en quoi cela pourrait changer le fait que le shape soit lié avec un autre classeur.
    Love and Peace...

  12. #32
    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
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    bonjour
    on en reviens alors a ce que je disais

    a l'ouverture du classeur modifier le alternativetext de tout les shapes présent dans le classeur

    et si vba est désactivé comme tu dis alors la discussion est caduque

    j'avoue que dans tes explications tu t'es un peu perdu

    a question claire reponse claire

    au fur et a mesure du fil du post les choses sont de moins en moins claires


    enfin si tu veux aller plus loin je te suggère de poser ta question

    avec tout les paramètres a prendre en compte

    voir meme un ou chaque exemple de classeur (données confidentielles supprimées)

    au plaisir

  13. #33
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Points : 1
    Points
    1
    Par défaut
    Je ne peux pas avec les textes de remplacement. Ce n'est pas la macro qui créait les formes. Elles ne fait que les mettre à jour suivant le code introduit dans le texte de remplacement justement.

    Pour tout t'expliquer, le classeur ouvre une connexion avec un partenaire (automate ou autre). Dans le texte de remplacement on peut mettre du code genre "IF ValeurBit1=0 THEN FOND=Rouge ELSE FOND=Vert".
    Si on clique sur cette forme, elle bascule la valeur du bit via une macro (OnAction). Lorsque le cycle est démarré, la macro Cycle met à jour toutes les formes suivant le code dans AlternativText. Donc en même temps, je vérifie que les formes soient liées avec le bon classeur.
    Je pourrai très bien me servir de Tag pour indiquer la valeur courante de OnAction afin d'éviter de le lire (même si c'est pas propre). Mais si c'est l'utilisateur qui lie la forme à la macro, là le code ne peut rien voir...
    Seul moyen, Effacer ce Tag au démarrage puis remettre à jour toutes les formes et si elle ont un tag vide, c'est qu'elles ont été ajoutées par l'utilisateur. Comme ça, je ne lirait qu'une seule fois la propriété OnAction par cycle. Mais cela ne permettra pas de nettoyer la mémoire, juste d'éviter qu'elle enfle trop vite.

  14. #34
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Points : 1 925
    Points
    1 925
    Billets dans le blog
    5
    Par défaut
    bonjour,
    je ne crois pas vraiment qu'il s'agisse d'un bug. Ton Excel n'a aucun problème.
    ton problème provient probablement de tes fichiers ou de ta méthode. Des liaisons externes de tes Shape. La mémoire lue reste tant que le programme est ouvert. Tu as le choix de fermer par nombre intervalles shapes mis à jour le classeur, rouvrir et continuer à l'indice où tu as fermé. C'est une question d'approche technique dans un tas de pelletés!


    au début je t'avais indiqué une suggestion de contournement par le stockage de la liste des shapes et des propriété dont tu as besoin.
    Une petite boucle te permet d'automatiser cette action. Ensuite plus besoin d'aller lire tous les shapes à chaque coup. c'est ce tableau que tu lis.
    C'est faisable aussi avec un type défini

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Type Shape_Property
         Action as String
         LincKedCell as string
         Hauteur as Long
         Largeur as Long
        .....
    End Type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim MonShape as Shape_Property
     
    Shape_Property.Action = x.OnAction
    Tu as bien compris qu'une liaison externe de toutes les propriétés Shapes attachées au fichier A est crée quand tu copies un objet du fichier A vers un fichier B. à l'exécution de la copie mais l'argument Link à False.

  15. #35
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Points : 1
    Points
    1
    Par défaut
    Si ce n'est pas un bug de Excel, pourquoi la mémoire n'augmente pas si je lit .Name ou .AlternativText ou encore .Title?
    Et même si j'écrit .OnAction
    Tu n'arriveras pas à changer mon avis là dessus.
    Si on avait accès au code source, il serait simple de le prouver...

  16. #36
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Points : 1 925
    Points
    1 925
    Billets dans le blog
    5
    Par défaut
    Bonsoir
    ces propriétés n'invoquent pas la création d'une liaison
    Si ce n'est pas un bug de Excel, pourquoi la mémoire n'augmente pas si je lit .Name ou .AlternativText ou encore .Title?
    Et même si j'écrit .OnActio
    je pensais que tu dois avoir une petite idée sur la traduction des liens externe en mémoire.
    Non ce n'est pas le code property du Shape, c'est la traduction du VBA. Si tu es habitué à coder en VBA, tu t'apercevras que beaucoup de choses sont implicites. D'où la rapidité à ressortir rapidement la valeur d'un pointeur.
    C'est la clé de son efficacité et de sa simplicité dans l'utilisation.
    Tes OnAction sont des liens externes que VBA comprend de suite. Les pointeurs feront leurs travail en mémoire. la surcharge en mémoire dépend du fichier et des composants du fichier pointés pour satisfaire la liaison.

  17. #37
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Points : 1
    Points
    1
    Par défaut
    Même S'il y a des liens externes afin de récupérer une valeur, une fois sortie de la méthode PropertyGet, ceux ci sont tués et libérés normalement.

  18. #38
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Points : 1 925
    Points
    1 925
    Billets dans le blog
    5
    Par défaut
    re
    je ne pourrais t'expliquer, et même si je le voulais cela dépasse le cadre de mes misérables compétences.

    Une solution pour éviter l'ouverture du classeur lié par le clic: que tu peux essayer avant de lancer le classeur, supprime les liaisons externes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonClasseurX.BreakLink "C:\Users\DenisF\Documents\Classeur1 test.xlsb", xlExcelLinks
    je t'informes qu'à mon niveau j'ai pas remarqué d'enflement de mémoire en simulant la situation que tu as décrite. Peut-être parce que le fichier source est vide de toute données. et que les macros pointés n'ont qu'une ligne de code.

    mais j'y penses... je ne me souviens plus, il y a une collection qui te permet de renvoyer les objets ayant des liens OLE ou DDE. Pas sûr, ce serait le gâteau à supprimer.

  19. #39
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Points : 1
    Points
    1
    Par défaut
    Le code du post #1 dans un classeur vierge suffit pour faire augmenter la mémoire.

  20. #40
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Points : 1 925
    Points
    1 925
    Billets dans le blog
    5
    Par défaut
    re
    écoute, si tu veux des explications sur le pourquoi de la mémoire qui enlfle dans ton code scrute les forums pour y trouver un spécialisé sur les transactions.
    si tu veux maintenant des alternatives à la ligne de code à problème, suffisamment de pistes t'ont été données à travers les différentes rép.
    l'idée suggérée tout à l'heure, avant de lire la propriété onAction il est peut-être possible de déterminer si l'objet est liée avec ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim x As OLEObject
    Set x = monshape(i)
    If x.OLEType=xlOLELink Then x.delete
    au revoir.
    et si tu arrivais à comprendre les raisons de la mémoire qui enfle, informes nous.

Discussions similaires

  1. problème libération mémoire dû aux user control
    Par grogui dans le forum Windows Forms
    Réponses: 25
    Dernier message: 30/03/2009, 09h29
  2. Problème espace mémoire sur module
    Par gege91 dans le forum AS/400
    Réponses: 4
    Dernier message: 26/11/2008, 17h15
  3. problème libération mémoire après une DLL
    Par salseropom dans le forum C
    Réponses: 22
    Dernier message: 03/09/2008, 12h51
  4. Problème d'incrémentation sur lecture wave
    Par Pedrozito dans le forum Interfaces Graphiques
    Réponses: 11
    Dernier message: 16/04/2008, 11h28
  5. Réponses: 2
    Dernier message: 05/05/2007, 16h57

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