Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/01/2012, 11h42   #1
Nouveau Membre du Club
 
Inscription : mars 2010
Messages : 130
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : mars 2010
Messages : 130
Points : 38
Points : 38
Par défaut Récupération des données d'une requete

Bonjour,

je voudrais récupérer dans mon code vba les données trouvées par une requete générérée en Access (2003). Je veux balayer ligne après ligne et récupérer certaines valeurs de certains champ. Quelqu'un peut m'indiquer comment faire ?
Je précise que je n'y connais que très peu en SQL (j'attends une micro formation)

Merci
Taiby
Taiby est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 19h47   #2
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 479
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 479
Points : 7 568
Points : 7 568
La bonne nouvelle c'est avec Access tu n'as pas besoin de t'y connaître en SQL. Grâce à l'outil de conception de requête tu peux faire des requêtes très complexes sans même savoir ce que SELECT signifie :-).

Bon, on s'entend que cela aide quand même d'être capable de lire du SQL.

À part cela voici un bout de code VBA qui fait ce que tu demandes :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
dim taVariable1 as variant 
'De préférence utiliser le bon type (ex : date pour une date, long pour un entier long)
' Variant est un foure-tout et le compilateur ne peut pas vérifier si ce que tu assignes est du bon type. 
'  Cela peut être sources de bug difficiles à trouver.
dim taVariable2 as variant
 
dim db as dao.database:set db=currentdb
dim r as doa.recordset:set r=db.openRecordset("NomTaSource") 
'TaSource peut être une table ou une requête crée avec l'éditeur de requête. 
' Cela peut aussi être une chaîne SQL comme SELECT * FROM TaTable,
' mais personnellement je préfère ne pas mélanger SQL et code VBA.
 
do while not r.eof
   taVariable1=r![NomTonChamp1]
   taVariable2=r![NomTonChamp2]
   r.movenext
loop
 
r.close:set r=nothing 'Libère la mémoire utilisée
set bd=nothing 'Libère la mémoire utilisée
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.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 08h38   #3
Nouveau Membre du Club
 
Inscription : mars 2010
Messages : 130
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : mars 2010
Messages : 130
Points : 38
Points : 38
Merci pour ton coup de main, je viens de copier le code que tu m'as fourni et adapté à mon besoin (juste en changeant le NomTaSource et NomTonChamp) mais j'ai une erreur lors de l'exécution :

Type défini par l'utilisateur non défini sur r As doa.Recordset
Taiby est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 09h03   #4
Rédacteur/Modérateur
 
Avatar de Jeannot45
 
Homme Jean BALLAT
Inscription : octobre 2004
Messages : 2 856
Détails du profil
Informations personnelles :
Nom : Homme Jean BALLAT
Âge : 63
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : octobre 2004
Messages : 2 856
Points : 5 220
Points : 5 220


Il te faut ajouter dans les références (sous VBE, dans le menu Outils) l'appel à la bibliothèque Microsoft DAO 3.6.

Pour plus d'informations sur DAO, voici un tuto intéressant à consulter :
Définition et manipulation de données avec DAO

Bonne lecture
__________________
Jeannot

Liens Office indispensables à visiter: Cours (Tutos), F.A.Q., [B]Sources VBA

Ne posez pas de questions par MP, je n'ai pas le temps d'y répondre
Jeannot45 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 09h13   #5
Nouveau Membre du Club
 
Inscription : mars 2010
Messages : 130
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : mars 2010
Messages : 130
Points : 38
Points : 38
Cette référence est déjà cochée
Taiby est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 09h17   #6
Nouveau Membre du Club
 
Inscription : mars 2010
Messages : 130
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : mars 2010
Messages : 130
Points : 38
Points : 38
Je viens de trouver le problème, marot_r a écrit "doa" dans son code au lieu de "dao".
Bon cela ne marche toujours pas, j'ai un autre soucis mais je vais chercher un peu avant d'en parler ici.
Taiby est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 09h26   #7
Nouveau Membre du Club
 
Inscription : mars 2010
Messages : 130
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : mars 2010
Messages : 130
Points : 38
Points : 38
Quand je mets un nom d'une de mes tables cela fonctionne très bien, je récupère toutes les données voulues dans la boucle, mais lorsque je mets le nom de ma requet j'ai le message d'erreur suivant "trop peu de paramètres, 1 attendu".

C'est une requete qui demande un numéro lors de son ouverture, vous pensez que cela vient de là et qu'il faudrait rajouter un élément derrière mon nom de requete ?
Taiby est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 09h55   #8
Rédacteur/Modérateur
 
Avatar de Jeannot45
 
Homme Jean BALLAT
Inscription : octobre 2004
Messages : 2 856
Détails du profil
Informations personnelles :
Nom : Homme Jean BALLAT
Âge : 63
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : octobre 2004
Messages : 2 856
Points : 5 220
Points : 5 220
Re,

Tu as mis le doigt sur le problème. En effet, si ta requête attend une valeur à l'exécution, il faut que celle-ci soit connue avant l'exécution.

Tu peux remplacer le nom de ta requete par la syntaxe SQL de celle-ci. Tu pourras donc intervenir sur la clause WHERE

Tu peux récupérer le code SQL pr un copier/coller (voir le tuto : Créer une Requete)
__________________
Jeannot

Liens Office indispensables à visiter: Cours (Tutos), F.A.Q., [B]Sources VBA

Ne posez pas de questions par MP, je n'ai pas le temps d'y répondre
Jeannot45 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 09h59   #9
Nouveau Membre du Club
 
Inscription : mars 2010
Messages : 130
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : mars 2010
Messages : 130
Points : 38
Points : 38
Mais je ne comprends pas, ma requete est déjà exécutée lorsque mon code intervient. En fait ce que je veux faire c'est récupérer les données affichées par ma requete.
Je dit cela sans savoir si c'est possible, peut-être que je prends le problème à l'envers ?
Taiby est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 10h02   #10
Rédacteur/Modérateur
 
Avatar de Jeannot45
 
Homme Jean BALLAT
Inscription : octobre 2004
Messages : 2 856
Détails du profil
Informations personnelles :
Nom : Homme Jean BALLAT
Âge : 63
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : octobre 2004
Messages : 2 856
Points : 5 220
Points : 5 220
Re,

Dans ce cas, tu peux mettre ta requete en tant que source d'un formulaire ou un état et tu visualiseras tous les enregistrements.
__________________
Jeannot

Liens Office indispensables à visiter: Cours (Tutos), F.A.Q., [B]Sources VBA

Ne posez pas de questions par MP, je n'ai pas le temps d'y répondre
Jeannot45 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 10h13   #11
Nouveau Membre du Club
 
Inscription : mars 2010
Messages : 130
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : mars 2010
Messages : 130
Points : 38
Points : 38
Désolé si j'ai "la comprenette" difficile mais je ne veux pas visualiser mes résultats, ils sont déjà visibles dans un formulaire, ce que je veux c'est écrire le code qui va bien pour récupérer les données affichées dans ce formulaire par la requette. Je veux pouvoir récupérer le champs "bidule" de la ligne dont le champ "numéro" est 3 par exemple...
Taiby est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2012, 08h26   #12
Rédacteur/Modérateur
 
Avatar de Jeannot45
 
Homme Jean BALLAT
Inscription : octobre 2004
Messages : 2 856
Détails du profil
Informations personnelles :
Nom : Homme Jean BALLAT
Âge : 63
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : octobre 2004
Messages : 2 856
Points : 5 220
Points : 5 220


Puisque les données sont déjà affichées dans le formulaire, tu peux relire les enregistrements grace à :

Voici ce qu'en dit
Citation:
Envoyé par Aide Access
La propriété RecordsetClone vous permet de faire référence à l'objet Recordset d'un formulaire spécifié par la propriété RecordSource de ce formulaire.
Exemple :
Code VBA :
1
2
3
4
5
6
7
8
9
10
11
 
Sub Print_Field_Names()
    Dim rst As Recordset, intI As Integer
    Dim fld As Field
 
    Set rst = Me.RecordsetClone
    For Each fld in rst.Fields
        ' Print field names.
        Debug.Print fld.Name
    Next
End Sub
Dans cet exemple, VBA affiche le nom de chaque champ. Tu peux adapter le code pour relire tous tes enregistrements

Code :
1
2
3
4
5
6
7
8
9
10
11
 
With rst
    Do While Not .EOF
        If .Fields("Numero") = 3 Then
           ...
        Else
           ...
        End If
    .MoveNext
    Loop
End With
A toi de jouer
Bonne continuation
__________________
Jeannot

Liens Office indispensables à visiter: Cours (Tutos), F.A.Q., [B]Sources VBA

Ne posez pas de questions par MP, je n'ai pas le temps d'y répondre
Jeannot45 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2012, 09h28   #13
Nouveau Membre du Club
 
Inscription : mars 2010
Messages : 130
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : mars 2010
Messages : 130
Points : 38
Points : 38
Merci Jeannot, je suis en congés aujourd'hui mais j'essaie cela demain à l'aube et je te dis quoi ...
Taiby est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 08h45   #14
Nouveau Membre du Club
 
Inscription : mars 2010
Messages : 130
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : mars 2010
Messages : 130
Points : 38
Points : 38
J'ai adapté rapidement le code dans mon vba :
Code VBA :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub Btn_copie_plan_Click()
 
Dim rst As Recordset, intI As Integer
 
Set rst = Me.RecordsetClone
With rst
    Do While Not .EOF
        If .Fields("ID_MATERIEL") = 3 Then
           MsgBox ("trouvé")
        Else
           MsgBox ("pas trouvé")
        End If
    .MoveNext
    Loop
End With
End Sub

Mais l'orsque je l'exécute (par appui sur un bouton Btn_copie_plan) alors que le résultat de ma requete affichée dans un formulaire est à l'écran j'ai cette alerte :
Citation:
Envoyé par message d'erreur 7951
Vous avez rentré une expression dont la référence à la propriété ClôneRecordset n'est pas valide à la ligne Set rst = Me.RecordsetClone
Taiby est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 09h27   #15
Rédacteur/Modérateur
 
Avatar de Jeannot45
 
Homme Jean BALLAT
Inscription : octobre 2004
Messages : 2 856
Détails du profil
Informations personnelles :
Nom : Homme Jean BALLAT
Âge : 63
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : octobre 2004
Messages : 2 856
Points : 5 220
Points : 5 220


Les données sont -elles affichées dans un Sous-Formulaire ?
Si oui, l'appel du Recorset doit se faire sur le sous formulaire

Code VBA :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Private Sub Btn_copie_plan_Click()

Dim rst As Recordset, intI As Integer

Set rst = Me.SF_NomSousFormulaire.Form.RecordsetClone
With rst
    Do While Not .EOF
        If .Fields("ID_MATERIEL") = 13 Then
        MsgBox ("trouvé")
        Else
        MsgBox ("pas trouvé")
        End If
    .MoveNext
    Loop
End With

End Sub

Sinon, je n'ai pas d'erreur en testant ta procédure
__________________
Jeannot

Liens Office indispensables à visiter: Cours (Tutos), F.A.Q., [B]Sources VBA

Ne posez pas de questions par MP, je n'ai pas le temps d'y répondre
Jeannot45 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 11h12   #16
Nouveau Membre du Club
 
Inscription : mars 2010
Messages : 130
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : mars 2010
Messages : 130
Points : 38
Points : 38
Effectivement, il y a bien un sous-formulaire !

j'ai modifié le code comme ceci :
Citation:
Set rst = Me.SF_REQ_MAT_POUR_ETUDE.Form.RecordsetClone
mais j'ai encore une erreur : Membre de méthode ou de données introuvable


je ne sais pas si je vais m'en sortir
Taiby est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 13h18   #17
Nouveau Membre du Club
 
Inscription : mars 2010
Messages : 130
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : mars 2010
Messages : 130
Points : 38
Points : 38
Pour en finir j'ai abandonné l'idée de récupérer mes données depuis un formulaire affiché. J'utilise à la place un outils paramètrable (vsFlex 3.0) qui permet d'afficher les données dans un formulaire cellule par cellule et donc de relir ces cellules sans soucis.
Taiby est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h30.


 
 
 
 
Partenaires

Hébergement Web