A voir également:
- Feuille userform avec paramètres
- Afficher une feuille excel dans un userform vba - Forum - Excel
- VBA : deux feuilles et deux UserForm qui doivent communiquer eux ✓ - Forum - Excel
- VBA UserForm - Importer une feuille d'un autre classeur ✓ - Forum - VB / VBA
- Passer une feuille de calcul en paramètre à une procédure ✓ - Forum - VB / VBA
- Manipulation des UserForm avec des feuilles cachées ✓ - Forum - VB / VBA
9 réponses
Patrice33740
- Messages postés
- 8343
- Date d'inscription
- dimanche 13 juin 2010
- Statut
- Membre
- Dernière intervention
- 16 janvier 2021
Bonjour,
« Une feuille nommée MaFeuille peut être invoqué dans le code par son nom : MaFeuille.show
Est-il possible de passer des paramètres à la feuille d'une façon quelconque ? »
Il n'est pas possible de transmettre des informations à un Userform via les arguments (on utilise argument plutôt que « paramètre ») de la méthode .Show.
L'ouverture d'un Userform se fait par la méthode .Show qui possède un argument facultatif DoModal. C'est le seul argument toléré par la méthode .Show
Pour transmettre des information à un Userform, il est possible de définir des propriétés. Il suffit d'affecter leurs valeurs à ces propriétés avant d'afficher l'Userform.
C'est ce qui devrait être fait systématiquement pour séparer l'interface utilisateur et les données "métier".
Pour définir une propriété d'un userform, on peut simplement déclarer une variable publique dans cet userform.
Par Exemple :
Un bouton dans ThisDocument :
Et une procédure d'affichage dans un module standard nommé MonModule :
Et finalement le Userform nommé MaFeuille :
Le fichier : https://mon-partage.fr/f/jKMDFTmH/
Cordialement
Patrice
Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.
« Une feuille nommée MaFeuille peut être invoqué dans le code par son nom : MaFeuille.show
Est-il possible de passer des paramètres à la feuille d'une façon quelconque ? »
Il n'est pas possible de transmettre des informations à un Userform via les arguments (on utilise argument plutôt que « paramètre ») de la méthode .Show.
L'ouverture d'un Userform se fait par la méthode .Show qui possède un argument facultatif DoModal. C'est le seul argument toléré par la méthode .Show
Pour transmettre des information à un Userform, il est possible de définir des propriétés. Il suffit d'affecter leurs valeurs à ces propriétés avant d'afficher l'Userform.
C'est ce qui devrait être fait systématiquement pour séparer l'interface utilisateur et les données "métier".
Pour définir une propriété d'un userform, on peut simplement déclarer une variable publique dans cet userform.
Par Exemple :
Un bouton dans ThisDocument :
Private Sub MonBouton_Click() Dim bit As Byte Dim str As String bit = 23 str = "Mon texte" MonModule.OuvrirMaFeuille bit, str End Sub
Et une procédure d'affichage dans un module standard nommé MonModule :
Sub OuvrirMaFeuille(b As Byte, s As String) MaFeuille.a = b MaFeuille.t = s MaFeuille.Show End Sub
Et finalement le Userform nommé MaFeuille :
Public a As Byte Public t As String Private Sub btnAfficher_Click() MsgBox "Propriété a = " & Me.a & vbCrLf & _ "Propriété t = " & Me.t End Sub Private Sub btnQuitter_Click() Unload Me End Sub
Le fichier : https://mon-partage.fr/f/jKMDFTmH/
Cordialement
Patrice
Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.
yg_be
- Messages postés
- 13895
- Date d'inscription
- lundi 9 juin 2008
- Statut
- Contributeur
- Dernière intervention
- 16 janvier 2021
un autre exemple tout simple:
code du userform
code du userform
Public Function reponse(question As String) As String Me.TextBox1 = question Me.Show reponse = Me.TextBox1 End Functioncode du module:
Sub getresp() Debug.Print UserForm1.reponse("dis moi") End Sub
yg_be
- Messages postés
- 13895
- Date d'inscription
- lundi 9 juin 2008
- Statut
- Contributeur
- Dernière intervention
- 16 janvier 2021
bonjour,
utilises-tu Excel?
ta question est peu claire: que veux-tu dire par "appeler une feuille userform"?
que sont les paramètres d'une feuille ou d'une userform?
il est probablement préférable que tu expliques ce que tu veux réaliser, peut-être en donnant un exemple ou en partageant un fichier.
utilises-tu Excel?
ta question est peu claire: que veux-tu dire par "appeler une feuille userform"?
que sont les paramètres d'une feuille ou d'une userform?
il est probablement préférable que tu expliques ce que tu veux réaliser, peut-être en donnant un exemple ou en partageant un fichier.
iBenny
- Messages postés
- 72
- Date d'inscription
- lundi 23 janvier 2012
- Statut
- Membre
- Dernière intervention
- 12 janvier 2021
Bonjour,
Dans Word ! Une procédure peut être appelée avec des paramètres quand elle est conçue ainsi:
Sub LetsGo(a as byte, t as string)
...
end Sub
On peut donc appeler la procédure avec des paramètres:
LetsGo 23, "Mon texte"
Une feuille nommée MaFeuille peut être invoqué dans le code par son nom :
MaFeuille.show
Est-il possible de passer des paramètres à la feuille d'une façon quelconque ?
Dans Word ! Une procédure peut être appelée avec des paramètres quand elle est conçue ainsi:
Sub LetsGo(a as byte, t as string)
...
end Sub
On peut donc appeler la procédure avec des paramètres:
LetsGo 23, "Mon texte"
Une feuille nommée MaFeuille peut être invoqué dans le code par son nom :
MaFeuille.show
Est-il possible de passer des paramètres à la feuille d'une façon quelconque ?
yg_be
- Messages postés
- 13895
- Date d'inscription
- lundi 9 juin 2008
- Statut
- Contributeur
- Dernière intervention
- 16 janvier 2021
- Messages postés
- 72
- Date d'inscription
- lundi 23 janvier 2012
- Statut
- Membre
- Dernière intervention
- 12 janvier 2021
une feuille dans Word? peux-tu expliquer? qu'est MaFeuille? quel est le type de MaFeuille?
tu peux peut-être consulter la documentation relative à ce type d'objet pour déterminer si la méthode show accepte des paramètres.
il est probablement préférable que tu expliques ce que tu veux réaliser, peut-être en donnant un exemple ou en partageant un fichier. cela nous permettra peut-être de suggérer des solutions.
tu peux peut-être consulter la documentation relative à ce type d'objet pour déterminer si la méthode show accepte des paramètres.
il est probablement préférable que tu expliques ce que tu veux réaliser, peut-être en donnant un exemple ou en partageant un fichier. cela nous permettra peut-être de suggérer des solutions.
yg_be
- Messages postés
- 13895
- Date d'inscription
- lundi 9 juin 2008
- Statut
- Contributeur
- Dernière intervention
- 16 janvier 2021
en essayant de donner un sens à ce que écris, je me demande si tu ne fais pas ceci:
- tu fais du VBA dans Word,
- dans ce VBA, tu interagis avec Excel, et tu appliques la méthode show à un object de type (Excel)UserForm.
- tu souhaites que le VBA de Word puisse communiquer des données qui seraient utilisées par du code VBA dans Excel
est-ce correct?
si oui, peux-tu nous montrer ce que tu fais en VBA dans Word, pour interagir avec Excel? il me semble probable qu'il soit possible d'adapter cela pour obtenir ce que tu souhaites.
- tu fais du VBA dans Word,
- dans ce VBA, tu interagis avec Excel, et tu appliques la méthode show à un object de type (Excel)UserForm.
- tu souhaites que le VBA de Word puisse communiquer des données qui seraient utilisées par du code VBA dans Excel
est-ce correct?
si oui, peux-tu nous montrer ce que tu fais en VBA dans Word, pour interagir avec Excel? il me semble probable qu'il soit possible d'adapter cela pour obtenir ce que tu souhaites.
Patrice33740
- Messages postés
- 8343
- Date d'inscription
- dimanche 13 juin 2010
- Statut
- Membre
- Dernière intervention
- 16 janvier 2021
Re,
Pour remplacer le MsgBox, tu peux utiliser le MsgBox Perso de Didier Fourgeot, déjà fait et entièrement paramétrable :
http://www.mdf-xlpages.com/modules/TDMDownloads/singlefile.php?lid=34&com_id=449&com_rootid=449&cid=10&
Cordialement
Patrice
Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.
Pour remplacer le MsgBox, tu peux utiliser le MsgBox Perso de Didier Fourgeot, déjà fait et entièrement paramétrable :
http://www.mdf-xlpages.com/modules/TDMDownloads/singlefile.php?lid=34&com_id=449&com_rootid=449&cid=10&
Cordialement
Patrice
Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.
iBenny
- Messages postés
- 72
- Date d'inscription
- lundi 23 janvier 2012
- Statut
- Membre
- Dernière intervention
- 12 janvier 2021
Merci Patrice pour l'info. Je préfère continuer avec ma forme personnelle qui est en voie de perfectionnement ! et elle marche bien mais la passation d'information d'info (variable) reste à développer.
iBenny
- Messages postés
- 72
- Date d'inscription
- lundi 23 janvier 2012
- Statut
- Membre
- Dernière intervention
- 12 janvier 2021
Bonjour
Le problème insoluble réside dans le fait qu'une variable globale définie dans le module appelant n'est pas accessible dans la forme appelée... et vice versa (à ce que je comprends).

Ma variable globale Rép dans la forme est invisible dans le module appelant.
J'ai contourné le problème en sauvegardant la valeur convoitée dans la propriété "Tag" de la forme qui elle est accessible dans le module appelant. Le tour est joué :
Si vous avez des infos sur la communication de variables globales entre module appelant et forme appelée, on est intéressé par la chose. Entretemps. passer par la propriété "Tag" semble une élégante solution.
Cordiales salutations
iBenny
Le problème insoluble réside dans le fait qu'une variable globale définie dans le module appelant n'est pas accessible dans la forme appelée... et vice versa (à ce que je comprends).

Ma variable globale Rép dans la forme est invisible dans le module appelant.
J'ai contourné le problème en sauvegardant la valeur convoitée dans la propriété "Tag" de la forme qui elle est accessible dans le module appelant. Le tour est joué :
Function Question(Q As String) With Questionner If Q = "Monter" Then .Caption = "Remonter la dernière ligne ?" .Sup1.Visible = False .Sup2.Visible = True .Q = "On remonte la dernière ligne ? = " + Format(Selection.Characters.Count) + " caractères" Else .Caption = "Position de l'image = " + Format(PointsToInches(Selection.Information(wdVerticalPositionRelativeToPage))) + " pouces" End If .Show End With Question = Questionner.Tag End Function
Si vous avez des infos sur la communication de variables globales entre module appelant et forme appelée, on est intéressé par la chose. Entretemps. passer par la propriété "Tag" semble une élégante solution.
Cordiales salutations
iBenny
yg_be
- Messages postés
- 13895
- Date d'inscription
- lundi 9 juin 2008
- Statut
- Contributeur
- Dernière intervention
- 16 janvier 2021
- Messages postés
- 13895
- Date d'inscription
- lundi 9 juin 2008
- Statut
- Contributeur
- Dernière intervention
- 16 janvier 2021
comme expliqué en #9:
- une variable déclarée public dans un module est accessible, comme une variable, de partout
- une variable déclarée public dans un userform est une propriété publique du userform, utilisable exactement comme tu utilises les autres propriétés du userform, telles que Tag, Caption et Q, donc ainsi:
- une variable déclarée public dans un module est accessible, comme une variable, de partout
- une variable déclarée public dans un userform est une propriété publique du userform, utilisable exactement comme tu utilises les autres propriétés du userform, telles que Tag, Caption et Q, donc ainsi:
Questionner.Rép
iBenny
- Messages postés
- 72
- Date d'inscription
- lundi 23 janvier 2012
- Statut
- Membre
- Dernière intervention
- 12 janvier 2021
- Messages postés
- 13895
- Date d'inscription
- lundi 9 juin 2008
- Statut
- Contributeur
- Dernière intervention
- 16 janvier 2021
Je suis pas certain de te comprendre :
Je viens de tester et une variable déclarée globale au niveau module est... "invisible" dans les formes appelées !
On ne déclare pas une variable en tant que "Public" mais elle le deviens quand elle est déclarée niveau module. C'est probablement ce que tu voulais dire !?
Salutation
iBenny
Je viens de tester et une variable déclarée globale au niveau module est... "invisible" dans les formes appelées !
On ne déclare pas une variable en tant que "Public" mais elle le deviens quand elle est déclarée niveau module. C'est probablement ce que tu voulais dire !?
Salutation
iBenny
yg_be
- Messages postés
- 13895
- Date d'inscription
- lundi 9 juin 2008
- Statut
- Contributeur
- Dernière intervention
- 16 janvier 2021
- Messages postés
- 72
- Date d'inscription
- lundi 23 janvier 2012
- Statut
- Membre
- Dernière intervention
- 12 janvier 2021
tu écris "On ne déclare pas une variable en tant que "Public"".
d'où cela vient-il? une conviction personnelle?
as-tu vu les exemples en #6?
pourquoi ne pas utiliser ces exemples, en dépit de tes convictions?
au minimum, les tester, avant de décider de faire autrement?
ne fût-ce que par respect pour ceux qui prennent le temps de t'assister.
tu me sembles plus prompt à poser des questions qu'à lire les réponses.
cela pourrait finir par décourager ceux qui choisissent de te donner un coup de main.
d'où cela vient-il? une conviction personnelle?
as-tu vu les exemples en #6?
pourquoi ne pas utiliser ces exemples, en dépit de tes convictions?
au minimum, les tester, avant de décider de faire autrement?
ne fût-ce que par respect pour ceux qui prennent le temps de t'assister.
tu me sembles plus prompt à poser des questions qu'à lire les réponses.
cela pourrait finir par décourager ceux qui choisissent de te donner un coup de main.
iBenny
- Messages postés
- 72
- Date d'inscription
- lundi 23 janvier 2012
- Statut
- Membre
- Dernière intervention
- 12 janvier 2021
- Messages postés
- 13895
- Date d'inscription
- lundi 9 juin 2008
- Statut
- Contributeur
- Dernière intervention
- 16 janvier 2021
T'as 100% raison. Je fais trop de choses en même temps et je le redis : t'as 100% raison. Je me suis sûrement trompé et je reteste.
iBenny
- Messages postés
- 72
- Date d'inscription
- lundi 23 janvier 2012
- Statut
- Membre
- Dernière intervention
- 12 janvier 2021
Y a rien à montrer. Je l'ai mis dans mon code (en jaune) de forme pour montrer ce que j'ai essayé mais vais la supprimer car inaccessible dans le module appelant. Et vice-versa...
Salutations
iBenny
Salutations
iBenny
yg_be
- Messages postés
- 13895
- Date d'inscription
- lundi 9 juin 2008
- Statut
- Contributeur
- Dernière intervention
- 16 janvier 2021
même si tu es certain d'avoir suivi les exemples et la documentation, il est très préférable de montrer l'ensemble de ce que tu essaies.
tu nous montre vaguement du code dans le userform, sans le code correspondant dans le module.
tu nous indiques avoir essayé l'autre méthode (vice-versa), sans montrer aucun code.
difficile pour nous de t'indiquer où tu te trompes, si, certain d'avoir raison, tu ne nous montres rien.
en passant, je me demande si tu as bien
cela te permettrait, sans doute, de détecter plus rapidement tes erreurs.
tu nous montre vaguement du code dans le userform, sans le code correspondant dans le module.
tu nous indiques avoir essayé l'autre méthode (vice-versa), sans montrer aucun code.
difficile pour nous de t'indiquer où tu te trompes, si, certain d'avoir raison, tu ne nous montres rien.
en passant, je me demande si tu as bien
option explicitdans chaque module et userform.
cela te permettrait, sans doute, de détecter plus rapidement tes erreurs.
iBenny
- Messages postés
- 72
- Date d'inscription
- lundi 23 janvier 2012
- Statut
- Membre
- Dernière intervention
- 12 janvier 2021
Je fais amende honorable et donne raison à yg_be en #23 :
On peux déclarer une variable "public" au lieu de "Dim" en global dans le module et elle serra accessible partout, même dans les formes !!!
Quand on fait trop de choses en même temps, on s'enferre !!!
Module:
Forme:
Salutation et merci à tous
iBenny
On peux déclarer une variable "public" au lieu de "Dim" en global dans le module et elle serra accessible partout, même dans les formes !!!
Quand on fait trop de choses en même temps, on s'enferre !!!
Module:
Public Rép As Boolean Function Question(Q As String) As Boolean With Questionner If Q = "Monter" Then .Caption = "Remonter la dernière ligne ?" .Sup1.Visible = False .Sup2.Visible = True .Q = "On remonte la dernière ligne ? = " + Format(Selection.Characters.Count) + " caractères" Else .Caption = "Position de l'image = " + Format(PointsToInches(Selection.Information(wdVerticalPositionRelativeToPage))) + " pouces" End If .Show End With Question = Rép End Function
Forme:

Salutation et merci à tous
iBenny
Patrice33740
- Messages postés
- 8343
- Date d'inscription
- dimanche 13 juin 2010
- Statut
- Membre
- Dernière intervention
- 16 janvier 2021
Bonjour,
Réponse à lire jusqu’à la fin :)
Exemple simple avec un Userform nommé Questionner qui contient :
- un Label nommé Question
- un premier bouton nommé Bouton1
- un second bouton nommé Bouton2
Dans un module standard :
Dans le module du formulaire Questionner :
Le fichier : https://mon-partage.fr/f/mrGkAIjG/
L'intérêt de cette méthode est que l'IHM est indépendante du traitement "métier".
D'autre part, je te conseille de saisir le code manuellement, dans l'ordre ci-dessus : tu verras que l'intellisense simplifie grandement la saisie.
Cordialement
Patrice
Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.
Réponse à lire jusqu’à la fin :)
Exemple simple avec un Userform nommé Questionner qui contient :
- un Label nommé Question
- un premier bouton nommé Bouton1
- un second bouton nommé Bouton2
Dans un module standard :
Option Explicit Public Enum uReponse uBouton1 = 1 uBouton2 = 2 End Enum Sub Question_1() With Questionner .Bouton1.Caption = "Oui" .Bouton2.Caption = "Non" .Reponse = Empty .Question = "Remonter la dernière ligne ?" .Show If .Reponse = uBouton1 Then MsgBox "Reponse Oui" ElseIf .Reponse = uBouton2 Then MsgBox "Reponse Non" Else MsgBox "Pas réponse" End If End With Unload Questionner End Sub
Dans le module du formulaire Questionner :
Public Reponse As uReponse Private Sub Bouton1_Click() Me.Reponse = uBouton1 Me.hide End Sub Private Sub Bouton2_Click() Me.Reponse = uBouton2 Me.hide End Sub
Le fichier : https://mon-partage.fr/f/mrGkAIjG/
L'intérêt de cette méthode est que l'IHM est indépendante du traitement "métier".
D'autre part, je te conseille de saisir le code manuellement, dans l'ordre ci-dessus : tu verras que l'intellisense simplifie grandement la saisie.
Cordialement
Patrice
Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.
iBenny
- Messages postés
- 72
- Date d'inscription
- lundi 23 janvier 2012
- Statut
- Membre
- Dernière intervention
- 12 janvier 2021
- Messages postés
- 8343
- Date d'inscription
- dimanche 13 juin 2010
- Statut
- Membre
- Dernière intervention
- 16 janvier 2021
L'IMH (la forme) n'est pas encapsulée !? Ce qui veux dire ? Ce qui implique ?
Patrice33740
- Messages postés
- 8343
- Date d'inscription
- dimanche 13 juin 2010
- Statut
- Membre
- Dernière intervention
- 16 janvier 2021
- Messages postés
- 72
- Date d'inscription
- lundi 23 janvier 2012
- Statut
- Membre
- Dernière intervention
- 12 janvier 2021
Schématiquement, une IHM est encapsulée lorsqu'elle peut fonctionner de façon autonome, c'est à dire sans faire appel à des données ou des procédures extérieures.
Ça permet d'utiliser l'userform dans un autre classeur, simplement après l'y avoir copié. Il suffit alors d'écrire le module "métier" pour l'utiliser, mais il n'y a pas besoin d'ajouter des lignes de codes pour son fonctionnement.
Dans l'exemple #28, pour que Questionner fonctionne dans un autre classeur, il faut aussi ajouter la déclaration de uReponse dans un module standard, donc l'userform n'est pas encapsulé.
Ça permet d'utiliser l'userform dans un autre classeur, simplement après l'y avoir copié. Il suffit alors d'écrire le module "métier" pour l'utiliser, mais il n'y a pas besoin d'ajouter des lignes de codes pour son fonctionnement.
Dans l'exemple #28, pour que Questionner fonctionne dans un autre classeur, il faut aussi ajouter la déclaration de uReponse dans un module standard, donc l'userform n'est pas encapsulé.
iBenny
- Messages postés
- 72
- Date d'inscription
- lundi 23 janvier 2012
- Statut
- Membre
- Dernière intervention
- 12 janvier 2021
- Messages postés
- 8343
- Date d'inscription
- dimanche 13 juin 2010
- Statut
- Membre
- Dernière intervention
- 16 janvier 2021
Je comprends ! J'aurais plutôt dit "autonome", "autosuffisante" ou "indépendante" au lieu... "d'encapsulée"... ; )
Patrice33740
- Messages postés
- 8343
- Date d'inscription
- dimanche 13 juin 2010
- Statut
- Membre
- Dernière intervention
- 16 janvier 2021
- Messages postés
- 72
- Date d'inscription
- lundi 23 janvier 2012
- Statut
- Membre
- Dernière intervention
- 12 janvier 2021
En informatique, pour une classe (par exemple un userform) on parle d'encapsulation des données.
Par contre je déconseille toujours très vivement l'utilisation de variables publiques (i.e. définies dans un module standard). Il vaut mieux transférer les informations via les arguments des procédures et / ou des fonctions .
soit en passant des paramètres à une fonction de la userform:
le code de la userform:
le code principal:
Une fonction publique d'un Userform s'appelle une méthode.
- Les méthodes servent à effectuer des actions,
- Les propriétés servent à stocker des données.
en effet, et, les méthodes pouvant avoir des paramètres, il me semble préférable, dans ce contexte précis, d'utiliser des paramètres plutôt que d'utiliser des propriétés.
On ne peut pas utiliser une méthode pour ça : les arguments transmis à la méthode doivent être utilisés immédiatement ou stockés dans une propriété, autant écrire directement dans cette propriété !!!!