Liste déroulante de Tables

Liste déroulante de Tables - VB/VBA/VBS - Programmation

Marsh Posté le 28-04-2010 à 14:31:12    

Bonjour,  
 
J'ai une liste déroulante dans un Formulaire, sauf que j'aimerais ( en code VBA ) qu'au lieu qu'elle m'affiche par exemple, les différents enregistrement d'un champ, qu'elle m'affiche les différentes Tables ouvertes dans le Fichier Access où il y a le Formulaire que j'utilise.
Puis si je sélectionne une Table de la liste, que les noms des Champs de celle-ci s'affichent dans des zones textes distinctes ( ex : NomChamp1 dans ZoneTexte1, NomChamp2 dans ZoneTexte2 etc... )
 
J'utilise Access 2007 et cela fait seulement une semaine que j'ai découvert Access et le Visual Basic donc je suis un Débutant en la matière, mais je dois faire celà pour mon stage donc si vous avez des idées je suis preneur n'hésitez pas à bien détailler,
 
Merci d'avance pour votre aide
 
Coordialement, Alex

Reply

Marsh Posté le 28-04-2010 à 14:31:12   

Reply

Marsh Posté le 29-04-2010 à 13:59:24    

Hello
 
Déjà pour recuperer les tables, pas besoin de VBA.
Tu filtres la table MSysObjects, tu recuperes le valeur du champ Name où le type = 1
 
Comme tu n'as qu'un message a ton actif, on verra si tu reponds pour la partie VBA : recuperer les noms des champs de la table piochée.
 
Cordialement


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 29-04-2010 à 14:33:23    

Private Sub Form_load()
Dim t As TableDef, strTable As String
     For Each t In CurrentDb.TableDefs
         If Left(t.Name, 4) <> "MSys" And Left(t.Name, 1) <> "~" Then
             strTable = strTable & t.Name & ";"
         End If
     Next t
     Me.ListeTable.RowSourceType = "Liste valeurs"
     Me.ListeTable.RowSource = strTable
End Sub

c'est la procédure que j'ai mise pour pouvoir sélectionner les tables d'ouvertes. Ca à l'air de marcher, ensuite on m'a dit que je pouvais créer une Table temporaire, une table de travail quoi, qui contiendrait un Champ "NomTable" qui recevrait le nom de la table sélectionner avec la liste déroulante du Formulaire, un champ "NomChamp" qui recevrait le nom des champs de la Table puis un champ "Position Champ" pour les garder dans l'ordre. je l'ai fais avec de l'aide voici le code :  
 
Private Sub ListeTable_AfterUpdate()
 
Dim db As dao.Database: Set db = CurrentDb
 
db.Execute ("DELETE * FROM ParamSelectChamp;" ): 'Vide la table Param
 
Dim r As dao.Recordset: Set r = db.OpenRecordset("ParamSelectChamp" )
Dim t As dao.TableDef: Set t = db.TableDefs(Me.ListeTable): 'Pointe sur l'objet TableDef correspondant à la table choisie.
Dim f As dao.Field: For Each f In t.Fields: 'Parcours la liste des champs qui composent la table choisie
  With r
     .AddNew: 'Crée un nouvel enregistrement dans la table ParamSelectChamp
     ![NomTable] = t.Name: 'Met le nom de la table dans le champ [NomTable]
     ![NomChamp] = f.Name: 'Met le nom du champ dans le champ [NomChamp]
     ![PositionChamp] = f.OrdinalPosition: 'Met la position du champ dans le champ [PositionChamp]
   
     .Update
     
  End With
Next f
 
r.Close: Set r = Nothing: 'Ferme la ta table temporaire et libère la mémoire utilisée
db.Close: Set db = Nothing: 'Libère la mémoire utilisée
Me.Recalc: 'Force l'affichage du form à se mettre à jour.
 
End Sub

 
"ListeTable" c'est le nom de ma liste déroulante, et ça marche également ensuite pour recopier le nom des champs du Champ "NomChamp" de la Table Temporaire, dans les zones textes je sais pas trop comment m'y prendre...

Reply

Marsh Posté le 29-04-2010 à 14:35:34    

alex'78 a écrit :


Private Sub ListeTable_AfterUpdate()
...
"ListeTable" c'est le nom de ma liste déroulante, et ça marche également ensuite pour recopier le nom des champs du Champ "NomChamp" de la Table Temporaire, dans les zones textes je sais pas trop comment m'y prendre...


 
Euh j'ai pas compris la question...?  :heink:


Message édité par SuppotDeSaTante le 29-04-2010 à 14:36:51

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 29-04-2010 à 14:56:01    

C'est pas facile à expliquer sans image, en fait dans mon Formulaire Il y a une Liste déroulante qui au lieu de lister le contenu de Tables, liste les Tables elles-memes genre Table0 Table1 Table2 Table3, et donc je sélectionne la Table sur laquelle je souhaite faire des tris, ou des tests.
 
Et ces tris, j'aimerais les faire selon les Champs de ce Tables, j'ai donc mis des Zones de texte dans le Formulaire, qui sont là pour recevoir le Nom des champs de la Table que j'ai Sélectionné, et ça je sais pas trop comment le faire..
 
Si c'est toujours pas clair je link ce que j'ai posté, dessus il y a des images et les codes : http://www.developpez.net/forums/d [...] te-tables/
 
Voila j'espère que ce sera plus clair après avoir lu ça.

Reply

Marsh Posté le 29-04-2010 à 15:57:22    

N'etant pas inscrit sur ce site, je n'ai pas accès aux images.
 
Donc comme je l'ai dit plus haut, pour recuperer les tables, pas besoin de VBA, une simple requete dans ta pioche pointant sur la table systeme MSysObjects et ca roule !
 
Pour ce faire :
Dans la propriété Contenu de ta pioche :
SELECT MSysObjects.Name, MSysObjects.Type FROM MSysObjects WHERE ((MSysObjects.Type)=1) ORDER BY MSysObjects.Name;
 
Tu auras donc les tables de ta base dans ta pioche, sans passer par du code.
 
 
Ensuite pour recuperer les champs de la table selectionné, il faut deja savoir combien tu as prevu de zone de texte. Si tu prevois 4 zones de textes, et que tu as 30 champs ca va poser souci.
 
Bref, donc ce que tu veux, c'est dans
TextBox1 mettre le champ1
TextBox2 mettre le champ2
TextBox3 mettre le champ3
Etc.
 
Alors, je pars du principe que :
ton formulaire se nomme Formulaire1
Tes TextBox se nomment TextBox1, TextBox2, TextBox3 etc.
Que ta pioche se nomme ListeTable
 
En mettant ce code ca fonctionne, je recupere bien, dans des zones de texte le nom des champs de mes tables
A mettre sur l'evenemment Apres MAJde ta pioche

Code :
  1. Private Sub ListeTable_AfterUpdate()
  2. 'Renvoi en cas d'erreur
  3.     On Error GoTo erreur
  4. 'On ouvre un recordset de la table sélectionnée dns la pioche
  5.     Set TPioche = CurrentDb.OpenRecordset(Forms("Formulaire1" )("ListeTable" ))
  6. 'On recupere le nombre de champ de la pioche pour notre future boucle |ca en fait je l'ai geré avec Each _
  7. donc on en a pas besoin mais je le laisse, ca peut te servir peut etre apres.
  8.     NbChamp = TPioche.Fields.Count
  9. 'on initialise un compteur, pour le numero qui suit "TextBox" qui sont nos zones de texte _
  10. Par exemple TextBox1 va prendre le champ1, TextBox2 va prendre le champ2 etc.
  11.     Cpteur = 1
  12. 'Notre boucle qui va aller regarder chaque champ et mettre le nom du champ _
  13. dans une zone de texte
  14.     For Each Champs In TPioche.Fields
  15.         'On met dans la textbox1/2/3 etc. le champ1/2/3 etc.
  16.         'On met une string TextBox suivi de la variable Cpteur qui va contenir 1/2/3/4/5 etc.
  17.             Forms("Formulaire1" )("TextBox" & Cpteur) = Champs.Name
  18.         'On incremente notre variable, ce qui va permettre de passer a la TextBox suivante
  19.             Cpteur = Cpteur + 1
  20.     Next
  21.    
  22. 'Gestion d'erreur
  23. erreur:
  24.     'affiche l'erreur, a toi apres de le gerer
  25.     MsgBox Err.Number & Chr(13) & Chr(10) & Err.Description
  26.    
  27. End Sub


 
La preuve en image
http://dje69r.free.fr/alex78.jpg


Message édité par SuppotDeSaTante le 29-04-2010 à 16:02:17

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 29-04-2010 à 16:41:10    

Haaaa ouai ça fonctionne très bien ça, merci beaucoup, juste une question, si aprèsMaj, il copie tout bien comme il faut mais qu'il me met la MsgBox avec "0" dedans, ça veut dire qu'il y a une erreur c ça ? si oui je vois pas laquelle :s

Reply

Marsh Posté le 29-04-2010 à 16:44:24    

Oups j'ai oublié un truc...
Mea Culpa  [:plat00n]
 
En fait il passe dans erreur: vu que j'ai oublié de mettre un Exit Sub
Sans exit sub, il lit tout a la suite, donc il passe dans erreur, et affiche un message sans erreur, d'où le 0
 
Voila corrigé :

Code :
  1. Private Sub ListeTable_AfterUpdate()
  2. 'Renvoi en cas d'erreur
  3.     On Error GoTo erreur
  4. 'On ouvre un recordset de la table sélectionnée dns la pioche
  5.     Set TPioche = CurrentDb.OpenRecordset(Forms("Formulaire1" )("ListeTable" ))
  6. 'On recupere le nombre de champ de la pioche pour notre future boucle |ca en fait je l'ai geré avec Each _
  7. donc on en a pas besoin mais je le laisse, ca peut te servir peut etre apres.
  8.     NbChamp = TPioche.Fields.Count
  9. 'on initialise un compteur, pour le numero qui suit "TextBox" qui sont nos zones de texte _
  10. Par exemple TextBox1 va prendre le champ1, TextBox2 va prendre le champ2 etc.
  11.     Cpteur = 1
  12. 'Notre boucle qui va aller regarder chaque champ et mettre le nom du champ _
  13. dans une zone de texte
  14.     For Each Champs In TPioche.Fields
  15.         'On met dans la textbox1/2/3 etc. le champ1/2/3 etc.
  16.         'On met une string TextBox suivi de la variable Cpteur qui va contenir 1/2/3/4/5 etc.
  17.             Forms("Formulaire1" )("TextBox" & Cpteur) = Champs.Name
  18.         'On incremente notre variable, ce qui va permettre de passer a la TextBox suivante
  19.             Cpteur = Cpteur + 1
  20.     Next
  21. 'On finit le code sans passer par "erreur"
  22. Exit Sub
  23.  
  24. 'Gestion d'erreur
  25. erreur:
  26.     'affiche l'erreur, a toi apres de le gerer
  27.     MsgBox Err.Number & Chr(13) & Chr(10) & Err.Description
  28.  
  29. End Sub


Message édité par SuppotDeSaTante le 29-04-2010 à 16:50:17

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 30-04-2010 à 14:28:45    

Merci ça marche très bien, après j'ai une question, c'est possible de lier un Formulaire se trouvant par exemple dans le groupe "Objets Non Associés" avec une Table se trouvant dans le groupe "Table" ?  
 
Parce que dans mon formulaire, en face de chaqu'un des noms de Champ, il y a d'autres zones de texte ou listes déroulantes ou par exemple je choisi une Date "03/04/2005" un comparateur ">" pour avoir tt les dates supérieures à celle là ensuite je clique sur un bouton qui ouvre une requête, sauf que la requête se base sur la Table se trouvant dans le groupe "Table" donc bah je crois que ça pose problème lorsque je lui dis de lire les valeurs des zones de mon formulaire :s..
 
Si tu as une idée de la manière de procéder, peut-être qu'il y a + simple, peut-être que je me plante complètement, si tu as une solution ce serait super ^^

Reply

Marsh Posté le 30-04-2010 à 14:52:46    

Fais un screen de ton formulaire car la je ne pige pas grand chose...
 
En fait ce que tu mets dans les textbox, va te permettre de faire des filtres ?


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 30-04-2010 à 14:52:46   

Reply

Marsh Posté le 30-04-2010 à 15:10:19    

Oui en effet c'est pour filtrer, trier certaines informations de la base de données, ensuite en bas de ce Formulaire il a un bouton "Afficher Liste" j'ai rien mis dessus encore.
( on fait comment sur ce forum pour joindre une image ?  :??: le screen n'est pas sur un site x) )

Reply

Marsh Posté le 30-04-2010 à 15:44:08    

Tu montes ton image sur un site, par exemple ici : http://imageshack.us/
 
Et tu la mets entre balise [img]


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 30-04-2010 à 15:51:15    

http://img37.imageshack.us/img37/9263/choixdevisualisation.jpg
 
Voila

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed