Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

insertion dynamique de code vba

11 réponses
Avatar
ptilo
Bonjour,

j'ai une macro word qui lit un fichier XML pour g=E9n=E9rer dynamiquement
une interface (comboBox, textBox, commandButton...) et jusque l=E0 pas
de probl=E8me. Par contre, lorsque j'int=E8gre (dynamiquement) un bouton
(commandButton), je veux en m=EAme temps g=E9n=E9rer la proc=E9dure qui
r=E9agit au clic sur ce bouton et c'est la que je bloque.

J'ai une piste qui consiste =E0 creer une variable String contenant le
code de la proc=E9dure puis d'ins=E9rer ce code en utilisant
"InsertLines" mais l=E0, j'ai essay=E9 de le tourner un peu dans tous les
sens mais rien =E0 faire, je bloque.

Si quelqu'un =E0 une id=E9e pour me d=E9bloquer =E7a serait vraiment bien
(pas forc=E9ment en utilisant mon d=E9but de piste, je suis preneur de
toute autre solution).

Merci d'avance de vos r=E9ponses

Ptilo

10 réponses

1 2
Avatar
Anacoluthe
Bonjour !

'ptilo' nous a écrit ...
J'ai une piste qui consiste à creer une variable String contenant le
code de la procédure puis d'insérer ce code en utilisant
"InsertLines" mais là, j'ai essayé de le tourner un peu dans tous les
sens mais rien à faire, je bloque.


Oui une macro qui écrit une macro dans un module c'est possible.
Voici un exemple donné sur ce forum: cette macro ajoute une macro
et l'exécute aussitôt :

Sub AjouteMacro()
' Ajoute une macro et l'exécute
With ActiveDocument.VBProject.VBComponents("ThisDocument").CodeModule
.InsertLines .CountOfLines + 1, _
"Sub Essai()" & vbCr & _
" Msgbox ""Bonjour !"" " & vbCr & _
"End Sub"
End With
Application.OnTime Now, "Essai"
End Sub


Mais c'est juste pour le fun !!!
En pratique on n'a jamais besoin de faire de telles acrobaties !
Il suffit souvent de prévoir les divers codes possibles,
de masquer/afficher les contrôles (votre bouton ajouté 'dynamiquement')
ou de mieux penser, diversifier et simplifier une procédure...

Anacoluthe
« Ce n’est pas si simple que ça d’être simple. »
- Pierre REVERDY

Avatar
JièL
Bonjoir(c) Anacoluthe

Mais c'est juste pour le fun !!!


Ah que non !!!

En pratique on n'a jamais besoin de faire de telles acrobaties !


Cette macro à fonctionné sur des milliards de modèles pour faire en
sorte de ne rien modifier au déplacement des macros référencés dans le
normal.dot (partagé par des milliers d'utilisateurs) vers un modèle
global...

Il suffit souvent de prévoir les divers codes possibles,


Ouais, mais quand c'est pas prévu...

« Ce n’est pas si simple que ça d’être simple. »
- Pierre REVERDY


Ca c'est sur !

--
JièL / Jean-Louis GOUBERT

*** news *** news *** news *** news *** news *** news ***
Le 22/05/2006 inauguration des forums Internet et Offices
http://forums.offices.free.fr/
*** news *** news *** news *** news *** news *** news ***

Avatar
ptilo
Bonjour,

tout d'abord merci de vos réponses.

En ce qui concerne le code que tu mets Anacoluthe, merci car ca me
confirme la piste que j'avais trouvé donc mon problème ne vient pas
tout à fait de là. Je m'explique : la macro qui est créée
dynamiquement (comme tu le montre) doit fonctionner par contre dans mon
cas, cette macro correspond à un événement click sur un bouton
créé lui aussi dynamiquement (il n'existe pas à la création de la
UserForm) et c'est la que je dois avoir un petit souci (entre le nom du
bouton et la macro qui lui correspond) donc je vais chercher par là.

En ce qui concerne la méthode (créer dynamiquement des boutons et
des macro...), je pense que je suis obligé puisque au début de la
macro, l'interface est presque vierge (juste un multiPage) et on ne
sait pas à quoi elle va ressembler. C'est grâce à la lecture du
fichier XML associé qu'on va savoir si il faut ajouter une multipage
avec tel nom et lui mettre un comboBox evec tel ou tel item et une
autre page uvec un bouton pour parcourir... (je m'arrête là!). Tout
ça pour dire qu'on ne connait pas à priori ni l'existence ni la
position éventuelle des différents éléments graphiques d'où la
technique utilisée.

Au fait, si quelqu'un à d'autres idées plus simple, je suis bien
évidemment preneur.

Ptilo
Avatar
ptilo
Re-bonjour,

En fait, le problème que j'ai est que le code qui est ajouté
dynamiquement est ajouté dans le code de "ThisDocument" or dans mon
cas il faudrait l'ajouter dans le code de la feuille que j'ai nommé
"FormAssistant".
Donc voilà je fait des recherches dans ce sens mais si quelqu'un à
une idée ou même une solution, faites vous plaisir

Loïc
Avatar
ptilo
Re-Re-bonjour,

Bon je me fait les questions et les réponses mais maintenant que j'ai
commencé, je continue, ca pourra peut être en aider !
Pour mon message précédent, une solution est :
ActiveDocument.AttachedTemplate.VBProject.VBComponents("FormAssistant").Cod eModule
Par contre, ça ne résoud pas complètement le problème. Si j'ajoute
un bouton en dur dont le nom correspond à la procédure de
l'événement Click, pas de problème, ca fonctionne.
La question que je me pose maintenant est comment doit être nommée
la procédure qui doit réagir au click sur le bouton créé
dynamiquement. Pour accéder à ce bouton (ou tout autre controle) à
partir du code, j'utilise la collection "controls" :
controls("NomBoutonDynamique"). Par contre, on ne peut pas nommer une
procédure de cette manière pour le faire réagir au click donc
comment faire ?

Toujours pareil, si un courageux est arrivé jusqu'ici et a une
solution avant que j'en trouve une, vous êtes les bienvenues

¨Ptilo
Avatar
Anacoluthe
Bonjour !

'ptilo' nous a écrit ...
La question que je me pose maintenant est comment doit être nommée
la procédure qui doit réagir au click sur le bouton créé
dynamiquement. Pour accéder à ce bouton (ou tout autre controle) à
partir du code, j'utilise la collection "controls" :
controls("NomBoutonDynamique"). Par contre, on ne peut pas nommer une
procédure de cette manière pour le faire réagir au click donc
comment faire ?


Private Sub NomBoutonDynamique_Click()

tout simplement...

Malgré les milliards de modèles de JièL (coucou!) je persiste à
penser que le code 'dynamique' en vba est une aberration. Mébon.

Anacoluthe
« Le vrai est trop simple, il faut y arriver
toujours par le compliqué. »
- George SAND

Avatar
ptilo
Re.......Re bonjour,

ben j'ai voulu tout simplement faire ça ("Private Sub
NomBoutonDynamique_Click()") mais j'arrive pas à le faire fonctionner.
Voici le bout de code :

Private Sub ...
...
Dim monBouton As CommandButton
Set monBouton =
FormAssistant.MultiPage(indexPage).controls.Add("Forms.CommandButton.1")

With monBouton
.Font.Size = 10
.Font.Name = "Trebuchet MS" 'Type de police

.Caption = "Parcourir..."
.Move posX + decalageControleX + longControle +
decalageBoutonX, posY + espaceY * Val(indiceQuestion) +
decalageControleY
.Name = "parcourir" + nomOnglet + indiceQuestion
End With

With
ActiveDocument.AttachedTemplate.VBProject.VBComponents("FormAssistant").Cod eModule
.InsertLines .CountOfLines + 1, _
"Sub parcourir" + nomOnglet + indiceQuestion + "_Click()" &
vbCr & _
" Msgbox ""Bonjour parcourir !"" " & vbCr & _
"End Sub"
End With

End Sub

Le bouton "Parcourir..." est bien créé mais quand je clique, rien ne
se passe ?
Petite précision, la procédure créée dynamiquement est bien cré ée
puisqu'elle existe toujours quand je ferme ma macro (il faudra
supprimer cette partie à la fin de l'execution mais pour l'instant ca
permet de tester).



Malgré les milliards de modèles de JièL (coucou!) je persiste à
penser que le code 'dynamique' en vba est une aberration. Mébon.


Dans mon cas c'est peut être vrai mais je vois pas comment donc si tu
(ou quelqu'un d'autre) a une idée, je serai ravi de me simplifier le
code.

Ptilo

Avatar
Geo

La première chose serait de s'assurer du code ajouté
et comme j'aime bien voir et toucher, je ferais comme ceci :

MonTexte = "Sub parcourir" & nomOnglet & indiceQuestion _
& "_Click()" & vbCr & _
" Msgbox ""Bonjour parcourir !"" " & vbCr & _
"End Sub"
debug.print montexte

ActiveDocument.AttachedTemplate.VBProject.VBComponents("FormAssistant").CodeModule.InsertLines
.CountOfLines + 1, Montexte

--
A+
Avatar
Geo

Mais c'est juste pour le fun !!!
En pratique on n'a jamais besoin de faire de telles acrobaties !


C'est une excellente méthode pour protéger un code.
Le type qui lit le code d'origine ne s'aperçoit pas forcément qu'il est
modifié dynamiquement et il est complètement berné.

Plus prosaïquement, j'ai utilisé cela dans quelques dizaines* de
classeurs Excel pour mettre le code à niveau.

* : je suis en Touraine :-)

--
A+

Avatar
Anacoluthe
Bonjour !

'Geo' nous a écrit ...
quelques dizaines*

* : je suis en Touraine :-)


milliard de fois MDR :-D

A+
A~

1 2