IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Liste Déroulante, Tables


Sujet :

VBA Access

  1. #1
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 16
    Par défaut Liste Déroulante, Tables
    Bonjour,

    Dans le cadre de mon stage, je dois crée via des formulaires une espèce d'IHM qui permettrait aux utilisateurs de choisir une Table parmis d'autres afin de réaliser des tests et/ou des tris pour ensuite les afficher soit sous forme de liste soit sous forme de graphique.
    La Première phase était de pouvoir séléctionner et ouvrir son Fichier, c'est fait (merci aux internautes de ce forum), maintenant je travaille sur le formulaire des tests et tris et ayant découvert Access et le Visual basic il y a une semaine, je galère un peu (bcp) ^^".

    Le Formulaire est sous cette forme :

    Comme vous le voyez en haut il ya une liste déroulante devant "Tables", c'est pour selectionner la Table désirée (qui serait soit déja ouverte dans le fichier access où il y a ce formulaire, soit ouverte dans un autre fichier access je me tate encore), et en fait ce que je voudrais c'est un code vba pour que lorsque la Table est sélectionnée, le Nom des Champs apparaissent dans les zones de texte de la colonne "Champ" sur l'image.

    Voila j'espère que j'ai été clair, n'hésitez pas à bcp détailler car je suis vraiment débutant en matière de codes VBA.. Merci d'avance pour votre aide.

    Alex
    Images attachées Images attachées  

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Pourqoui ne pas former tes utilisateurs à l'éditeur de requête d'Access qui fait cela déjà très bien ?

    Comme je pense que tu ne peux pas :-), je procéderai comme ceci :

    Table Param :
    NomTable
    NomChamp

    PositionChamp (ça c'est pour garder les champs dans l'ordre de la table).
    Autres champs utiles.

    puis avec le VBA suivant sur le AfterUpdate de ta liste de sélection de table.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    dim db as dao.database:set db=currentdb
     
    db.Execute("DELETE * FROM Param;"):'Vide la table Param
     
    dim r as dao.recordset:set r=db.openrecordset("Param")
     
    dim t as dao.tabledef: set t=db.tabledefs("Param")
     
    dim f as dao.field: for each f in t.fields
      with r
         .addnew
         ![NomTable]=t.name
         ![NomChamp]=f.name
         ![PositionChamps]=f.OrdinalPosition
         .update
      end with
    next f
     
    r.close:set r=nothing
    db.close:set db=nothing
    me.recalc:'Force l'affichage du form à se mettre à jour.
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 16
    Par défaut
    Désolé mais je ne comprends pas ce que tu veux dire ici :
    Citation Envoyé par marot_r Voir le message
    Table Param :
    NomTable
    NomChamp

    PositionChamp (ça c'est pour garder les champs dans l'ordre de la table).
    Autres champs utiles.
    Ça doit être judicieux mais c moi le problème je comprends pas ^^", il faut recrée une table ? changé les paramètres d'une Table ? si oui comment etc.. enfin voila il faut prendre en compte que j'ai découvert Access et le VBA il y a quelques jours :s.. si tu pouvais juste m'expliquer un peu + en détail stp ce paragraphe ce serait nickel merci

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Citation Envoyé par Alex'78 Voir le message
    Ça doit être judicieux
    Merci :-)

    mais c moi le problème je comprends pas ^^",
    Ouais, ça se pourrait :-) mais je pense plutôt que je ne l'ai pas formulé de manière à ce que tu le conpreine.

    Il faut que tu crée une table (que j'ai appellé Param mais ce serait mieux de mettre un nom plus significatif du genre ParamSelectionChamp ou autre) selon le modèle approximatif (à enrichir et adapter pour tes besoins) que j'ai mis dans mon post précédent. Cette table est une table temporaire (ou de travail) qui va te permettre d'enregistrer les noms des champs dans la table que tu as choisi.

    Dans le formulaire que tu as mis en exemple, il y a une liste déroulante qui présente la liste des tables disponibles. Il faut associer le code que j'ai posté (là aussi à adapter pour répondre exactement à tes besoins) à l'événement Après Mise à jour de cette liste (clique bouton droit sur la liste, choix 'propriété', onglet 'événements', choix 'Après MAJ', type 'Procédure événementielle').

    Le code va vider la table temporaire puis y ajouter la liste des champs de la table choisie. Si tu associe ton écran à la table Param alors tu pourras directement entrer tes autres infos dans Param et l'exploiter ultérieurement.

    Ceci dit pour débuter tu n'as pas choisi un sujet facile. C'est de la programmation jugée comme avancée ce que tu fais, donc n'hésite pas à poser toutes les questions qui pourraient t'aider à avancer.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  5. #5
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 16
    Par défaut
    Merci de m'expliquer en détail je comprends mieux, le sujet en fait je ne l'ai pas vraiment choisi, je crois je n'ai jamais autant utilisé la touche F1 de toute ma vie ^^.

    Et par ailleurs je crois que je me suis mal expliqué dans mon premier post, la liste déroulante qui présente la liste des tables disponibles elle est pas encore crée, là si je clique sur la flèche il n'y à rien, l'affichage de la liste des tables disponibles c'est justement ce que je cherche à faire, et ce que tu m'expliques en fait bah c'est la deuxième partie de ce que je veux faire :s.

    J'ai quand même crée la table temporaire nommé "ParamSelectChamp" je lui ai mis 4 Champs (Champ1, Champ2, Champ3 et Champ4) pour tester pour le moment. J'ai aussi copié ton code là où tu m'as dis.
    Du coup excuse moi d'avoir mal exposer le sujet ^^", est-ce que tu aurais une idée pour la liste déroulante ? on reprendra ce que tu m'expliquais plus tard.

  6. #6
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 16
    Par défaut
    Suite à des recherches j'ai trouvé ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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
    ListeTable étant le nom de ma zone de liste déroulante, au début il n'y avait que "IF Left(t.Name, 4) <> "MSys" Then etc..." et ça m'affichait mes tables ouvertes mais plein d'autres truc du style "~TMPC..." alors j'ai rajouté cke j'ai mis après et bon bah ça m'affiche que mes tables donc je suppose que c'est bon de ce coté là.

    Maintenant reste encore ton code et ce que tu m'expliquais, j'ai pas très bien compris, par exemple par quoi je dois remplacer "NomTable" "NomChamp" "PositionChamp" ds le code, et puis la logique du code, je vois pas comment il va recopier le nom des Champs de la table inscrite dans ListeTable ( disons que le nom de la table inscrite soit Table0 et que cette table contient les colonnes "N°" "Date" "Contact" ) dans chaque Zone de Texte de la Colonne "Champ" de mon Formulaire ...

    Si tu peux m'expliquer tout ça ce serait super =)

    merci à toute

  7. #7
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Félcitation pour ta liste de table c'est exactement comme cela que j'aurais fait.

    Je reposte le code et je commente et je m'appercois que j'ai fait quelques petites erreurs :-( désolé.

    je suppose que ta table ParamSelectChamp a la structure suivante :
    NomTable
    NomChamp
    PositionChamp (ça c'est pour garder les champs dans l'ordre de la table).
    Autres champs utiles.

    Si elle ne l'a pas elle devrait avoir une structure proche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    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 enr 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.
    Grâce au code tu vas avoir un enregistrement dans la table ParamSelectChamp pour chacun des champs de la table choisie. Via ton écran tu vas pouvoir manipuler tes données en complétant tes zones de saisie.
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  8. #8
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 16
    Par défaut
    Bonsoir,

    J'ai bien rentré ton code, et donc lorsque j'ouvre la table ParamSelectChamp j'ai bien ce que tu m'as dis un enregistrement pour chaque Champ de la table choisie =). ( Voir Image )

    Par contre, ensuite je vois pas comment faire pour que chaque enregistrement du Champ "NomChamp" qui sont donc les champs de la table choisie, soit mis dans chaque zone de texte de mon Formulaire "Choix de Visualisation" dans la Colonne "Champ" entre "Activation" et "Test" (Voir Image de mon 1er Post ).
    Je fais une procédure événementielle AprèsMAJ sur chaque zone de Texte pour qu'elle recopie ce qu'il y a dans l'enregistrement correspondant ? je pourrais mais je connais pas la syntaxe..
    Tu as une idée ?

    Merci beaucoup pour ton aide jusqu'à présent.
    Images attachées Images attachées  

  9. #9
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Il faut que tu fasses un "formulaire lié" donc le plus simple est de mettre dans la table ParamSelecChamp un champ pour chque information dont tu as besoin :

    EstActive (Type Oui/Non)
    Test1 (type Texte)
    Valeur1 (type texte)
    Operateur (type texte) affichage par liste déroulante présentant Et ou Ou (moins direct que des cases à cocher mais beaucoup plus facile a utiliser après)
    Test2 (type Texte)
    Valeur2 (type texte)

    etc...

    Ensuite tu appelles l'assistant de création de formulaire utilisant la table ParamSelecChamp. L'assitant va te guider pas à pas et tu vas facilement obtenir un formulaire lié. Ensuite tu pourras ajouter ta sélection de table à l'entête du nouveau formulaire.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  10. #10
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 16
    Par défaut
    Salut,

    J'ai parcouru plusieurs forums et on m'a posté un truc très interessant qui permet de faire ce que je veux sans passer par du code trop compliqué j'te link ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    Private Sub ListeTable_AfterUpdate()
     
    'Renvoi en cas d'erreur
        On Error GoTo erreur
     
    'On ouvre un recordset de la table sélectionnée dns la pioche
        Set TPioche = CurrentDb.OpenRecordset(Forms("Choix de Visualisation")("ListeTable"))
     
    'On recupere le nombre de champ de la pioche pour notre future boucle |ca en fait je l'ai geré avec Each _
    donc on en a pas besoin mais je le laisse, ca peut te servir peut etre apres.
        NbChamp = TPioche.Fields.Count
     
    'on initialise un compteur, pour le numero qui suit "TextBox" qui sont nos zones de texte _
    Par exemple TextBox1 va prendre le champ1, TextBox2 va prendre le champ2 etc.
        Cpteur = 1
     
    'Notre boucle qui va aller regarder chaque champ et mettre le nom du champ _
    dans une zone de texte
        For Each Champs In TPioche.Fields
            'On met dans la textbox1/2/3 etc. le champ1/2/3 etc.
            'On met une string TextBox suivi de la variable Cpteur qui va contenir 1/2/3/4/5 etc.
                Forms("Choix de Visualisation")("Champ" & Cpteur) = Champs.Name
            'On incremente notre variable, ce qui va permettre de passer a la TextBox suivante
                Cpteur = Cpteur + 1
        Next
    'On finit le code sans passer par "erreur"
        Exit Sub
     
    'Gestion d'erreur
    erreur:
        'affiche l'erreur, a toi apres de le gerer
        MsgBox Err.Number & Chr(13) & Chr(10) & Err.Description
     
    End Sub
    Celà me recopie le Nom des Champs ds les Zones de Texte et pour la liste déroulante de table on m'a pas fait passer par du code, fallait juste mettre ça : "SELECT MSysObjects.Name, MSysObjects.Type FROM MSysObjects WHERE ((MSysObjects.Type)=1) ORDER BY MSysObjects.Name;" dans la partie Contenu de la zone de liste. Et tout marche comme je voulais, j'aimerais savoir ce que tu penses de ça ? si ça te semble bien solide comme méthode.

    Ensuite on ce qui concerne les autres parties de mon Formulaire bah j'ai essayé de faire une requête pour afficher par exemple une liste des dates d'incident supérieures au "03/05/2008", sauf que déja le SQL je connais rien du tout x), et puis la requête se base sur la Table correspondante or celle-ci n'est pas liée à mon Formulaire alors ça pose problème je crois nan ? Y a-t-il un moyen de lier une Table se trouvant par exemple ds le groupe "Table" avec un Formulaire se trouvant par exemple ds le groupe "Objets Non Associés" ? ou bien s'il y a d'autres solutions..

  11. #11
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Celà me recopie le Nom des Champs ds les Zones de Texte et pour la liste déroulante de table on m'a pas fait passer par du code, fallait juste mettre ça : "SELECT MSysObjects.Name, MSysObjects.Type FROM MSysObjects WHERE ((MSysObjects.Type)=1) ORDER BY MSysObjects.Name;" dans la partie Contenu de la zone de liste. Et tout marche comme je voulais, j'aimerais savoir ce que tu penses de ça ? si ça te semble bien solide comme méthode.
    C'est une autre méthode pour le faire cela évite la création de la liste ce qui est une bonne chose.

    Ensuite on ce qui concerne les autres parties de mon Formulaire bah j'ai essayé de faire une requête pour afficher par exemple une liste des dates d'incident supérieures au "03/05/2008", sauf que déja le SQL je connais rien du tout x), et puis la requête se base sur la Table correspondante or celle-ci n'est pas liée à mon Formulaire alors ça pose problème je crois nan ? Y a-t-il un moyen de lier une Table se trouvant par exemple ds le groupe "Table" avec un Formulaire se trouvant par exemple ds le groupe "Objets Non Associés" ? ou bien s'il y a d'autres solutions..
    Il va falloir faire du SQL à partir de la table puis ouvrir la requête résultante. Comme je te l'ai dit ce n'est pas vraiment simple.

    Ne peux-tu vraiment pas utiliser l'éditeur de requête d'Access ?

    Une solution que j'avais mis en oeuvre était de faire une BD d'intérogation qui se relie à tes tables de production. Dans cette BD je faisait des requêtes qui présentait mes tables en mode lecture seule et les utilisateurs pouvaient utiliser toutes la puissance de Access sans que j'ai a réécrire Acccess.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

Discussions similaires

  1. Liste déroulante éditable et mise à jour table
    Par Nean dans le forum Bases de données
    Réponses: 11
    Dernier message: 02/12/2007, 23h03
  2. Réponses: 2
    Dernier message: 27/12/2005, 20h09
  3. Réponses: 14
    Dernier message: 13/12/2005, 10h58
  4. [MySQL] Liste déroulante provenant d'une table
    Par richton95 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 29/11/2005, 10h07
  5. Réponses: 1
    Dernier message: 24/10/2005, 21h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo