XL 2010 Formulaires interdépendants

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 !

cathodique

XLDnaute Barbatruc
Bonjour,

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.

Avec mes remerciement anticipés
 

Pièces jointes

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
 

Pièces jointes

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 @sylvanu 😉,

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.

ton fichier en retour.

Merci beaucoup.
 

Pièces jointes

Re,
Pas sur d'avoir tout compris.
Dans usf_esclave j'ai rajouté :
VB:
Private Sub BtValider_Click()
Usf_Maitre1.T2 = Usf_Esclave.T1
Unload Me
End Sub
Donc quand on valide usf_esclave il copie la valeur de T1 dans l'userform maitre en T2.
Test5.gif
 

Pièces jointes

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.
 
Re,
Pas sur d'avoir tout compris.
Dans usf_esclave j'ai rajouté :
VB:
Private Sub BtValider_Click()
Usf_Maitre1.T2 = Usf_Esclave.T1
Unload Me
End Sub
Donc quand on valide usf_esclave il copie la valeur de T1 dans l'userform maitre en T2.Regarde la pièce jointe 1222674
Merci beaucoup.

Bon week-end

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.
 
Dernière édition:
Re, bonjour Dranreb,
Une solution avec :
VB:
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.
Test5.gif
 

Pièces jointes

bonjour,
juste pour le fun!

esclave
VB:
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
 

Pièces jointes

Merci beaucoup @sylvanu .

Mes recherches ont été fructueuses cette fois-ci.

Je trouvais une solution.
Bonjour
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
 

Pièces jointes

Dernière édition:
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.

Encore merci.

Excellente soirée.
 
- 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

Discussions similaires

Retour