Numérotation automatique (et double numérotation automatique!)

Bonjour à tous,

Quand on utilise une base de données du type Access ou Sqlserver ou autre, il est classique (et même recommandé) de prévoir une première "colonne" contenant un numéro d'identification unique à numérotation automatique permettant de se référer facilement à un enregistrement donné.
Dans ces logiciels une ligne d'instruction du genre `Id` Integer AutoIncrement suffit.

Avec Excel
, il n'est pas non plus inutile de créer une colonne de ce type quand on construit une liste de données. En effet, la numérotation des lignes à gauche de la colonne A est un faux ami, un simple tri ou la suppression d'une ligne suffit pour tout "mélanger".
Mais il n'y a pas (à ma connaissance) de numérotation automatique prévue. Un peu de Vba est alors nécessaire. Et l'affaire est simple : utiliser l'événement "Change" de la feuille contenant les données pour repérer le max de la colonne contenant les `Id` et ajouter 1. Le code peut être alors :

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("B:B")) Is Nothing And Target.Rows.Count = 1 Then
        If Me.Range("A" & Target.Row).Value = "" And Not Me.Range("B" & Target.Row).Value = "" Then
           Me.Range("A" & Target.Row).Value = Application.Max(Me.Range("A:A")) + 1
        End If
    End If
End Sub



Ok
MAIS!
Quand on a beaucoup de données correspondant, par exemple, à des factures ou des bons de commande, ce seul numéro ne suffit pas toujours pour retrouver rapidement le document papier stocké dans un carton (quand votre expert comptable vous le réclame par exemple).
Une autre numérotation est alors utile, et il est fréquent de voir des systèmes du genre "année/mois-n° d'ordre dans ce mois" soit 2021/12-0345 pour le 345ème document de décembre 2021.
Parfait pour s'y retrouver, mais moins facile à incrémenter : en cas de tri des données, la dernière ligne n'est pas forcement le dernier n° saisi, et ce n° n'est pas considéré comme numérique donc le max de la colonne n'est pas opérant.
Voici ma proposition : une colonne intermédiaire au format date-heure qu'on incrémente de 1 minute à chaque nouvelle ligne. Ici le max de la colonne renvoie vraiment le dernier n° saisi et avec ce n° intermédiaire il est facile de composer un n° texte du genre 2021/12-0345, le 345 étant le nombre de minutes du n° intermédiaire. Ca peut donner le code suivant :

    Dt = Application.Max(Sheets("Bdd").Range("B:B"))
    Num = 1
    If Year(Dt) = Year(Date) And Month(Dt) = Month(Date) Then _
            Num = Num + (Hour(Dt) * 60) + Minute(Dt)

Et c'est tout! (ou presque)
Pour illustrer mon propos, voici une maquette (qui ne sert à rien, juste un exemple) qui utilise ces 2 systèmes de numérotation. Vous noterez au passage l'utilisation de variables tableaux et d'un mini-module de classe qui simplifie beaucoup le code : cf code du bouton d'enregistrement en 2 lignes sans litanie des Cells(machin) = TextBox_truc, etc ... (ici avec 10 TextBox, mais avec 20 ou 50, le code serait le même)

capture d ecran 2021 12 11 105557

Pierre

PS : si vous avez un volume important de documents à numéroter il est possible de descendre à la seconde pour incrémenter le n° intermédiaire.

Rechercher des sujets similaires à "numerotation automatique double"