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 :

Gestion de données Access <-> Listbox


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2010
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 49
    Par défaut Gestion de données Access <-> Listbox
    Bonjour à tous,

    Je suis entrain de faire une petite application ou je gère des données clients...

    J'ai un userform avec 2 Multipage.

    Sur le Multipage1, j'ai une ListBox (7 colonnes et x lignes) avec des données importées d'un fichier Access.

    Quand je fais un double clic sur une ligne de la listbox, ça me transfère les données de la ListBox dans des TextBox sur le MultiPage2 pour pouvoir modifier les données dans la base de données Access.

    Ex: La colonne 1 de la ligne doublecliquer dans le multipage 1, va dans la TextBox1 du Multipage2, etc... Ensuite je vais sur le MultiPage2 pour modifier le champs désiré puis je valide... Ca doit modifier ma base de données Access puis rafraichir ma ListBox sur ma MultiPage1...

    Mon problème est qu'à chaque fois ca me modifie toujours la première ligne de ma base Access et de ma ListBox...


    Si quelqu'un aurait une petite idée pour me déméler de tout ca...

    Merci par avance!

  2. #2
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonsoir,

    C'est peut-être parce que les contrôles zones de texte (TextBox) sont liés aux champs de la source de données du formulaire.

    Quand je fais un double clic sur une ligne de la listbox, ça me transfère les données de la ListBox dans des TextBox sur le MultiPage2
    En faisant cela (par du code je suppose) tu écrases l'enregistrement en cours.
    Par défaut c'est le premier enregistrement.

    Si ce n'est pas ça, précises ...
    - si le formulaire a une source de données
    - si les zones de textes sont liées à des champs de la source de données ou bien si elles sont indépendantes
    - si les zones de texte sont indépendantes, par quelle méthode mets-tu à jour les données dans la base.

    A+

  3. #3
    Membre averti
    Inscrit en
    Février 2010
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 49
    Par défaut
    Voici le code pour la modification:

    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
     
    Private Sub Image22_Click()
     
    'Procédure d'enregistrement
     
    Dim oRst As DAO.Recordset
    Dim oDb As DAO.Database
    Set oDb = DBEngine.OpenDatabase(ActiveWorkbook.Path & "\mabase.mdb")
    Set oRst = oDb.OpenRecordset("Matable", dbOpenTable)
        'Passe en mode modification
        oRst.Edit
     
     
        'Affecte la nouvelle valeur
        oRst.Fields("Champs1") = UserForm1.TextBox1.Value
        oRst.Fields("Champs2") = UserForm1.TextBox2.Value
        oRst.Fields("Champs3") = UserForm1.TextBox3.Value
        oRst.Fields("Champs4") = UserForm1.TextBox4.Value
        oRst.Fields("Champs5") = UserForm1.TextBox5.Value
        'Met à Jour
        oRst.Update
     
    'Libération des objets
    oRst.Close
    oDb.Close
    Set oRst = Nothing
    Set oDb = Nothing
     
    MsgBox ("Modification(s) enregistrée(s)")
    End Sub

  4. #4
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Ha ok. Je me disais bien que UserFrom ça sonnait Excel.

    Il faut positionner oRst sur le bon enregistrement, ou n'ouvrir oRst que sur l'enregistrement à modifier.

    Pour cela il faut un moyen d'identifier l'enregistrement.
    Y a-t-il une clé ?
    Si oui quel est le type du ou des champs de la clé ?

    A+

  5. #5
    Membre averti
    Inscrit en
    Février 2010
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 49
    Par défaut
    Non il n'y a pas de clefs, c'est une base de données toute simple

    Voilà à quoi ressemble ma mdb:

    N°----Champs1----Champs2----Champs3 ----Champs4----Champs5
    2-----xxxxxxxx-----aaaaaaa-----ttttttttt----qqqqqqq-----kkkkkkkk
    3-----yyyyyyy-----ssssssss-----nnnnnnn----xxxxxxxx-----mmmmm
    4-----zzzzzzzz-----ddddddd-----ccccccc----xxxxxxxx-----llllllllllllllllll

    Je pense qu'il faudrait que j'identifie le N° d'enregistrement de ma mdb pour modifier les bonnes choses... mais comment?

  6. #6
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bon, on va dire que le champ est unique (une valeur différente pour chaque enregistrement)
    J'espère que c'est bien un champ

    Sinon tu ajoutes un champ de type NuméroAuto.
    Ça s'incrémente tout seul.

    Positionnement sur l'enregistrement souhaité.
    On utilise la méthode FindFirst du recordset.
    Si j'ai bonne mémoire elle n'est pas disponible pour un recordset de type dbOpenTable, donc je change en dbOpenDynaset
    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
    Set oRst = oDb.OpenRecordset("Matable", dbOpenDynaset)
        ' Rechercher Enregistrement
        oRst.FindFirst "([N°])=" & "2"
        ' Si la recherche n'a pas echoué
        If Not oRst.NoMatch Then
            'Passe en mode modification
            oRst.Edit
     
            'Affecte la nouvelle valeur
            oRst.Fields("Champs1") = UserForm1.TextBox1.Value
            oRst.Fields("Champs2") = UserForm1.TextBox2.Value
            oRst.Fields("Champs3") = UserForm1.TextBox3.Value
            oRst.Fields("Champs4") = UserForm1.TextBox4.Value
            oRst.Fields("Champs5") = UserForm1.TextBox5.Value
            'Met à Jour
            oRst.Update
        End If
    'Libération des objets
    oRst.Close
    Dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        oRst.FindFirst "([N°])=" & "2"
    il te faudra remplacer "2" par le contenu de la colonne de ta ListBox correspondant au champ

    Sélection de l'enregistrement souhaité uniquement
    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
    strSql = "SELECT * FROM Matable WHERE ([N°])=" & "2"
    Set oRst = oDb.OpenRecordset(strSql, dbOpenDynaset)
        ' Si le recordset n'est pas vide
        If Not oRst.EOF Then
            'Passe en mode modification
            oRst.Edit
     
            'Affecte la nouvelle valeur
            oRst.Fields("Champs1") = UserForm1.TextBox1.Value
            oRst.Fields("Champs2") = UserForm1.TextBox2.Value
            oRst.Fields("Champs3") = UserForm1.TextBox3.Value
            oRst.Fields("Champs4") = UserForm1.TextBox4.Value
            oRst.Fields("Champs5") = UserForm1.TextBox5.Value
            'Met à Jour
            oRst.Update
        End If
    'Libération des objets
    oRst.Close
    Même remarque que précédemment, dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strSql = "SELECT * FROM Matable WHERE ([N°])=" & "2"
    il te faudra remplacer "2" par le contenu de la colonne de ta ListBox correspondant au champ


    Les deux méthodes aboutissent au même résultat.
    La deuxième est peut-être plus optimisée, dans le sens où le recordset ne contient que les données utiles.
    Si le champ est unique, le recordset ne contiendra qu'un seul enregistrement.

    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Gestion de données Access <-> Listbox
    Par hugues03 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 24/06/2010, 18h45
  2. Gestion d'une base de données Access en C++
    Par Mastero dans le forum Bibliothèques
    Réponses: 3
    Dernier message: 01/10/2008, 11h23
  3. Réponses: 1
    Dernier message: 09/11/2007, 11h46
  4. recuperer les données access dans une listbox
    Par inforlab dans le forum Windows Forms
    Réponses: 4
    Dernier message: 03/05/2007, 22h09
  5. java et la gestion des bases de donnée access
    Par alita dans le forum JDBC
    Réponses: 1
    Dernier message: 24/03/2007, 18h21

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