Obtenir le dernier NuméroAuto attribué
J’exécute une instruction SQL de type
INSERT
pour ajouter des lignes dans une table. La clef primaire de cette table est un NuméroAuto. Comment connaître la valeur du NuméroAuto qui vient d’être inséré ?
Le code de départ
Voici par exemple un bout de code qui crée un enregistrement dans une table tblPersonnes
:
1 2 3 4 5 6 7 8 9 10 11 |
' --- ' INSERTION D'UN ENREGISTREMENT ' --- Sub CreerPersonne() Dim strSQL As String ' Création d'une personne strSQL = "INSERT INTO [tblPersonnes] (Nom, Prénom)" _ & " VALUES ('Inisan', 'Hervé')" CurrentDb.Execute strSQL End Sub |
La table tblPersonnes
contient 3 champs : Nom
, Prénom
, et ID
. Ce dernier est de type NuméroAuto. Comme il se calcule automatiquement, il ne figure pas dans l’instruction SQL. Mais du coup, comment peut-on récupérer ce numéro ? L’intérêt serait d’ajouter des données dans une autre table liée à la table Personnes, ou d’ouvrir un formulaire ou un état en le filtrant sur le nouveau numéro, après l’insertion…
La solution
Recopiez la fonction qui suit dans un module standard d’Access :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
' --- ' EXTRACTION DU DERNIER NUMEROAUTO ATTRIBUE ' --- Function DernierNumeroAuto() As Long Dim rst As DAO.Recordset Dim strSQL As String ' Instruction SQL pour extraire le dernier NuméroAuto attribué strSQL = "SELECT @@IDENTITY AS Numero;" ' Ouvrir un Recordset pour lire la valeur Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot) DernierNumeroAuto = rst("Numero") ' On ferme ! rst.Close Set rst = Nothing End Function |
La fonction fait appel à @@IDENTITY
, qui donne en SQL le dernier NuméroAuto calculé.
On teste !
Voici maintenant comment aménager le code du départ, pour qu’il insère une ligne dans la table Personnes, et qu’il obtienne le NuméroAuto associé juste après :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
' --- ' INSERTION D'UN ENREGISTREMENT ' --- Sub CreerPersonne() Dim strSQL As String Dim lngNumero As Long ' Création d'une personne strSQL = "INSERT INTO [tblPersonnes] (Nom, Prénom)" _ & " VALUES ('Inisan', 'Hervé')" CurrentDb.Execute strSQL ' Affichage du NuméroAuto attribué lngNumero = DernierNumeroAuto() MsgBox "Dernier numéro attribué : " & lngNumero End Sub |
Pour tester ce bout de code, ouvrez la fenêtre de debug (CTRL
+ G
), et tapez-y :
CreerPersonne
et appuyez sur la touche [Entrée]
.
Vous pouvez aussi placer votre curseur dans le bloc de code VBA, et cliquer sur l’icône Exécuter Sub/UserForm.
Merci beaucoup pour l’idée, je suis nouveau avec access vba 2007, j’ai une application à faire durant mon stage et j’ai utilisé ce bout de code, le problème il est toujours 0 ! et j’ai une table qui a un champ NumeroAuto, déjà rempli et contient 1 pour test !
Merci bien de vouloir m’aider
Je viens de retester (Access 2013 pour info). Ça devrait fonctionner correctement (j’ai bien toujours le dernier numéro affecté).
Est-ce que ton instruction SQL est correcte (nom de la table, noms des champs, syntaxe SQL en génral) ?
Si elle est incorrecte, l’insertion pourrait ne pas se faire, d’où le 0.
Guillaume > Tu veux obtenir :
(ce sont 3 choses potentiellement différentes)
Bonjour,
Je cherche à compter le dernier enregistrememnt sur une table qui n’est pas liée à mon formulaire.
j’ai essayé strSQL = « SELECT @@IDENTITY AS Numero FROM MaTable; » mais ça ne marche pas…
Que dois-je rajouter svp?
merci pour votre aide
kaba > Si ton bouton de recherche affiche le client à supprimer, est-ce que tu as essayé (en l’adaptant bien sûr) le bout de code que j’ai posté dans le commentaire précédent ? Il faut le placer dans le
Sub / End Sub
d’un bouton de commande, par exemple.Merci, pout votre reponse. Au faite, j’ai cree un formulaire enregistrant les renseigne d’un clien. Et j’ai cree un bouton recherche qui envoi un clien a travers son numero matricle mais je n’arrive pas a le supprimé à travers un bouton supprimè (code vba). Comment faire ? Merci
kaba > Quelque chose comme ça ?
(mais ça n’a pas de rapport avec l’article du dessus ;-))
Salut, je voudrais rechercher un enregistrement basé sur un formulaire et vba ensuite le supprimé