Ça aussi je vous l'ai aussi déjà laissé entendre. Définissez pour chaque contrôle un tableaux global dimensionné de 0 à 9.
Chaque fois qu'un contrôle variable change, rangez sa valeur dans le poste TSpProd.Value de son tableau.
Quand vous changez d'onglet, reversez dans tous les contrôles variables les postes TSpProd.Value de leurs tableaux respectifs.
Les infos récupérées de la base de donnée n'en ont pas besoin parce que vous pouvez les retrouver à partir de LCou restauré à partir de TLgn(TSpProd.Value) et GarnirChamps sait refaire les listes et tout et tout…
Ah j'oubliais: Une fois réinitialisé VLgn = CL.Plgtablo.Rows(LCou).Resize(, jsaisplusconbien).Value, prévoir CL.ValeursDepuis VLgn pour restaurer aussi les ComboBox gérées par CL. Cette opération ne déclenche pas de recherche. Des modification à la sauvette dans le code, comme dans une certaine CBnAnnul_Click, si ! Vous aurez fatalement la surprise de découvrir que des CBx refuseront de s'effacer parce que c'était le seul choix possible compte tenu des valeurs toujours encore en vigueur dans ceux pas encore effacés !
Il n'y a qu'un moyen correct de tout effacer: CL.Nettoyer
Normalement GarnirChamps doit faire le reste puisqu'il part alors d'un VLgn ne contenant que des Empty.
Mais bon, c'était probablement ma dernière intervention dans votre affaire, puisque vous avez décidé de n'en faire qu'à votre tête…