Ouvrire une fenêtre dont le nom est le contenu d'une TextBox

Résolu
Signaler
Messages postés
139
Date d'inscription
mardi 18 janvier 2005
Statut
Membre
Dernière intervention
8 décembre 2008
-
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
-
Bonjour,
Je cherche à ouvrire une fenêtre dont le nom est le contenue d'une textbox. sans utiliser des if :
Exemple :

J'ai trois form : Form1, Form2 et Form3

sur Form1 j'ai TextBox1 et le un bouton Commande1.

Le but est :
Si je saisie Form2 dans le TextBox1 et je click sur Commande1 ==> la fenêtre Form2 s'affiche.

34 réponses

Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Salut,
Tu peux essayer la facon de procéder suivante.
1- Charger tout les Forms (Form1,Form2, Form3)
2- Utiliser la Collection Forms disponible dans l'application

Mais je ne suis pas sûr que cela te conviendra
Option Explicit

Private Sub Command1_Click()

   Dim i As Integer
   For i = 0 To Forms.Count - 1
       If Forms(i).Name = Text1.Text Then
           Forms(i).Show
           Exit Sub
       End If
   Next i
           
       

End Sub<hr />
Private Sub Form_Load()
   Call Load(Form2)
   Call Load(Form3)
End Sub<hr />
Private Sub Form_Unload(Cancel As Integer)
   Call Unload(Form2)
   Call Unload(Form3)
End Sub<hr />, ----
[code.aspx?ID=41455 By Renfield]

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
Re,

Je féliicite adamo901 poue son opiniatreté ...
C'est bien, "d'être sur" ... (reste ensuite à voir si on avait raison "d'être sur")


Ce qui, pour l'instant est une double certitude, c'est ce que l'on trouve dans l'aide en ligne de VB, à savoir :



"A Forms collection is a collection whose elements represent each loaded form in an application. The collection includes the application's MDI form, MDI child forms, and non-MDI forms. The Forms collection has a single property, Count, that specifies the number of elements in the collection."


Cà, c'est du concret.

Il est également concret qu'une chaîne de caractères ne peut être utilisée sous VB pour se référer tant à une variable qu'à un contrôle ou qu'à un objet.
Il resterait bien les indexes, mais voilà, ils sont ceux d'une collection également (Forms) et... sans charger les Forms concernées; ma foi...

Quand tu auras résolu celà, adamo (personne n'y a bien évidemment réussi, tant sur ce forum que sur tous les autres forums VB), n'oublie pas de nous en faire profiter, hein !

Quand par contre tu auras abandonné de chercher dans ce sens là, viens nous demander si l'on n'aurait pas un "truc" autre pour faire face à certaines situations de l'espèce !

A bientôt, donc ...(mais prends ton temps...)
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
Bonsoir,

Un petit coup de pouce (une méthode parmo d'autres) :

Puisque c'est toi qui fais ton appli, tu connais ses Forms (au stade de développement) ...

Fais un tout petit projets avec 3 forms Form1, Form2 et Form3

Mets un bouton de commande Command1 dans Form1 et ce code (dans Form1 également), puis lance command1 ...

Dim formes(2) As Form




Private Sub Command1_Click()
 formes(1).Show
End Sub







Private Sub Form_Load()
  Set formes(0) = Form1
  Set formes(1) = Form2
  Set formes(2) = Form3
End Sub


Voilà ta base d'une 1ère réflexion.

Bon Week-end.
Messages postés
1141
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
19 septembre 2007
3
Avant cela, il serait préférable de choisir la form parmi une liste, car sinon, l'utilisateur doit etre sur de la saisie.
Messages postés
492
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
2 juillet 2012
4
salut jrivet, vu l'exposé il est en excel donc en VBA


Tes exemples sont bon mais je vais les transcodés en VBA
dim a$
'on a cliqué sur la listeBox

   woorksheet(listbox1(List).listbox1(Listindex)).activate
'elle visible mais pas encore sélectionnée
   activesheet.select

s'il faut effacé les deux autres faire recherche

la commande est
wooksheet("Form").visible=false
Cordialement
louis
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
Salut Lermitte,

Tu m'étonnes, là ....
Je ne vois rien (bien au contraire) qui laisse entendre qu'il est dans Excel !!!
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Salut, [auteurdetail.aspx?ID= 1025868 lermite222], [auteurdetail.aspx?ID=615490 jmfmarques] ,

A part le nom du TextBox rien ne peux nous dire qu'il est en VBA
De plus à aucun moment il ne parle de Feuille ni de listbox...
Mais il est vrai que mon exemple est pour VB6
Qu'à cela ne tienne, voici l'exemple en VBA avec des UserForm nommé UserForm1, UserForm2, UserForm3
Il y a peu de modif (juste faire gaffe car les feuille sont Modales)
Private Sub CommandButton1_Click()

  Dim i As Integer
  For i = 0 To UserForms.Count - 1
      If UserForms(i).Name = TextBox1.Text Then
          Call UserForms(i).Show
      End If
  Next i
         
     

End Sub<hr />

Private Sub UserForm_Initialize()
   Call Load(UserForm2)
   Call Load(UserForm3)
End Sub<hr />
Private Sub UserForm_Terminate()
  Call Unload(UserForm2)
  Call Unload(UserForm2)
End Sub<hr />, ----
[code.aspx?ID=41455 By Renfield]

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
492
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
2 juillet 2012
4
Achhh j'oubliais,
En remplacant textbox par listbox ont n'pas besoin de bouton
dans mon exposé, un click sur la liste suffit et évite les erreurs de saisie

Dans VBA il n'y a pas Form_load et Form_Unload mais
   Sub Worksheet_Activate() et Sub Worksheet_deActivate()
dans lequel ont peut mettre a peu prèt la même chose

Question 1 si tu est surt feuille 2 comment opérer une sélection ?
Question 2 Pourquoi cette fonction alors qu'il y a les onglets.

A+
louis
Messages postés
492
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
2 juillet 2012
4
ReSalut jrivet, ton poste n'était pas disponnible quand j'ai écrit le mien, d'ou réponse inadéquate.


J'avais bien pensé à un usr control mais mon avis qu'il n'est pas encore assé avancé pour l'appliquer.


cordialement 
louis
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Re,
Les UserForm ne sont pas des UserControl!!!! mais des form que tu peux ajouter a tes classeurs.Alt F11 pour aller dans l'IDE VBA mais ca tu sais faire click droit sur VBAProjet(NomClasseur) > Insertion > UserForm
Tu peux ensuite t'amuser comme VB6
Mais bon tant qu'on a pas de réponse de[auteurdetail.aspx?ID=427309 adamo901] , ca sert à rien de disserter.

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
4822
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
15 novembre 2016
15
Bonjour à tous,

Je pense (avis perso et n'engage que moi), qu'il vaudrait peut-êytre mieux partir sur l'idée soit d'une liste déroulante ou d'un combo, pour eviter comme le dit Nicko11, des erreurs de saisie..

A+
Exploreur

 
Messages postés
139
Date d'inscription
mardi 18 janvier 2005
Statut
Membre
Dernière intervention
8 décembre 2008

Merci pour vos reponses!
Je n'arrive toujours pas à attendre mon but.


(Pou eviter de la confusion , je travaille avec VB6)


je cherche exactement un tru du type : 

   Forms.Name = Text1.Text   
   Forms(i).Show

Contenu du Text1 pourra être le nom de n'import quelle form : frmLogin ou form1...

sauf que ces deux lignes telle qu'elle sont ne marchent pas
Messages postés
139
Date d'inscription
mardi 18 janvier 2005
Statut
Membre
Dernière intervention
8 décembre 2008

J'essai la fonction suivante mais elle ne marche pas!!


 



Private Sub AfficherFenetre()



      Dim f as Form



      f.Name = TextBox1.Text



      f.Show



End Sub
Messages postés
1141
Date d'inscription
mercredi 7 mars 2007
Statut
Membre
Dernière intervention
19 septembre 2007
3
application.Forms.Item(TextBox1.Text)  , ca existerait en VB6
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Salut,
Le petit bout de code que je te proposais devrait fonctionner mais la SEULE chose c'est qu'il faut au préalable charger TOUTES les feuilles

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
139
Date d'inscription
mardi 18 janvier 2005
Statut
Membre
Dernière intervention
8 décembre 2008

application.forms.item(TextBox1.Text) n'existe pas.

Merci jrivet pour toutes vos réponses, elles sont très interessantes seulement je n'arrive pas à résoudre mon problème avec.

pouvez vous me dire comment charger toutes les feuilles??
Messages postés
139
Date d'inscription
mardi 18 janvier 2005
Statut
Membre
Dernière intervention
8 décembre 2008

est il possible de charger les feuilles sans les afficher??
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Salut,
à la fin de chaque load tu fais Me.Hide ou Me.visible = False
Mais normalement tout ce que tu charges (sauf le form de départ) doit être invisible il me semble.

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
Salut adamo :

Ce que tu as écrit là :
Forms.Name = Text1.Text   
   Forms(i).Show

et là :
Private Sub AfficherFenetre() 
      Dim f as Form 
      f.Name = TextBox1.Text 
      f.Show

est rigoureusement impossible ! La propriété Name est en lecture seule !!!

Si tu veux ouvrir une Form en te référant en son som ( et à condition qu'elle soit chargée
) la seule chose possible est celle-ci

Private Sub Command1_Click()
   For Each frm In Forms
      If UCase(frm.Name) = UCase(Text2.Text) Then
        MsgBox frm.Name
        Load frm
        frm.Show
        Exit Sub
      End If
    Next
End Sub
Messages postés
139
Date d'inscription
mardi 18 janvier 2005
Statut
Membre
Dernière intervention
8 décembre 2008

C'est exactement la même solution que jrivet et je pense queje suis sur le point de l'accepter, mais!!
mais ne pensez vous pas que : charger toutes les fenêtre ne serait pas une bonne pratique!