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 :

[VBA] accéder aux données d'une table


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 18
    Points
    18
    Par défaut [VBA] accéder aux données d'une table
    Bonjours.
    Après avoir lu les règles d'utilisation du forum, c'est avec circonspection que je pose cette question. J'ai beau avoir regardé le faq et les messages de ce forum, j'ai rien trouvé me permettant de résoudre ce problème (sûrement trop simple pour être posé, mais là, je galère)

    Donc en fait ce que je cherche, c'est en cliquant sur le bouton command1 du formulaire, accéder dans VBA à la case 1,1 de la table1 (ou une autre case, je suis pas contrariant...)
    Et ce qu'il me manque, c'est la syntaxe renvoyant le contenu de la case de la table sous VBA (et peut être aussi celle concernant le bouton, car lors de mes essais, il me renvoie une erreur avec mon "Private Sub Commande2_Click()" lorsque j'exécute le tout).

    Désolé de vous faire perdre votre temps pour ça, mais vraiment, je suis en panne. J'ai feuilleté pas mal de bouquins, et sites internet, et je n'ai pas encore vu un sujet parlant de ça.

    Merci

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour et bienvenue,
    Citation Envoyé par Schniko Voir le message
    Donc en fait ce que je cherche, c'est en cliquant sur le bouton command1 du formulaire, accéder dans VBA à la case 1,1 de la table1 (ou une autre case, je suis pas contrariant...)
    Et ce qu'il me manque, c'est la syntaxe renvoyant le contenu de la case de la table sous VBA (et peut être aussi celle concernant le bouton, car lors de mes essais, il me renvoie une erreur avec mon "Private Sub Commande2_Click()" lorsque j'exécute le tout).
    Peux-tu préciser ta demande ?

    Voilà ce que j'ai compris... Peux-tu confirmer que c'est correct ?

    (1) Un formulaire est ouvert, dans lequel tu as créé un contrôle bouton nommé Command1.

    (2) La table nommée Table1 est ouverte dans sa propre fenêtre (c'est une feuille de données).

    (3) Quand l'utilisateur clique sur le bouton Command1, le focus est placé sur la feuille de données qui affiche Table1, et plus précisément dans la 1ère cellule de la 1ère ligne.

    C'est bien ça ???
    _

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 18
    Points
    18
    Par défaut
    Merci d'avoir répondu si vite et pardon pour les imprécisions.

    Donc oui, mon problème est parfaitement celui que tu décris
    (même si je ne comprends pas tout à fait ce que tu appelles focus : je souhaites accéder à la une des case de la table afin
    -ou bien de l'affecter à une variable pour la traiter au cœur d'une autre fonction du programme vba
    -ou bien pour modifier son contenu)

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Citation Envoyé par Schniko Voir le message
    Donc oui, mon problème est parfaitement celui que tu décris
    (même si je ne comprends pas tout à fait ce que tu appelles focus :
    Donner le focus à une fenêtre signifie "rendre active cette fenêtre".

    Citation Envoyé par Schniko Voir le message
    je souhaites accéder à la une des case de la table afin
    -ou bien de l'affecter à une variable pour la traiter au cœur d'une autre fonction du programme vba
    -ou bien pour modifier son contenu)
    Cette démarche est plutôt originale.

    Habituellement avec Access, un concepteur crée un formulaire qui est directement lié à une source de données (par exemple une table) et les contrôles de ce formulaire donnent directement accès aux données.

    Aussi, je te demande si c'est vraiment ton but d'accéder aux données d'une table ouverte dans sa propre fenêtre.

    Si c'est bien ton but, je peux t'aider.
    Pour m'aider à être plus efficace dans mon appui, pourrais-tu nous donner ton code (même une ébauche, on n'est pas là pour critiquer ) ?

    Merci par avance.

    P.S. Au fait, es-tu débutant, initié, voire confirmé dans l'utilisation/programmation d'Access ?
    _

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 18
    Points
    18
    Par défaut
    En gros, ce que je cherche à faire, c'est d'utiliser le formulaire comme interface afin de stocker des données dans une table. Ces données vont ensuite servir de base pour un traitement statistique (effectué sous vba) et les stats obtenues vont permettre la création d'un graph renvoyé dans le formulaire.

    Pour l'instant, je m'intéresse à la partie qui fait le lien entre access et vba, soit la récupération et la réinjectation des données.

    Donc, euh dans la mesure ou je comprends le problème et access ainsi que ce que tu me dis (et je t'assures que même la somme des trois, c'est pas brillant ) oui,
    c'est vraiment mon but d'accéder aux données d'une table ouverte dans sa propre fenêtre.
    Quand à mon code, mais là, j'ai vraiment honte, car déjà je sais que la formulation que j'utilise n'existe pas (tout d'abord elle est trop évidente pour faire partie du langage informatique, et ensuite parcequ'elle ne marche pas). Mais bon, là voilà

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Commande1_Click()
        Dim var1 As Variant
        var1 = Table1.Cells(1,1)
    End Sub
    Voilà, comme je l'avais dit, c'est pas très glorieux (pour l'instant) Mais si cette étape (celle de récupérer les données) est passée, je pourrais alors m'attaquer au coeur de ce projet : leurs manipulations.

    Merci pour ton aide

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 18
    Points
    18
    Par défaut
    a et pardon : je suis débutant dans l'utilisation d'access (pour l'instant, j'ai encore le bouquin access pour les nuls ouvert sur mes genoux...)

  7. #7
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Citation Envoyé par Schniko Voir le message
    a et pardon : je suis débutant dans l'utilisation d'access (pour l'instant, j'ai encore le bouquin access pour les nuls ouvert sur mes genoux...)
    Et en VBA... es-tu un peu plus dégourdi ?

    Si tu veux accéder directement aux données d'une table (soit pour lire, soit pour écrire) à partir d'un programme VBA, alors il est 1.000 fois préférable d'utiliser une bibliothèque d'accès aux données.
    Connais-tu les bibliothèques DAO ou ADODB ?

    Il n'y a aucun intérêt à ouvrir une fenêtre sur cette table si l'utilisateur de ton application n'est pas concerné par cette fenêtre...

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 120
    Points : 88
    Points
    88
    Par défaut
    Cherches tu à te déplacer dans la table en utilisant des coordonnées genre bataille navale? ou cherches tu simplement à lire le contenu d'un champ d'un enregistrement précis?

    En principe on travail sur ce que l'on appelle des recordsets c'est à dire des jeux d'enregistrement issu de table ou de requetes et ensuite on déplace le pointeur sur la ligne et la colonne que l'on veut pour lire ou écrire dans le champs.

    Voici un exemple, ce code recherche dans une table client si le contenu d'un control dans un formulaire existe, si c'est le cas il affiche les résultats, sinon il propose de créer un nouvel enregistrement.



    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    Private Sub NomClientForm_AfterUpdate()
     
    Dim dbs As DAO.Database
    Dim rstCli As DAO.Recordset
    Dim rstCliTable As DAO.Recordset
    Dim strClient As String
    Dim strCrit As String
    Dim Reponse
     
    Set dbs = CurrentDb
    Set rstCli = dbs.OpenRecordset("T-Client", dbOpenSnapshot)
    Set rstCliTable = dbs.OpenRecordset("T-Client", dbOpenDynaset)
    strClient = Me!NomClientForm
    'MsgBox strClient
    With rstCli
     
        .MoveLast
        'création du critère de recherche
        strCrit = "nomclient like '*" & strClient & "*'"
        .FindFirst strCrit
     
    ' test s'il existe un enregistrement
        If .NoMatch Then
        Reponse = MsgBox("Aucun client de portant se nom n'est référencé, Voulez-vous l'ajouter à la base?", vbYesNo, "Confirmation")
        If Reponse = vbYes Then
        'création d'un nouvelle enregistrement
        rstCliTable.AddNew
        'remplissage des champs
     
        rstCliTable!NomClient = Me!NomClientForm
        'rstCliTable!PrenomClient = Me!PrenomClientForm
        'rstCliTable!AdrClient = Me!AdrClientForm
        'rstCliTable!AdrSuiteClient = Me!AdrSuiteClientForm
        'rstCliTable!CPClient = Me!CPClientForm
     
        'Sauvegarde du nouvel enregistrement
        rstCliTable.Update
        rstCliTable.MoveLast
        Me!CodeClient = rstCliTable!CodeClient
        MsgBox "" & rstCliTable!CodeClient
        End If
        Else
        'recherche tous les enregistrement correspondant aux critères
        Do While True
            MsgBox rstCli!NomClient
            .FindNext strCrit
        If .NoMatch Then Exit Do
     
        Loop
        End If
        End With
     
     
     
    End Sub

    Bon courage...

    Patrick

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 18
    Points
    18
    Par défaut
    Oui, je te rassure, je suis pas irrécupérable partout.

    Pour dao, je n'étais pas au courant de son importance. Après recherche (rapide) je suis tombé sur un site qui me donne en modifiant mon code quelque chose de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Commande1_Click()
        Dim var1 As Variant
        Dim table As Recordset
        Set table = dbAcc.OpenRecordset("Table1", dbOpenDynaset)
        var1 = table![Nom de la colonne 1]
    End Sub
    Le problème, c'est que c'est un coup dans le vent : je n'accède pas à la case que je veux. Je peux seulement choisir la colonne (et encore faudrait-il que le code soit bon)

    Donc en fait pour répondre à ta question, je ne suis pas familier avec le contenu de ces bibliothèques, mais je suis complètement de ton avis, leur utilisation me facilitera sûrement la vie sans me gêner.

    Merci pour ta patience

  10. #10
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Mais bon, je ne vais pas te faire languir plus longtemps avec mes remarques (bien que ce soit des mises en garde par rapport à de possibles mauvaix choix de conception)...

    Imaginons que tu veuilles travailler avec une table qui n'est pas encore ouverte.
    Il faut donc l'ouvrir.

    Ensuite, tu peux désigner une ligne qui deviendra l'enregistrement courant (par exemple la 3ème ligne)

    Pour ce qui est de lire ou modifier les données d'une "cellule" , il n'est hélas pas possible d'y faire référence sans que la feuille de données ne soit activée (elle doit avoir le focus). Cette limitation est due au fait que tu travailles directement dans la feuille de données d'une table.

    Donc il faut lui donner le focus.

    A partir de là, tu peux accéder à une cellule de cet enregistrement de 2 manières:
    (cas a) en utilisant le nom du champ (de la table) qui est affiché dans cette cellule,
    (cas b) en utilisant le numéro de colonne de la cellule (la première colonne=0).

    Dans tous les cas, le mieux est de donc de passer par l'objet Screen.ActiveDataSheet et sa collection Controls() qui donne accès aux cellules de la feuille de données (ici les cellules sont vues comme des contrôles).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ' Ouvrir la table
    DoCmd.OpenTable "Table1", acViewNormal, acEdit
     
    ' La ligne n°3 devient l'enregistrement courant
     docmd.GoToRecord acDataTable,"Table1", acGoTo, 3
     
    ' Donner le focus à la table
    DoCmd.SelectObject acTable, "Table1", False
     
    ' Cas a - Lire le contenu de la cellule en première colonne
    var = Screen.ActiveDatasheet.Controls(0)
     
    ' Cas b - Lire le contenu de la cellule correspondant au champ nommé "Champ1"
    var = Screen.ActiveDatasheet.Controls("Champ1")
    Bien sûr, toute cette présentation perd de son intérêt si tu utilises une bibliothèque d'accès aux données (DAO par exemple)
    _

  11. #11
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Si tu utilises DAO, il faut veiller à référencer la bibliothèque DAO.

    Ensuite, Access peut t'aider grâce à la propriété CurrentDB() qui donne directement accès un objet DAO.Database ouvert sur la base de données en cours.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Commande1_Click()
        Dim var1 As Variant
        Dim table As Recordset
     
        Set table = CurrentDB.OpenRecordset("Table1", dbOpenDynaset)
        var1 = table![Nom de la colonne 1]
     
     
    End Sub

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 120
    Points : 88
    Points
    88
    Par défaut
    ton code ouvre un recordset, mais après il faut déplacer le pointeur pour aller dans la colonne que tu veux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var1 = table![Nom de la colonne 1]
    ca permet de lire la colonne 1 d'une ligne, En fait il faut commencer par positionner ton pointeur
    sur le premier enregistrement du genre
    ensuite tu crées une boucle pour balayer les lignes de ta table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    with table
    do until .eof ' il fait la boucle jusqu'au dernier enregistrement
    ici tu mets le code que tu veux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    loop
    end with
    table. close ' pour fermer le recordset
    reprend l'exemple que je t'ai copier précedemment

    Cordialement

    Patrick

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 18
    Points
    18
    Par défaut
    Et bien merci beaucoup =JBO= pour ton aide. Je comprends pas encore tous les termes de la syntaxe, mais à partir de là, je devrait pouvoir m'en sortir. Quand à tes mises en gardes, et bien, ce n'est pas très surprenant : j'ai découvert que je devais faire ce projet il y a une semaine. Je ne connaissais pas access avant ça. Donc évidemment, je ne mesure pas encore toutes les possibilités ni tous les dangers.
    A et merci aussi à pkrvz pour son message.

    Bonne soirée.

  14. #14
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Ok !

    Je m'associe à pkrvz pour te souhaiter bon courage.

    =JBO=

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

Discussions similaires

  1. Accéder aux données d'une DLL
    Par MoscoBlade dans le forum MFC
    Réponses: 4
    Dernier message: 15/11/2006, 12h14
  2. [C#][AJAX] Accéder aux DropDownlist d'une table HTML
    Par actarus108 dans le forum ASP.NET
    Réponses: 5
    Dernier message: 27/10/2006, 11h38
  3. Accéder aux Select d'une table HTML
    Par actarus108 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 23/10/2006, 16h11
  4. [C#] Comment accéder aux données d'une Form ?
    Par cjacquel dans le forum Windows Forms
    Réponses: 5
    Dernier message: 28/07/2006, 11h55
  5. accéder aux colonnes d'une table différemment
    Par fab_hendrix dans le forum Langage SQL
    Réponses: 3
    Dernier message: 06/08/2005, 19h20

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