OVH Cloud OVH Cloud

Add-In, Référence, xla et UserForm

3 réponses
Avatar
mouspi
Bonsoir,



Les applications mises à disposition de chaque utilisateur, utilisent de
nombreux modules identiques, dont une même boîte de dialogue qui s'affiche
pour demander un choix du type : à partir de quel serveur souhaite-t-il
travailler (ServerA ou ServerB).



Seul, l'intitulé de la boîte de dialogue change selon l'application.



Pour éviter d'intégrer tous ces modules communs et le frmLanceur (mon
UserForm) dans chacune des applications, j'ai créé un classeur nommé
communs.xla auquel se réfère chacun des applicatifs.



Mon problème :



Depuis le module appelant, la commande frmLanceur.Show n'est pas acceptée;
je contourne le pb en :

- créant une procédure Lanceur dans communs.xla :

Sub Lanceur()

frmLanceur.Show

End Sub



Comment faire pour que la commande frmLanceur.Show soit acceptée directement
depuis le module appelant?



Comment transmettre l'intitulé, pourque frmLanceur.Caption = titreUserForm
soit accepté ?



En retour, comment récupérer les paramètres retour ServerA ou ServerB ?



Merci de toutes vos bonnes idées



MOUSPI

3 réponses

Avatar
michdenis
Bonjour mouspi,

Attache bien tes bottines ....!

A ) Ta macro complémentaire, Tu lui donnes un nom
Pour ce faire, tu déverrouilles au besoin ton xla et tu cliques sur le composant ThisWorkbook de ton fichier xla.
Tu affiches la fenêtre des propriétés si ce n'est déjà fait, et tu baptises ton fichier xla d'un nom en renseignant
la propriété "Name"

B ) Dans la fenêtre VBE (visual basic editor), à partir de la barre des menus / outils / référence / tu coches dans la liste,
la référence ayant le nom de ton fichier xla (celui que tu viens de baptiser)

C ) Dans un module standard de ton fichier Xla, tu définis des variables publics dans le haut du module :
Public FrmCaption As String
Public FrmTxtContenu As String
Et comme tu l'as dit, tu définis une procédure d'ouverture de ton formulaire
'------------------
Sub Lanceur()
frmLanceur.Show
End Sub
'------------------

D ) Dans le code de ton formulaire du fichier .xla, tu insères ceci en prenant soin d'utiliser les bons noms de tes objets.

'-------------------------------
Private Sub UserForm_Initialize()

Me.Caption = Module1.FrmCaption
Me.TextBox1.Text = Module1.FrmTxtContenu

End Sub
'-------------------------------

Maintenant, dans le module standard du classeur où tu veux interpeller le formulaire de ton classeur xla.
tu insères ceci :

Toto est la valeur de la propriété Name du classeur .xla (pour les besoins de l'exemple)
Dans les lignes de code, il n'est pas nécessaire d'utiliser l'expression toto devant l'appel des lignes de code, mais cela
peut aider à lire le code plus facilement.
'---------------------
Sub Formulaire()

Toto.FrmCaption = "ça marche"
Toto.FrmTxtContenu = "Wow ça marche"
Toto.Lanceur
End Sub
'---------------------

Attention, dans tout le processus, assure toi que tu utilises les bons noms des objets appartenant à ton application.


Salutations!





"mouspi" a écrit dans le message de news:
Bonsoir,



Les applications mises à disposition de chaque utilisateur, utilisent de
nombreux modules identiques, dont une même boîte de dialogue qui s'affiche
pour demander un choix du type : à partir de quel serveur souhaite-t-il
travailler (ServerA ou ServerB).



Seul, l'intitulé de la boîte de dialogue change selon l'application.



Pour éviter d'intégrer tous ces modules communs et le frmLanceur (mon
UserForm) dans chacune des applications, j'ai créé un classeur nommé
communs.xla auquel se réfère chacun des applicatifs.



Mon problème :



Depuis le module appelant, la commande frmLanceur.Show n'est pas acceptée;
je contourne le pb en :

- créant une procédure Lanceur dans communs.xla :

Sub Lanceur()

frmLanceur.Show

End Sub



Comment faire pour que la commande frmLanceur.Show soit acceptée directement
depuis le module appelant?



Comment transmettre l'intitulé, pourque frmLanceur.Caption = titreUserForm
soit accepté ?



En retour, comment récupérer les paramètres retour ServerA ou ServerB ?



Merci de toutes vos bonnes idées



MOUSPI
Avatar
mouspi
Merci michdenis de m'avoir montré la voie;

J'ai vu ainsi la possibilité de modifier la propriété Caption du UserForm
directement à partir du module appelant (voir le bout de code ci-dessous);
cependant, je n'ai pas su faire UserForm .Show depuis ce même module.

Bonne Soirée

MOUSPI
'========================================================== Sub TestAddin4()

Dim obVBC As VBComponent

Set obVBC Application.VBE.VBProjects("TestADDIn").VBComponents("frmLanceur")

obVBC.Properties("Caption") = "Nouveau titre"



'VBA.UserForms.obVBC.Show ' ne fonctionne pas

' On ne peut pas Show des userforms d'un
autre classeur;

' il faut passer par un module de commande du classeur qui
contient le UserForm

Call Lanceur

MsgBox (ProdDev)

End Sub



'==========================================================
'Dans un module de VBProject TestADDIn, la procédure Lanceur envoie le
UserForm

Public Sub Lanceur()

frmLanceur.Show

End Sub



'==========================================================
'Dans le UserForm frmLanceur de VBProject TestADDIn

Public Sub btnOK_Click()

If optProd Then ProdDev = "Prod"

If optDev Then ProdDev = "Dev"

Me.Hide

Unload Me

End Sub

'========================================================== "michdenis" a écrit dans le message de
news:%
Bonjour mouspi,

Attache bien tes bottines ....!

A ) Ta macro complémentaire, Tu lui donnes un nom
Pour ce faire, tu déverrouilles au besoin ton xla et tu cliques
sur le composant ThisWorkbook de ton fichier xla.

Tu affiches la fenêtre des propriétés si ce n'est déjà fait, et tu
baptises ton fichier xla d'un nom en renseignant

la propriété "Name"

B ) Dans la fenêtre VBE (visual basic editor), à partir de la barre des
menus / outils / référence / tu coches dans la liste,

la référence ayant le nom de ton fichier xla (celui que tu viens de
baptiser)


C ) Dans un module standard de ton fichier Xla, tu définis des variables
publics dans le haut du module :

Public FrmCaption As String
Public FrmTxtContenu As String
Et comme tu l'as dit, tu définis une procédure d'ouverture de ton
formulaire

'------------------
Sub Lanceur()
frmLanceur.Show
End Sub
'------------------

D ) Dans le code de ton formulaire du fichier .xla, tu insères ceci en
prenant soin d'utiliser les bons noms de tes objets.


'-------------------------------
Private Sub UserForm_Initialize()

Me.Caption = Module1.FrmCaption
Me.TextBox1.Text = Module1.FrmTxtContenu

End Sub
'-------------------------------

Maintenant, dans le module standard du classeur où tu veux interpeller le
formulaire de ton classeur xla.

tu insères ceci :

Toto est la valeur de la propriété Name du classeur .xla (pour les besoins
de l'exemple)

Dans les lignes de code, il n'est pas nécessaire d'utiliser l'expression
toto devant l'appel des lignes de code, mais cela

peut aider à lire le code plus facilement.
'---------------------
Sub Formulaire()

Toto.FrmCaption = "ça marche"
Toto.FrmTxtContenu = "Wow ça marche"
Toto.Lanceur
End Sub
'---------------------

Attention, dans tout le processus, assure toi que tu utilises les bons
noms des objets appartenant à ton application.



Salutations!





"mouspi" a écrit dans le message de
news:

Bonsoir,



Les applications mises à disposition de chaque utilisateur, utilisent de
nombreux modules identiques, dont une même boîte de dialogue qui s'affiche
pour demander un choix du type : à partir de quel serveur souhaite-t-il
travailler (ServerA ou ServerB).



Seul, l'intitulé de la boîte de dialogue change selon l'application.



Pour éviter d'intégrer tous ces modules communs et le frmLanceur (mon
UserForm) dans chacune des applications, j'ai créé un classeur nommé
communs.xla auquel se réfère chacun des applicatifs.



Mon problème :



Depuis le module appelant, la commande frmLanceur.Show n'est pas acceptée;
je contourne le pb en :

- créant une procédure Lanceur dans communs.xla :

Sub Lanceur()

frmLanceur.Show

End Sub



Comment faire pour que la commande frmLanceur.Show soit acceptée
directement

depuis le module appelant?



Comment transmettre l'intitulé, pourque frmLanceur.Caption titreUserForm
soit accepté ?



En retour, comment récupérer les paramètres retour ServerA ou ServerB ?



Merci de toutes vos bonnes idées



MOUSPI





Avatar
michdenis
Bonjour Mouspi,

A )
"cependant, je n'ai pas su faire UserForm .Show depuis ce même module"

Tu dois garder à l'esprit que les formulaires dépendent de la bibliothèque suivante : "MsForms" . Cette bibliothèque est
chargé automatiquement dès que tu insères un "Userform" dans ton classeur. Le fichier "Dll" qui est dernière cette
bibliothèque est localisé là : "C:WinntSystem32" (cela peut varier selon les systèmes d'exploitation) et elle s'appelle :
"FM20.dll" . Toutes les classes objets qu'un userform peut contenir comme des "Combobox, listbox, CommandButton ... sont
définies dans et font parti de la bibliothèque FM20.Dll et non de la bibliothèque d'excel. Lorsque tu enregistres un fichier
excel contenant des formulaires, non seulement les formulaires et leurs objets sont enregistrés mais aussi le lien avec la
bibliothèque MsForms.


Lorsque tu utilises un fichier xla, ce sont les objets (classes objets) disponibles dans le classeur lui-même qui sont
disponibles et non pas les objets créés dans le fichier xla à partir d'autres bibliothèques qui ont été ajoutés au moment de
la création de ces derniers.

Si tu visualises via l'explorateur d'objets disponible dans la fenêtre VBE(visual basic editor), le contenu de la
bibliothèque (Première liste déroulante de la fenêtre explorateur d'objets) de ton classeur.xla en le sélectionnant dans la
liste des bibliothèques, Tu vas pouvoir observer les objets disponibles : Les feuilles désignées par leur propriété
codename, les modules standard et les modules de classe. Si tu cliques sur un de ces items dans la section de gauche du bas
de la fenêtre, la fenêtre te montrera les procédures, fonctions, Variables Publiques (propriétés du module) disponible pour
ton code dans le classeur actif (celui où tu travailles). Pour la raison donnée plus haut, les userforms n'en font pas
partie. Tu dois donc utiliser une procédure que tu as définis dans un des modules de ton classeur xla.


B )

'--------------------------
Dim obVBC As VBComponent
Set obVBC Application.VBE.VBProjects("TestADDIn").VBComponents("frmLanceur")

obVBC.Properties("Caption") = "Nouveau titre"
'--------------------------

Bien que cela fonctionne, ce type de truc n'est peut être pas ce qui est le plus adapté à ton problème ! Il est préférable de
définir une variable Publique dans un des modules standards de ton fichier xla. Tu pourras par la suite utilisé cette
variable pour définir le "caption" de ton formulaire très facilement tel que démontré dans mon message précédent .... À toi
les oreilles, fais à ta tête !


Salutations!



"mouspi" a écrit dans le message de news:%
Merci michdenis de m'avoir montré la voie;

J'ai vu ainsi la possibilité de modifier la propriété Caption du UserForm
directement à partir du module appelant (voir le bout de code ci-dessous);
cependant, je n'ai pas su faire UserForm .Show depuis ce même module.

Bonne Soirée

MOUSPI
'========================================================== Sub TestAddin4()

Dim obVBC As VBComponent

Set obVBC Application.VBE.VBProjects("TestADDIn").VBComponents("frmLanceur")

obVBC.Properties("Caption") = "Nouveau titre"



'VBA.UserForms.obVBC.Show ' ne fonctionne pas

' On ne peut pas Show des userforms d'un
autre classeur;

' il faut passer par un module de commande du classeur qui
contient le UserForm

Call Lanceur

MsgBox (ProdDev)

End Sub



'==========================================================
'Dans un module de VBProject TestADDIn, la procédure Lanceur envoie le
UserForm

Public Sub Lanceur()

frmLanceur.Show

End Sub



'==========================================================
'Dans le UserForm frmLanceur de VBProject TestADDIn

Public Sub btnOK_Click()

If optProd Then ProdDev = "Prod"

If optDev Then ProdDev = "Dev"

Me.Hide

Unload Me

End Sub

'========================================================== "michdenis" a écrit dans le message de
news:%
Bonjour mouspi,

Attache bien tes bottines ....!

A ) Ta macro complémentaire, Tu lui donnes un nom
Pour ce faire, tu déverrouilles au besoin ton xla et tu cliques
sur le composant ThisWorkbook de ton fichier xla.

Tu affiches la fenêtre des propriétés si ce n'est déjà fait, et tu
baptises ton fichier xla d'un nom en renseignant

la propriété "Name"

B ) Dans la fenêtre VBE (visual basic editor), à partir de la barre des
menus / outils / référence / tu coches dans la liste,

la référence ayant le nom de ton fichier xla (celui que tu viens de
baptiser)


C ) Dans un module standard de ton fichier Xla, tu définis des variables
publics dans le haut du module :

Public FrmCaption As String
Public FrmTxtContenu As String
Et comme tu l'as dit, tu définis une procédure d'ouverture de ton
formulaire

'------------------
Sub Lanceur()
frmLanceur.Show
End Sub
'------------------

D ) Dans le code de ton formulaire du fichier .xla, tu insères ceci en
prenant soin d'utiliser les bons noms de tes objets.


'-------------------------------
Private Sub UserForm_Initialize()

Me.Caption = Module1.FrmCaption
Me.TextBox1.Text = Module1.FrmTxtContenu

End Sub
'-------------------------------

Maintenant, dans le module standard du classeur où tu veux interpeller le
formulaire de ton classeur xla.

tu insères ceci :

Toto est la valeur de la propriété Name du classeur .xla (pour les besoins
de l'exemple)

Dans les lignes de code, il n'est pas nécessaire d'utiliser l'expression
toto devant l'appel des lignes de code, mais cela

peut aider à lire le code plus facilement.
'---------------------
Sub Formulaire()

Toto.FrmCaption = "ça marche"
Toto.FrmTxtContenu = "Wow ça marche"
Toto.Lanceur
End Sub
'---------------------

Attention, dans tout le processus, assure toi que tu utilises les bons
noms des objets appartenant à ton application.



Salutations!





"mouspi" a écrit dans le message de
news:

Bonsoir,



Les applications mises à disposition de chaque utilisateur, utilisent de
nombreux modules identiques, dont une même boîte de dialogue qui s'affiche
pour demander un choix du type : à partir de quel serveur souhaite-t-il
travailler (ServerA ou ServerB).



Seul, l'intitulé de la boîte de dialogue change selon l'application.



Pour éviter d'intégrer tous ces modules communs et le frmLanceur (mon
UserForm) dans chacune des applications, j'ai créé un classeur nommé
communs.xla auquel se réfère chacun des applicatifs.



Mon problème :



Depuis le module appelant, la commande frmLanceur.Show n'est pas acceptée;
je contourne le pb en :

- créant une procédure Lanceur dans communs.xla :

Sub Lanceur()

frmLanceur.Show

End Sub



Comment faire pour que la commande frmLanceur.Show soit acceptée
directement

depuis le module appelant?



Comment transmettre l'intitulé, pourque frmLanceur.Caption titreUserForm
soit accepté ?



En retour, comment récupérer les paramètres retour ServerA ou ServerB ?



Merci de toutes vos bonnes idées



MOUSPI