Il est de bon ton de se souhaiter la bonne année. Mais vous, et vous seul, pourrez faire en sorte que cette année soit bonne, meilleure que celle qui vient de s'écouler. Apprenez à ne compter que sur vous, car personne n'est plus qualifié que vous-même pour bâtir, réparer ou améliorer votre propre vie. Personne ne fera les choses à votre place. D'ailleurs, tout ce que les autres peuvent faire, c'est souhaiter que vous le fassiez. Et ne croyez pas que tout ceux qui vous entourent vous apporteront des solutions : certains font juste partie de vos problèmes. Transformez vos résolutions en actes, et dans douze mois, retournez-vous et souriez-vous fièrement : C'était long. C'était difficile. Mais ça y est : 2017 était une bonne année, merci Moi.

ADO : activeX Data Objects

L'ADO (ActiveX Data Objects) est la nouvelle technologie de Microsoft qui permet l'accès aux données. C'est le descendant du DAO (Data Access Objects). De nombreuses similitudes permettront un apprentissage plus facile à l'ADO pour les programmeurs ayant l'habitude de DAO.

Une aide assez complète est donnée en anglais sur ce site

Pour suivre ce chapitre, je vais supposer que vous êtes dans une nouvelle base de données, dans laquelle vous avez une table T_Celebrite, qui contient un champ NomCelebrite, dans laquelle vous aurez installé quelques Celebrites.

Avant tout, une fois dans l'environnement Access VBA, vous allez dans le menu Outils/Références, et vous cochez la référence "Microsoft ActiveX Data Objects 2.5" (2.5 est un chiffre qui peut varier), sinon, vous aurez des erreurs de compilation

Exemple basique

Voici un premier exemple réduit à sa plus simple expression : Il se contente de créer une variable-objet MaTable comm étant de type ADODB.Recordset. Nous précisons qu'il s'agit bien d'un type de données de la bibliothèque ADODB, vcar sinon, on pourrait faire la confusion avec le type RecordSet de la bibliothèque DAO. Vous devez bien entendu déjà avoir programmé DAO pour comprendre mes explications. :

Sub AccessADO()
  Dim MaTable As New ADODB.Recordset
 
  Set MaTable = Nothing

End Sub

Cette procédure ne fait rien d'autre que de déclarer la variable, et l'assigner à rien du tout. C'est la base. C'est surtout pour vous assurer qu'à ce stade vous n'avez pas d'erreur de compilation.

Maintenant, nous allons ouvrir la table T_Celebrite du projet courant (La base de données dans laquelle vous êtes). Ou plutôt, nous allons nous y connecter, ce qui revient quasiment au même. A la fin, nous la fermons, et nous faisons pointer la variable sur Nothing pour libérer la mémoire.

Sub AccessADO()
  Dim MaTable As New ADODB.Recordset
  MaTable.Open "T_Celebrite", CurrentProject.Connection
  
  MaTable.Close
  Set MaTable = Nothing
End Sub

Et maintenant que nous avons ouvert la table, nous allons puiser dedans : affichage du premier enregistrement :

Sub AccessADO()
  Dim MaTable As New ADODB.Recordset
  MaTable.Open "T_Celebrite", CurrentProject.Connection
  MsgBox MaTable("NomCelebrite")
  MaTable.Close
  Set MaTable = Nothing
End Sub

Voilà pour ce qui est de la base. Maintenant, nous avons toute une pleiade d'options applicables pour faire à peu près ce qu'on veut de nos tables (et de nos requêtes, d'ailleurs)

Déplacement dans les enregistrements

Nous allons pouvoir nous déplacer respectivement : Sur le premier, sur le dernier, sur le précédent et sur le suivant enregistrement. Attention : Le mode de connection à la table T_Celebrite va ermettre ou non certains déplacements.

Par exemple, un simple connection avec les paramètres par défaut (MaTable.Open "T_Celebrite", CurrentProject.Connection) ne va pas permettre un accès direct au dernier enregistrement, ni un retour en arrière d'un enregistrement :

Sub AccessADO()
  Dim MaTable As New ADODB.Recordset
  MaTable.Open "T_Celebrite", CurrentProject.Connection
  ' Position sur le dernier enregistrement :
  ' MaTable.MoveLast provoque une erreur
  ' L'avant-dernier :
  ' MaTable.MovePrevious Provoque une erreur
  ' Le premier :
  MaTable.MoveFirst
  ' Le deuxième :
  MaTable.MoveNext
  MaTable.Close
  Set MaTable = Nothing
End Sub

Pour avoir accès à tous les déplacements, il est nécessaire d'ouvrir la connection avec l'option adOpenDynamic

Sub AccessADO()
  Dim MaTable As New ADODB.Recordset
  MaTable.Open "T_Celebrite", CurrentProject.Connection, adOpenDynamic
  ' Ces 2 lignes ne posent plus de problème :
  MaTable.MoveLast
  MaTable.MovePrevious
  MaTable.MoveFirst
  MaTable.MoveNext
  MaTable.Close
  Set MaTable = Nothing
End Sub

Recherche d'un enregistrement : Find

Il est possible de rechercher un certain enregistrement : Dans notre cas, nous cherchons un Celebrite qui s'appelle Gates, et nous affichons son prénom. Il faut bien entendu que vous ayez un champ "Prenom", et un Celebrite dont le nom est égal à Gates évidemment.

La propriété EOF est là pour constater que l'enregistrement est trouvé.

Sub AccessADO2()
  Dim MaTable As New ADODB.Recordset
  MaTable.Open "T_Celebrite", CurrentProject.Connection, adOpenDynamic
  MaTable.Find "NomCelebrite='Gates'"
  if MaTable.EOF = False then
     MsgBox MaTable("Prenom")
  End If
  MaTable.Close
  Set MaTable = Nothing
End Sub

Remarque : Si vous aviez l'habitude de travailler avec DAO, la méthode était FindFirst.

Ajout d'un enregistrement

La méthode AddNew va permettre les ajouts. Ne pas oublier la méthode Update :

Attention : Il est nécessaire d'ajouter le paramètre adLockOptimistic, sinon, ça ne marche pas : Une erreur de compilation apparait

Sub AccessADO4()
  Dim MaTable As New ADODB.Recordset
  MaTable.Open "T_Celebrite", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
  MaTable.AddNew
  MaTable("NomCelebrite") = "Yahooo"
  MaTable.Update

  MaTable.Close
  Set MaTable = Nothing
End Sub

Remplacement d'un nom existant

Sub AccessADO5()
  Dim MaTable As New ADODB.Recordset
  MaTable.Open "T_Celebrite", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
  MaTable.Find "NomCelebrite='Gates'"

  MaTable("NomCelebrite") = "Barrière"
  MaTable.Update

  MaTable.Close
  Set MaTable = Nothing
End Sub

Remarque : On peut très bien utiliser une requête en lieu et place d'une table

Effacement d'un enregistrement

Sub Efface()
  Dim MaTable As New ADODB.Recordset
  MaTable.Open "T_Celebrite", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
  MaTable.MoveFirst
  MaTable.Delete
  MaTable.Close
  Set MaTable = Nothing
End Sub

Utilisation d'une table dans une autre base de données

Dans ce cas, nous allons utiliser externe.mdb, qui se trouve dans le même dossier que la base source.

Sub AutreBase()
  Dim MaBase As New ADODB.Connection
  Dim MaTable As New ADODB.Recordset
  MaBase.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=.\Externe.mdb;"
  MaTable.Open "T_Celebrite", MaBase, adOpenDynamic, adLockOptimistic
  MaTable.MoveLast
  MsgBox MaTable("NomCelebrite")
  MaTable.Close
  Set MaTable = Nothing
  MaBase.Close
  Set MaBase = Nothing
End Sub

Exécution de requêtes action

Cet exemple remplace toutes les "France" par "Turquie"

Sub RequeteAction()
  Dim MaBase As New ADODB.Connection
  Set MaBase = CurrentProject.Connection
  MaBase.Execute "R_FranceTurquie"
  MaBase.Close
  Set MaBase = Nothing
End Sub

Remarque : Il est tout à fait possible de remplacer le nom de la requête par une ligne de commande SQL :

MaBase.Execute "UPDATE T_Celebrite SET PaysOrigine = 'Turquie' WHERE PaysOrigine='France'"

Remarque : Il n'y a pas de message d'avertissement comme quoi on va exécuter une requête action avec ADO
En cas de besoin, toutefois : DoCmd.SetWarnings False les supprime.
Menu Outils, Options, Modifier/Rechercher, Confirmer => Requête Action

 

---Fin---