Developpez.com

Club des développeurs et IT pro
Plus de 4 millions de visiteurs uniques par mois

FAQ MS-AccessConsultez toutes les FAQ

Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 30 mars 2017 

 
OuvrirSommaireVBASQL et VBA

Voici deux liens.

Le premier vous amènera aux Recordsets, qui servent à exploiter les requêtes de sélection (SELECT).

Le second vous expliquera comment exécuter des requêtes d'action (INSERT [insertion], UPDATE [mise à jour], ...).

Créé le 1er avril 2004  par Demco

Lien : Comment créer un jeu de données (Recordset) ?
Lien : Comment exécuter une requête action (ajout, suppression ou mise à jour) ?


DAO

 
Sélectionnez
 Sub DAOOpenRecordset ()
    Dim db As DAO.Database, rst As DAO.Recordset, fld As DAO.Field
    Dim sSQL As String
    ' Ouverture de la base de données 
    Set db = DBEngine.OpenDatabase (".\Comptoir.mdb")
    sSQL =  "Select * From CLIENTS Where Région= \'WA\'"
    ' Ouverture du Recordset 
    Set rst = db.OpenRecordset (sSQL, dbOpenForwardOnly, dbReadOnly)
    ' Fermeture du Recordset
    rst.Close
End Sub 

Notes
-> Il est important d'écrire "DAO." lors de la déclaration.
-> Pensez également à cocher la référence Microsoft DAO 3.6 Object Library (dans un module faites Outils / références).

ADO

 
Sélectionnez
Sub ADOOpenRecordset ()
    Dim cnn As New ADODB.connection, rst As New ADODB.Recordset, fld As ADODB.Field
    ' Ouverture de la connexion
    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=.\Comptoir.mdb;"
    ' Ouverture du Recordset en défilement en avant, et en lecture seule
    rst.Open "SELECT * FROM Clients WHERE Région =\'WA\'", cnn,  adOpenForwardOnly, adLockReadOnly
    ' Fermeture du Recordset
    rst.Close
End Sub 
Mis à jour le 2 mai 2004  par Team Access

Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?

Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.

Ces exemples permettent de parcourir un Recordset

 
Sélectionnez
If Not oRecordset.EOF Then
  Rst.MoveFirst 
  While Not rst.Eof
     ' Code
     rst.MoveNext
  Wend
else
  Msgbox "Le jeu d'enregistrements est vide"
End if

Ou

 
Sélectionnez
Do Until rst.Eof
    ' Code
    rst.MoveNext
Loop 
Mis à jour le 14 octobre 2007  par cafeine

Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?

Modifiez la déclaration du Recordset :

 
Sélectionnez
Dim Rst as DAO.RecordSet


Nous rajoutons le DAO devant RecordSet afin d'éviter les conflits entre bibliothèques ayant certains objets portant le même nom.
En effet ici, les bibliothèques DAO et ADODB possèdent chacune un objet nommé "RecordSet". Ainsi, en écrivant DAO.RecordSet nous savons à quelle bibliothèque nous faisons appel.
Lorsque la bibliothèque n'est pas précisée, le type choisi par défaut correspond à celui de la première bibliothèque compatible référencée dans le projet VBA (en partant du haut).

Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.

Mis à jour le 14 octobre 2007  par Demco, FRED.G

Lien : Pourquoi une erreur de compilation : 'Type défini par l'utilisateur non défini' ?
Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?

Pour un DAO.Recordset

Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.

- Si le Recordset est de type Table (dbOpenTable) : utilisez la méthode Seek.
Celle-ci requiert l'utilisation d'une table indexée (voir l'aide pour plus d'infos).
Lorsque vous utilisez la méthode OpenRecordset, si vous ne précisez pas l'argument type, VBA créera par défaut un Recordset de type Table si celui-ci est basé sur une table.

- Pour les autres types de Recordset : utilisez les méthodes FindFirst / FindLast / FindNext / FindPrevious.

Pour un ADODB.Recordset

Pour exécuter ce code, il faut activer les références : Microsot ADO Ext 2.X for dll and security et Microsof ActiveX Data Object 2.X Library.

Utilisez la méthode Find.

Créé le 1er janvier 2005  par FRED.G

Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?

On ne peut effacer la clé primaire sans effacer les clés étrangères correspondantes.
L'intégrité référentielle est un mécanisme de vérification qui s'assure à chaque ajout, modification ou suppression d'une clé (étrangère ou primaire) qu'il y aura toujours la clé primaire correspondant à la clé étrangère.

Cependant il est parfaitement possible de supprimer des clés étrangères.

Créé le 29 décembre 2003  par Team Access

Vous essayez de supprimer une table sans succès en utilisant une requête de type "DROP TABLE" ou en utilisant la commande DeleteObject.

Cela provient certainement d'un Recordset chargé avec les données de la table. Cette dernière est alors considérée comme "verrouillée" et donc impossible à supprimer.

Il suffit de fermer le Recordset pour déverrouiller la table :

 
Sélectionnez
MonRecordSet.Close

Cette ligne doit bien sûr être placée avant la suppression.

Créé le 12 mai 2004  par Drosera

Voici comment effacer le contenu d'une table :

 
Sélectionnez
dim SQL as string
SQL = "Delete * From TABLE" 
Docmd.RunSQL SQL

Il suffit de réitérer l'action pour chaque table.

On peut aussi imaginer récupérer le nom de toutes les tables dans un tableau, et pour chaque table exécuter la suppression.

Créé le 29 décembre 2003  par Team Access

Lien : Comment effacer tout le contenu d'une table ?

DAO

Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.

 
Sélectionnez
Sub DAOExecuteBulkOpQuery()
    Dim db As DAO.Database
    Set db = DBEngine.OpenDatabase (".\Comptoir.mdb")
    ' Exécution de la requête
    db.Execute "Update CLIENTS Set PAYS = \'États-Unis\' Where PAYS = \'USA\'"
    Debug.Print "Records Affected = "  & db.RecordsAffected
    db.Close
End Sub



ADO

Pour exécuter ce code, il faut activer les références : Microsot ADO Ext 2.X for dll and security et Microsof ActiveX Data Object 2.X Library.

 
Sélectionnez
Sub ADOExecuteBulkOpQuery()
    Dim cnn As New ADODB.connection, iAffected As Integer
    Dim sSQL As String
    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=.\Comptoir.mdb;"
    sSQL = "Update CLIENTS Set PAYS = \'États-Unis\' Where PAYS = \'USA\'"
    ' Exécution de la requête
    cnn.Execute sSQL, iAffected, adExecuteNoRecords
    Debug.Print "Records Affected = " & iAffected
    cnn.Close
End Sub 
Créé le 1er avril 2003  par Team Access

Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?


En VBA, placez ce code avant la requête d'insertion/de modification :

 
Sélectionnez
 DoCmd.SetWarnings False 


Macro : Avertissements=Non.

Pensez à rétablir les messages après la requête :

 
Sélectionnez
 DoCmd.SetWarnings True 


Macro : Avertissements=Oui.

Créé le 1er avril 2003  par Team Access

Lien : Comment supprimer l'apparition des messages d'avertissement pour toute l'application ?

Tout d'abord, vérifiez que l'option d'avertissement n'est pas désélectionnée dans Access :
Menu Outils, Options, Modifier/Rechercher, Confirmer => Requête Action = Oui.

Ensuite, si vous utilisez la méthode Docmd.SetWarnings, assurez-vous que le dernier appel avant l'exécution de votre requête active les messages.

Enfin vous devez utiliser la méthode Docmd.RunSql car la méthode Execute d'un objet Database ne déclenche jamais les messages d'avertissement Access.

 
Sélectionnez
Docmd.SetWarnings True
Docmd.RunSql ""Update MATABLE Set MATABLE.[MONCHAMP] = ""DVP.COM"";"
Créé le 1er janvier 2005  par FRED.G

Il faut faire ceci :

 
Sélectionnez
Dim val As String
val = "l\'exemple" 
CurrentDb.Execute "Insert Into TEST Values(""" & val & """)"
Créé le 29 décembre 2003  par Team Access

Voici une solution :

Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.

 
Sélectionnez
Sub supp()
' Pour fonctionner ce code nécessite la référence
'   - Microsoft DAO X Object Library
 
Dim oDb As DAO.Database
Dim oQdf  As DAO.QueryDef
Dim strReqName As String 'Nom de la requête à supprimer
 
 
' Accède à la base de données courante
Set oDb = CurrentDb
 
strReqName = "R1"
 
' Parcourt toutes les requêtes jusqu'à la suppression
For Each oQdf In oDb.QueryDefs
    With oQdf
        If .Name = strReqName Then
            ' Une requête porte le nom recherché, donc nous la supprimons
             oDb.QueryDefs.Delete strReqName
             ' Quitte la boucle
             Exit For
        End If
      End With
Next oQdf
End Sub

Le même code avec une gestion d'erreur :

 
Sélectionnez
Sub supp()
' Pour fonctionner ce code nécessite la référence
'   - Microsoft DAO X Object Library
 
' Gestion d'erreur
On Error GoTo err
 
 
    Dim oDb As DAO.Database
    Dim oQdf  As DAO.QueryDef
    Dim strReqName As String 'Nom de la requête à supprimer
 
 
    ' Accède à la base de données courante
    Set oDb = CurrentDb
    
    strReqName = "R2"
    
    ' Tente la suppression
    oDb.QueryDefs.Delete strReqName
    ' Affiche un message
    MsgBox "La requête " & strReqName & " a été supprimée"
 
 
fin:
    ' Libère l'objet oDb
    Set oDb = Nothing
    Exit Sub
 
err:
    ' Affiche un message suivant l'erreur
    Select Case err.Number
        Case 3265: MsgBox "La requête n'existe pas"
        Case Else: MsgBox "Erreur critique inconnue"
    End Select
    ' Termine le programme
    Resume fin
 
End Sub
Mis à jour le 14 octobre 2007  par Tofalu

Lien : Comment savoir si une table existe ?
Lien : Comment supprimer une table si elle existe ?
Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?

Il faut utiliser des marqueurs différents selon le type de valeur :

Numérique (aucun délimiteur)

 
Sélectionnez
SQL & "And roulage!numéro =  " & Me.cmbRechNumero   

Texte ( Chr(34) crée des ")

 
Sélectionnez
SQL = SQL & "And roulage!repère =  "& chr(34) & Me.cmbRechRepere & chr(34) 

Date (Délimiteur # et format mm/dd/yyyy)

 
Sélectionnez
SQL & "And roulage!LADATE= #" & format(Me.txtRechDateDebut,"mm/dd/yyyy") & "#"
Créé le 12 mai 2004  par Maxence HUBICHE

Testé sous Access 2000 :

 
Sélectionnez
Sub Sauvegarder() 

    ' Création des deux Recordsets 
    Dim myRS1 As New ADODB.Recordset 
    Dim myRS2 As New ADODB.Recordset 

    myRS1.Open "Table1", CurrentProject.Connection, adOpenDynamic, adLockOptimistic 
    myRS2.Open "Table2", CurrentProject.Connection, adOpenDynamic, adLockOptimistic 

    ' Parcours du RS pour ajouter à table1 tout en supprimant de table2 
    Do Until myRS2.EOF 
        With myRS1 
            .AddNew Array("Champ1", "Champ2", "Champ3"), _
                          Array(myRS2("Alpha"), myRS2("Beta"), myRS2("Gamma")) 
            .Update 
        End With 

       myRS2.Delete 
       myRS2.MoveNext 
    Loop 

    ' Fermeture des Recordsets 
    myRS1.Close 
    myRS2.Close 

    Set myRS1 = Nothing 
    Set myRS2 = Nothing 

End Sub
Créé le 3 septembre 2004  par Maxence HUBICHE
 
Sélectionnez
Select TABLE.CHAMP1, Sum(TABLE.CHAMP2) AS CHAMP2 Into NOUVELLETABLE 
From TABLE
Group By TABLE.CHAMP1, 
Order By TABLE.CHAMP1, 

Où Champ1 est le champ comportant les doublons à supprimer.

Créé le 3 septembre 2004  par cafeine
 
Sélectionnez
Dim cn as ADODB.Connection
Dim cmd as ADODB.Command
Dim insQuery  as String

Set cn = New ADODB.Connection
Set cmd = New ADODB.Command

cn.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;" & _
               "Data Source=D:\CS527\P1\bd1_archive.mdb;Persist Security Info=False;" & _
               "Jet OLEDB:System database=c:\LePath\LeFichier.mdw"

insQuery = "INSERT INTO purchasearchive VALUES (" & Chr(34) _
        & PUID & Chr(34) & "," & Chr(34) _
        & cardNum & Chr(34) & "," & Chr(34) _
        & cardType & Chr(34) & "," & Chr(34) _
        & productID & Chr(34) & ",#" _
        & date & "#," _
        & number & ");"

cn.Open
cmd.ActiveConnection=cn
cmd.CommandText=insQuery
cmd.Execute

Pour se connecter à une base de données sécurisée au niveau utilisateur : dans la chaîne de connexion, ajoute ceci :

 
Sélectionnez
Password=LeMotDePasse;User ID=LeUser  

en mettant le bon mot de passe et le bon User.

Créé le 13 septembre 2004  par Maxence HUBICHE

Si la requête utilise des critères basés sur des champs indexés, il est alors préférable de passer par une requête et OpenQuery.

Docmd.Runsql ne fait qu'exécuter une instruction SQL, tandis que OpenQuery exécute une requête enregistrée (bénéficiant de la technologie Rushmore). Cette technologie est notamment basée sur l'usage des index pour la recherche d'un enregistrement. Ceux-ci sont stockés dans une structure cachée.
Si les critères sont posés sur des champs indexés, lorsque la requête s'exécute, elle peut être optimisée car la recherche se fait sur la structure des index et non directement sur la table.

Créé le 25 octobre 2004  par Maxence HUBICHE

Nous avons une requête du type :

 
Sélectionnez
Parameters TON_PARAM Text;
Insert Into TABLE1 Select  CHAMP1 From TABLE2 Where CHAMP2 = [TON_PARAM];

Voici un exemple de code :

 
Sélectionnez
Set qdf= CurrentDb.QueryDefs("TAREQUETE")
      With qdf
         .Parameters("TON_PARAM") = TaVariable
         .Execute
      End With
Créé le 25 octobre 2004  par Lucifer

Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.

 
Sélectionnez
Dim qdf As DAO.Querydef
Set qdf = Currentdb.Querydefs!NomDeMaRequête
qdf.SQL = "Select * From MaTABLE"
Set qdf = Nothing
Créé le 1er janvier 2005  par Team Access

Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?

Par exemple ici, on tente d'enregistrer dans une table un nom qui existe déjà. Or le champ Nom n'accepte pas les doublons.

 
Sélectionnez
Sub Form_Error(DataErr As Integer, Response As Integer)
 ' Si l'erreur est due à un doublon, la fonction affiche un message permettant d'annuler une commande.
Const ERR_DOUBLON = 3022 ' Erreur de doublon
 ' DataErr reçoit le code erreur de la part du moteur de la BDD ou de l'interface
Select Case DataErr
   Case ERR_DOUBLON
       ' Votre message...
        MsgBox "Ce nom existe déjà.", vbExclamation, "Attention"
       ' La zone à surveiller
        [Client].SetFocus
       ' Demande à Access de continuer l'exécution sans afficher le message standard
       Response = acDataErrContinue
   End Select

End Sub
Créé le 1er janvier 2005  par Team Access

Lien : Comment personnaliser les messages d'erreur ?

 
Sélectionnez
requete = "Select * From carnet Where Prénom Like \'*" & prenom & "*\'"

Dans ce cas, prénom est une variable ou un contrôle contenant la chaîne que nous cherchons.

Créé le 10 mai 2005  par Petogaz

L'utilisation d'un Recordset rend le traitement plus rapide.

Ce code vous permettra de constater vous-même la différence.

Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.

 
Sélectionnez

Function BenchmarkIt()

Dim t0 As Single, t1 As Single
Dim rst As DAO.Recordset
Dim i As Long

t0 = Timer
For i = 1 To 5000
    CurrentDb.Execute "INSERT INTO [tblINSERT] VALUES (" & Format(i, "000000") & ");"
Next i
t1 = Timer
Debug.Print "Exécution par INSERT : " & Format(t1 - t0, "0.000") & " s"

t0 = Timer
Set rst = CurrentDb.OpenRecordset("tblRecordset")
For i = 1 To 5000
    rst.AddNew
    rst!dum = Format(i, "000000")
    rst.Update
Next i
rst.Close
set rst = Nothing
t1 = Timer
Debug.Print "Exécution par RECORDSET : " & Format(t1 - t0, "0.000") & " s"

End Function


Ce code donne :

 
Sélectionnez
benchmarkit
 Exécution par INSERT : 5,328 s
 Exécution par RECORDSET : 0,141 s


Il est possible que la différence soit due au fait que le Recordset travaille avec la mémoire avant d'écrire sur le disque, alors que n requêtes provoquent n accès disque.

Créé le 20 novembre 2005  par cafeine

Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?

Outils/Options, Modifier/Rechercher
Dans le cadre Confirmer décochez ce que bon vous semble.

Créé le 20 novembre 2005  par loufab

Lien : Comment supprimer les messages d'alertes ?

Vous trouverez ci-dessous un lien vous indiquant où se trouve la réponse à votre question. Intéressez-vous plus particulièrement au Recordset.

Créé le 20 novembre 2005  par Demco

Lien : Comment exécuter/utiliser du SQL dans VBA ?

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2013 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.