Interrogation d’une base de données Access via un code VBA sous Excel : recordsets

Greutof

XLDnaute Nouveau
Bonjour,

Je débute dans le domaine des recordsets et j'ai quelques soucis.

Contenu de la base Test.mdb :
1 table « FichierClient » contenant 1 champ « NomFamille » et 1 champ « Prénom ».
Nombre d’enregistrements 9, dont 5 dont le « NomFamille » (nom de famille contenant deux lettres à chaque fois : aa, az, ae, ar et at) commencent par un « a ».

1ère question :

Dim MaBD As Database
Dim MonRS As Recordset
Dim StrSQL As String

Set MaBD = Workspaces(0).OpenDatabase("C:\Test.mdb", False, False)
StrSQL = "Select NomFamille FROM FichierClient WHERE NomFamille = 'a*' ; "
Set MonRS = MaBD.OpenRecordset(StrSQL, dbOpenSnapshot)

=> “MonRS” est vide. Pourquoi ? Est-ce une erreur sur le caractère générique ?

2ème question :

Dim MaBD As Database
Dim MonRS As Recordset
Dim StrSQL As String

Set MaBD = Workspaces(0).OpenDatabase("C:\Test.mdb", False, False)
StrSQL = "Select NomFamille FROM FichierClient WHERE NomFamille LIKE 'a*' ; "
Set MonRS = MaBD.OpenRecordset(StrSQL, dbOpenSnapshot)

=> “MonRS” contient bien les 5 noms de famille commençant par « a ». Pourquoi cette différence de fonctionnement entre le « = » et le « LIKE » ?

3ème question :

Dim MaBD As Database
Dim MonRS As Recordset
Dim StrSQL As String

Set MaBD = Workspaces(0).OpenDatabase("C:\Test.mdb", False, False)
StrSQL = "Select NomFamille FROM FichierClient WHERE NomFamille LIKE 'a*';"
Set MonRS = MaBD.OpenRecordset(StrSQL, dbOpenSnapshot)

Puis deux cas :
1er cas :
MonRS.FindFirst "NomFamille='a' "

=> “MonRS” est vide. Ce qui est normal, car il n’y a pas de nom de famille = « a » dans la table

2ème cas :
MonRS.FindFirst "NomFamille='a* ' "

=> “MonRS” est vide. Pourquoi ? Le FindFirst n’utilise pas les caractères génériques comme le « * » ?

Merci à toutes et à tous pour votre aide,

Greutof
 
Dernière édition:

Greutof

XLDnaute Nouveau
Re : Interrogation d’une base de données Access via un code VBA sous Excel : recordse

Malheureusement, l'utilisation du "Like" avec le FindFirst n'est pas claire.
Si j'écris
MonRS.FindFirst "NomFamille LIKE 'a' "
ou
MonRS.FindFirst "NomFamille LIKE 'a*' "

MonRs contient tous les noms de famille de la table, même s'ils ne commencent pas par "a".

Bizarre .... :confused:

Si vous pouvez m'aider là-dessus ...
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Interrogation d’une base de données Access via un code VBA sous Excel : recordse

Bonjour,

Testé en Access 2000 avec DAO 3.6.

Code:
Sub Modif_Client()
    Dim db As dao.Database
    Dim rs As dao.Recordset
    Set db = CurrentDb()
    'Set rs = db.OpenRecordset("Clients", dbOpenDynaset)
    Set rs = db.OpenRecordset("SELECT * FROM Clients")
    '---- Modif
    rs.FindFirst "Société LIKE 'ZIG ZAG*'"
    If Not rs.NoMatch Then
      MsgBox rs!ville
      rs.Edit
      rs!ville = "xxxx"
      rs.Update
    Else
      MsgBox "Inconnu"
    End If
    '----- Suppression
    rs.FindFirst "Société='Zoe'"
    If Not rs.NoMatch Then
        rs.Delete
    End If
    rs.Close
End Sub

JB
Formation Excel VBA JB
 
Dernière édition:

Greutof

XLDnaute Nouveau
Re : Interrogation d’une base de données Access via un code VBA sous Excel : recordse

Bonjour BOISGONTIER,

Dans mon code, le
rs.FindFirst "Société LIKE 'ZIG ZAG*'"
que j'ai transformé en
MonRS.FindFirst "NomFamille LIKE 'a*'"
ne fonctionne pas.

J'ai fait plusieurs essais et je me rend compte que quelques soient les critères qui suivent, dès que je mets LIKE, le recordset contient l'ensemble des enregistrements pour le champ NomFamille.

C'est incompréhensible ! :confused:
 

Ashaar

XLDnaute Junior
Re : Interrogation d’une base de données Access via un code VBA sous Excel : recordse

Bonjour,

J'ai testé le code suivant (Même syntaxe) sur XL 2003 avec acces vers Access 2003.
En activant la référence : Microsoft DAO 3.6 Object Library

Ca fonctionne très bien, ca me renvoi bien les code qui commencent par R.

Sub ExtAccessBase()
Dim bdd As Database
Dim enr As Recordset
Dim Sql As String

'Emplacement et nom de la database concernée
Set bdd = Workspaces(0).OpenDatabase("C:\MaBase.mdb", False, False)

'********* DEBUT DU CODE SQL (Sql comme variable) *****

Sql = "Select code FROM Table1 WHERE code LIKE 'R*' ; "

'********************** FIN DU CODE SQL ***************

Set enr = bdd.OpenRecordset(Sql)
numberOfRows = Cells(4, 1).CopyFromRecordset(enr)
enr.Close
bdd.Close
End Sub
 

Greutof

XLDnaute Nouveau
Re : Interrogation d’une base de données Access via un code VBA sous Excel : recordse

Bah oui avec le LIKE dans une requête SQL ça fonctionne, mais pas avec le FindFirst.

MonRS.FindFirst "NomFamille LIKE 'a*'" me renvoit toutes les entrées du champ NomFamille sans aucun filtre.

Je craque un peu là ! :mad:

Je pense que je vais abandonner le findfirst et passer à de la requête SQL.

Merci pour votre aide à toutes et à tous.

Et puis si un jour quelqu'un trouve la solution, merci de le poster !

Fu?!%$g FindFirst ! :rolleyes:
 

Ashaar

XLDnaute Junior
Re : Interrogation d’une base de données Access via un code VBA sous Excel : recordse

En fait, ça ne renvoit pas toutes les entrées..

Ca renvoit l'entrée qui correspond au critère ainsi que celles qui sont après.

Si j'ai :
A
B
C

MonRS.FindFirst "NomFamille LIKE B*'" va renvoyer
B
C

C'est interessant, je vais creuser un peu.
 

Greutof

XLDnaute Nouveau
Re : Interrogation d’une base de données Access via un code VBA sous Excel : recordse

Ouarff ! J'ai compris !!!

En fait, l'appel à la méthode FindFirst positionne le début de la lecture du recordset sur le premier enregistrement répondant au critère.
Si ensuite on continue de passer en revue le recordset avec un FindNext, on passe en revue tous les enregistrements répondant au critère et on s'arrête au dernier trouvé.

Essaie ce code Ashaar :

Code:
MonRS.FindFirst "NomFamille LIKE 'q*'"
    While Not MonRS.NoMatch
    Range("A1").offset(0,i).Value = MonRS!NomFamille
    MonRS.FindNext "NomFamille LIKE 'q*'"
    i=i+1
    Wend


Si par contre on appelle la méthode CopyFromRecordset après un appel à FindFirst ou FindNext, la lecture étant positionné au dernier enregistrement trouvé par ces méthodes, le CopyFromRecordset renvoi tout le contenu du recordset depuis cette position jusqu'à la fin => c'est ce qui ce passe là :

Code:
MonRS.FindFirst "NomFamille LIKE 'q*'"
    Range("A1").CopyFromRecordset = MonRS!NomFamille


Désolé, j'ai pas bien lu l'aide. Il faut reconnaitre, à ma décharge, qu'elle n'est pas toujours très claire :eek:

Merci pour votre aide en tous cas, c'est très précieux !

Greutof.
 

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 940
Membres
101 845
dernier inscrit
annesof