Macro Excel : incrémenter des numéros
flobat
-
flobat -
flobat -
Bonjour,
J'utilise actuellement une macro sous Excel pour incrémenter des numéros :
Private Sub Workbook_BeforeSave(ByValSaveAsUI As Boolean,
Cancel As Boolean)
Range("no_facture").Value = Range("no_facture").Value+1
End Sub
Jusque là, ça fonctionne cad que lorsque j'enregistre le document, le suivant passe directement à l'ancien numéro + 1.
Mais, lorsque j'allume l'ordinateur et que j'ouvre mon document en activant les macros, le numéro revient chaque fois à 1. Comment faire pour la macro prenne en compte les numéros des jours précédents et qu'elle fasse le suivi ?
Merci d'avance pour votre aide.
J'utilise actuellement une macro sous Excel pour incrémenter des numéros :
Private Sub Workbook_BeforeSave(ByValSaveAsUI As Boolean,
Cancel As Boolean)
Range("no_facture").Value = Range("no_facture").Value+1
End Sub
Jusque là, ça fonctionne cad que lorsque j'enregistre le document, le suivant passe directement à l'ancien numéro + 1.
Mais, lorsque j'allume l'ordinateur et que j'ouvre mon document en activant les macros, le numéro revient chaque fois à 1. Comment faire pour la macro prenne en compte les numéros des jours précédents et qu'elle fasse le suivi ?
Merci d'avance pour votre aide.
Configuration: Windows XP
3 réponses
-
Bonsoir flobat,
Bizarre, ton truc. Peut-être testes-tu ta macro sans faire de modif dans ton classeur avant de le fermer ? Auquel cas, le classeur se ferme sans sauver quoi que ce soit.
Utiliser BeforeSave n'est pas forcément judicieux : si tu enregistres de temps à autre ton travail en cours, tu vas à chaque fois incrémenter ton compteur. A toi de voir. Mais BeforeClose est peut-être plus adapté (tout dépend de ton contexte).-
Bonjour Armojax
et merci pour ta réponse. Mon classeur est toujours modifié lorsque je l'enregistre, et il passe à l'ancien numéro + 1.
Utiliser la formule BeforeClose te paraît plus judicieux, mais plus laborieuse pour moi parce que mon but est de laisser mon document ouvert la journée et de l'enregistrer à chaque modification.
Par contre, je ne comprend toujours pas pourquoi le numéro revient à 1 lorsque j'éteins l'ordinateur et que je le rallume le lendemain.
Merci et A+ -
Bonsoir Armojax,
Je crois que je t'ai répondu un peu trop vite en te disant que la macro BeforeClose ne me convenait pas. Finalement, je voudrais l'essayer, mais j'ai un problème.
Je ne connais pas trop les macros, et, en remplaçant Save par Close, la macro n'est pas acceptée.
Peux-tu m'aider et me donner la formule ?
Merci. -
Hello flobat,
Excuse-moi, je vois seulement maintenant ton message.
Pour activer Before_Close :
- Va dans VBA
- Dans l'Explorateur de Projets, double-clique sur ThisWorkbook La partie droite qui s'affiche est surmontée de deux boites à listes : Général et Déclarations
- Dans Général, clique sur Workbook, puis...
- Dans Déclarations clique sur Before_Close
Et là tu mets le contenu de ta macro. -
Bonsoir Armojax,
Je te remercie pour ton aide, j'ai trouvé la macro BeforeClose et je l'ai testée. Elle fonctionne très bien avec Fichier Enregistrer, mais lorsque j'utilise Fichier Enregistrer Sous, mon numéro s'incrémente après fermeture du fichier, mais pas à la réouverture de mon modèle. Je comprend la procédure puisque le modèle lui-même n'est pas enregistré (je lui donne un autre nom).
Peut-être existe-t-il une autre macro qui puisse me permettre d'utiliser Fichier Enregistrer Sous tout en incrémentant mes numéros ?
Merci de me donner ton avis. -
Hello flobat,
Le plus simple (?) me semble de stocker à part le numéro de facture.
Dans l'exemple ci-dessous, j'utilise un petit classeur IncrémentFacture dans lequel je stocke, à la fermeture du classeur, le numéro de facture incrémenté.
Ensuite, à l'ouverture, on va y chercher le numéro en question.
De cette façon, quel que soit le fichier qu'on ouvre (le modèle ou bien un enregistrement sous...), on obtient toujours le bon numéro.
Le code n'est pas condensé. On peut simplifier en donnant des noms, etc.
Si quelqu'un a mieux, je suis preneur.Private Sub Workbook_Open() Application.ScreenUpdating = False Dim CeClasseur As Workbook Dim SaveNofact As Workbook Workbooks.Open Filename:="D:\Forums_CCM\IncrémentFacture.xls" Set SaveNofact = ActiveWorkbook Set CeClasseur = ThisWorkbook CeClasseur.Sheets("Feuil1").Cells(1, 1).Value = SaveNofact.Sheets("Feuil1").Cells(1, 1).Value SaveNofact.Close Application.ScreenUpdating = True End Sub Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Application.ScreenUpdating = False Dim CeClasseur As Workbook Dim SaveNofact As Workbook Workbooks.Open Filename:="D:\Forums_CCM\IncrémentFacture.xls" Set SaveNofact = ActiveWorkbook Set CeClasseur = ThisWorkbook CeClasseur.Sheets("Feuil1").Cells(1, 1).Value = CeClasseur.Sheets("Feuil1").Cells(1, 1).Value + 1 SaveNofact.Sheets("Feuil1").Cells(1, 1).Value = CeClasseur.Sheets("Feuil1").Cells(1, 1).Value SaveNofact.Close True Application.ScreenUpdating = True End Sub
-
-
Bonjour,
As-tu vérifié si tu n'as pas une macro auto_open qui remet la valeur de ta cellule no_facture à 1 ?
Cordialement
Sergio-
Bonjour Sergio
Comment puis-je voir si j'ai une macro auto_open ? Dans VBA ?
Merci de ta réponse. Je ne suis pas très douée en Macro.
Flobat.- Re-bonjour,
Tu peux rechercher dans l'éditeur VBA avec la fonction recherche.
Sinon pour savoir si le problème vient de là, ouvre ton fichier en appuyant sur la touche "Shift" du clavier. Quand on fait ça et qu'il existe une macro auto_open, celle-ci n'est pas exécutée à l'ouverture du fichier.
Si en ouvrant ton fichier de cette façon, tu ne retrouve toujours pas le dernier numéro avant enregistrement, c'est que le problème ne vient pas d'une macro auto_open.
Cordialement
Sergio - Sergio,
Merci pour ton aide. En effet, lorsque j'ouvre mon document en appuyant sur la touche "shift", celui-ci s'ouvre au dernier numéro enregistré. Donc le problème vient bien d'une macro auto_open.
Par contre, je ne la trouve pas, j'ai essayé la fonction Recherche dans VBA, mot inconnu. Est-ce normal ?
Merci encore.
Flobat
-
-
si tu choisissais ton numéro avec la formule
suivante max(ici tous les numéros de facture)
ref par exemple a$1:a200
tu arriverais à la même chose