Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
En cette matinée pluvieuse, je sollicite votre aide.
Je voudrais que le formulaire ne puisse pas s'ouvrir si on l'appeler directement (par exemple depuis le vbe ou via bouton sur la feuille).
Ci-dessous les objectifs:
1 - si le formulaire n'est appelé depuis un formulaire, il ne doit pas s'ouvrir. En effet, si je clique sur le bouton 'Usf_Esclave', il ne doit s'ouvrir (présentement ce n'est pas le cas).
2 - Dans mon cas je voudrais dès que le focus est dans la textbox "T2", le formulaire s'affiche.
3 - Au clic sur le bouton 'Valider' du formulaire 'Usf_Esclave', je voudrais que les valeurs des textboxs soient transmises aux mêmes textboxs du formulaire appelant.
Bonjour Cathodique,
Si j'ai bien compris, peut être en créant une variable en public qui permet d'autoriser ou non l'ouverture de l'usf esclave, avec :
VB:
Option Explicit
Public Autorisation ' 1 autorisation d'ouvrir usf_esclave, 0 interdiction.
Sub afficher_Esclave()
If Autorisation <> 1 Then Exit Sub ' Si pas autorisé alors on sort
Usf_Esclave.Show
End Sub
Sub afficher_Maitre1()
Autorisation = 1 ' Autorisation d'ouvrir usf_esclave
Usf_Maitre1.Show
Autorisation = 0 ' Interdiction d'ouvrir usf_esclave
End Sub
Bonjour Cathodique,
Si j'ai bien compris, peut être en créant une variable en public qui permet d'autoriser ou non l'ouverture de l'usf esclave, avec :
VB:
Option Explicit
Public Autorisation ' 1 autorisation d'ouvrir usf_esclave, 0 interdiction.
Sub afficher_Esclave()
If Autorisation <> 1 Then Exit Sub ' Si pas autorisé alors on sort
Usf_Esclave.Show
End Sub
Sub afficher_Maitre1()
Autorisation = 1 ' Autorisation d'ouvrir usf_esclave
Usf_Maitre1.Show
Autorisation = 0 ' Interdiction d'ouvrir usf_esclave
End Sub
En fait, c'est ce que j'ai utilisé (un booléen public).
Mais étant donné, que je dois aussi transférer les valeurs des 2 textboxs du formulaire esclave vers les textboxs du formulaire appelant.
Je cru bon de ne pas mentionner la variable public, pour ne pas influencer les solutions proposées.
Maintenant le problème est de transférer les valeurs vers le formulaire appelant.
J'ai déclaré dans le module standard cette variable Public NomUsf As String.
Lorsque je clique dans la textbox T2 et que le formulaire esclave s'ouvre, via son activate une msgbox me renvoie bien le nom du formulaire appelant.
Cependant, je ne trouve pas la bonne syntaxe pour réutiliser ce nom pour transférer (via bouton Valider) les valeurs de l'esclave vers l'appelant.
Bonjour.
Ne perdez pas de vue qu'un UserForm est un module de classe pourvu d'une interface d'affichage utilisant MSForms.
La voie royale pour toutes sortes de besoins particuliers de communications de données, c'est de leur écrire des méthodes, c'est à dire des procédures Public. J'effectue de moins en moins de Show de mes UserForm, je préfère passer par une méthode où il s'auto-Show seulement quand c'est pertinent.
edit: pas exactement ça. il faut transférer vers le formulaire appelant. or avec ta proposition, on ne traite que le cas du formulaire Maitre1.
Le code ne fonctionnera pas si on ouvre Maitre2.
Private Sub BtValider_Click()
If NomUsf = "Usf_Maitre1" Then
Usf_Maitre1.T2 = Usf_Esclave.T1
Else
Usf_Maitre2.T2 = Usf_Esclave.T1
End If
Unload Me
End Sub
J'ai opté une structure If Then Else au cas où on voudrait faire des traitements différents, c'est plus souple.
Option Explicit
Public Enfant As Boolean, Valider As Boolean
Private Sub BtQuitter_Click()
Me.Hide
End Sub
Private Sub BtValider_Click()
Valider = True
Me.Hide
End Sub
Private Sub UserForm_Activate()
If Not Enfant Then Unload Me
End Su
Maitres( 1-2)
Code:
Option Explicit
Private Sub BtQuitter_Click()
Unload Me
End Sub
Private Sub T2_Enter()
Dim esclave As New Usf_Esclave
esclave.Enfant = True
esclave.Show vbModal
If esclave.Valider Then
Me.T1 = esclave.T1
Me.T2 = esclave.T2
End If
Unload esclave
End Sub
e voudrais que le formulaire ne puisse pas s'ouvrir si on l'appeler directement (par exemple depuis le vbe ou via bouton sur la feuille).
Ci-dessous les objectifs:
je suis désolé @cathodique mais le fichier du post #8 et bien je peux ouvrir les 3 userforms a partir du vbe
ce n'est pas du tout comme ça qu'il faut faire
une simple fonction show perso aurait suffit
ou
un simple variable public mais appartenant au usf_esclave
perso vu que tu souhaite avoir un transfert de données j'opterais pour la fonction perso
voici comment on transforme un userform en dialogue modale et responsif
un exemple simplissime
dans le usf_esclave
on va lui ajouter 3 membres sous forme de variabler public
VB:
Public caller As Object
Public vx1 As String
Public vx2 As String
tu l'aura compris le caller sera l'object appelant en l’occurrence ici se sera le maitre 1 ou 2
et les deux autres seront les valeurs renvoyées par les deux textboxs
la fonction show perso maintenant
ici cette fonction on va l'appeler "GetValeur" avec un argument usf qui sera le userform appelant
VB:
Function GetValeur(usf)
With Usf_Esclave
Set .caller = usf'on instancie la variable(membres) caller avec l'appelant
.Show'on affiche le userform en modale donc bloquant tant qu'il est affiché
'des que le hide va être appliqué ceci ci dessous va s'executer
GetValeur = Array(.vx1, .vx2)'return
Unload Usf_Esclave'on peut le unloader la reponse est partie à l'appelant
End With
End Function
maintenant il faut bloquer l'affichage si il est appelé autrement
on unload immédiatement si son membre (caller) est rien dans le activate
VB:
Private Sub UserForm_Activate()
'on unload si l'object caller est rien
If Usf_Esclave.caller Is Nothing Then Unload Me: Exit Sub
End Sub
le bouton valider maintenant
on instruit les deux membres que l'on a ajouté avec les valeurs des textboxs
et on hide pour debloquer l'affichage
VB:
Private Sub BtValider_Click()
Me.vx1 = T2.Value
Me.vx2 = T1.Value
Me.Hide
End Sub
il nous faut aussi bloquer la fermeture franche on la remplace par le hide
VB:
'on transformr le close en hide
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = 0 Then Cancel = True: Me.Hide
End Sub
ey voila ton dialogue responsif est opérationnel
dans l'appelant maintenant le maitre 1 ou 2
on appelle le dialog par sa fonction
VB:
Private Sub T2_Enter()
rep = Usf_Esclave.GetValeur(Me)
If rep(1) <> "" Then
T1 = rep(0)
T2 = rep(1)
End If
End Sub
et voila c'est fini heu.. non il te reste le bouton quitter je l'ai pas fait il est inutile en fait mais si tu y tiens dans son event tu lui me "me.hide" tout simplement
voici comment on transforme un userform en dialogue modale et responsif
un exemple simplissime
dans le usf_esclave
on va lui ajouter 3 membres sous forme de variabler public
VB:
Public caller As Object
Public vx1 As String
Public vx2 As String
tu l'aura compris le caller sera l'object appelant en l’occurrence ici se sera le maitre 1 ou 2
et les deux autres seront les valeurs renvoyées par les deux textboxs
la fonction show perso maintenant
ici cette fonction on va l'appeler "GetValeur" avec un argument usf qui sera le userform appelant
VB:
Function GetValeur(usf)
With Usf_Esclave
Set .caller = usf'on instancie la variable(membres) caller avec l'appelant
.Show'on affiche le userform en modale donc bloquant tant qu'il est affiché
'des que le hide va être appliqué ceci ci dessous va s'executer
GetValeur = Array(.vx1, .vx2)'return
Unload Usf_Esclave'on peut le unloader la reponse est partie à l'appelant
End With
End Function
maintenant il faut bloquer l'affichage si il est appelé autrement
on unload immédiatement si son membre (caller) est rien dans le activate
VB:
Private Sub UserForm_Activate()
'on unload si l'object caller est rien
If Usf_Esclave.caller Is Nothing Then Unload Me: Exit Sub
End Sub
le bouton valider maintenant
on instruit les deux membres que l'on a ajouté avec les valeurs des textboxs
et on hide pour debloquer l'affichage
VB:
Private Sub BtValider_Click()
Me.vx1 = T2.Value
Me.vx2 = T1.Value
Me.Hide
End Sub
il nous faut aussi bloquer la fermeture franche on la remplace par le hide
VB:
'on transformr le close en hide
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = 0 Then Cancel = True: Me.Hide
End Sub
ey voila ton dialogue responsif est opérationnel
dans l'appelant maintenant le maitre 1 ou 2
on appelle le dialog par sa fonction
VB:
Private Sub T2_Enter()
rep = Usf_Esclave.GetValeur(Me)
If rep(1) <> "" Then
T1 = rep(0)
T2 = rep(1)
End If
End Sub
et voila c'est fini heu.. non il te reste le bouton quitter je l'ai pas fait il est inutile en fait mais si tu y tiens dans son event tu lui me "me.hide" tout simplement
Mon très cher Patrick (Toulon) car il y a d'autres Patrick qui n'ont pas la trempe de @patricktoulon.
Je te remercie encore une fois.
Même si on me remplace ma petite caboche par un super cerveau, je ne rattraperai jamais mon retard par rapport à toi.
Tu auras toujours des kilomètres d'avance sur moi.
J'ai utilisé ce bout de code dans le formulaire esclave.
VB:
'pour ne pas ouvrir formulaire----------------------------------------
If Not AdresseOuvertureAutorisee Then
MsgBox "Ce formulaire ne peut pas être ouvert directement.", vbCritical
End
End If
Semble fonctionner.
Je vais mettre ton fichier dans ma petite collection.
J'étudierai dès demain tes codes.
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD