Sauf que je ne peut pas lancer une macro par le clique sur le shape...
Sauf que je ne peut pas lancer une macro par le clique sur le shape...
mais si
en testant le ".parent "dans la fonction ------> exit sub ou function si la condition n'est pas remplie
au plaisir
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é.
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
etant donné que tu a ajouté le ".parent" auparavant comme je te l'ai indiqué
Code : Sélectionner tout - Visualiser dans une fenêtre à part if split(sh.alternativetext,"/")(1)<>activesheet.name then exit sub
si cette condition n'est pas remplie alors bye bye
c'est pas compliqué
au plaisir'
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
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 ?
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.
Re,
juste après la copie, l'instruction:... alors que je voudrai qu'il exécute MaMacro de Classeur2...
n'est pas une solution?
Code : Sélectionner tout - Visualiser dans une fenêtre à part monShape.OnAction = "Classeur2!" & MaMacro
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é.
bonjour
purée c'est pas difficile
étape 1
copie du shapes 'ca c'est fait
étape 2
après la copie
ainsi le nouveau shapes copie parfaite a ces propres paramètres (textremplacement et onaction ect......t)
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
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
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...
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
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.
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 TypeTu 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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Dim MonShape as Shape_Property Shape_Property.Action = x.OnAction
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...
Bonsoir
ces propriétés n'invoquent pas la création d'une liaison
je pensais que tu dois avoir une petite idée sur la traduction des liens externe en mémoire.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
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.
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.
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
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part MonClasseurX.BreakLink "C:\Users\DenisF\Documents\Classeur1 test.xlsb", xlExcelLinks
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.
Le code du post #1 dans un classeur vierge suffit pour faire augmenter la mémoire.
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:
au revoir.
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
et si tu arrivais à comprendre les raisons de la mémoire qui enfle, informes nous.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager