Bonsoir,
Avec la base, c'est bien mieux
Avant la résolution du problème, plusieurs points revus.
La déclaration des variables au bon endroit est importante, notion de portée (privé, publique).
Les recordsets sont propres à chaque utilisation.
Dans ta version, on a un recordset déclaré en public pour tout le monde, et on utilise ce même recordset à différents endroits, pour différents besoins. On ne sait plus ce qu'il y a dans le recordset, et s'il ouvert, fermé.
Il est préférable de déclarer un recordset dans chaque procédure (donc privé)
Dim oRS As Recordset
de l'instancier au début
Set oRS = New Recordset
de le fermer et le désinstancier à la fin
oRS.Close
Set oRS = Nothing
A l'inverse, la connexion à la base de données peut être globale (comme déjà fait)
Public nConnection As New ADODB.Connection 'Db
mais il n'est pas utile d'ouvrir systématiquement la connexion avant l'exécution d'une requête et de refermer la connexion juste après.
La connexion peut être ouverte une fois pour toute, au début (par exemple à l'initialisation du formulaire)
Public Sub Connect()
Et refermée à la fin (par exemple lors de la fermeture du formulaire)
Public Sub Deconnect()
Dans la procédure de déconnexion à la base, il n'y a donc pas lieu de refermer le recordset
nRecordset.Close
En complément, une bonne indentation du code facilite toujours la lecture
Enfin, lorsqu'un bloc important d'instructions est dupliqué à différents endroits, il est préconisé de l'extérioriser dans une procédure ou fonction dédiée.
Exemple pour le contrôle de saisie, identique pour la création et la modification, création d'une fonction appelée aux 2 endroits :
Private Function SaisieOK() As Boolean
En prenant en compte ces différents points, le problème se résout plus facilement.
Tu trouveras en PJ une nouvelle version, à tester.
Il y a beaucoup de modifications, mais tu t'y retrouveras sans problème, j'en suis certain
Bonne soirée
Bouben