Aide Pour une Incrémentation_ ID

Bonjour à tous,

Je bloque un peu sur comment reproduire un ID dans un tableau.

La structure du tableau est le suivant :

  • Le tableau doit être rempli tous les Lundi , Mercredi et Samedi .
  • L' ID doit être composé de l'année et de trois chiffres (2019001)
  • Les trois derniers chiffres (001) représente le premier jour du remplissage du tableau, etc.

PS : j'ai joint un fichier excel qui sera peut être plus explicite que mon explication

Merci d'avance pour votre aide.

10aide-id.xlsx (12.70 Ko)

Bonjour,

Une piste !

Cette formule à mettre en C9 :

=ANNEE(E9)&SI(ANNEE(E9)<>ANNEE(E10);TEXTE(157;"000");TEXTE(6;"000"))

et cette formule à mettre en C10 et tirer vers le bas :

=ANNEE(E10)&SI(ANNEE(E9)<>ANNEE(E10);TEXTE(157;"000");TEXTE(CNUM(DROITE(C9;3))-1;"000"))

Bonjour guipsii-01, le fil

Je ne sais pas si j'ai tout compris mais bon voilà ce qui en ressort.

Si année en cours alors incrémentation de 1 à chaque entrée.

Si l'année change on remet le compteur à zéro. ce qui donne une formule dans le style

=SI(LIGNE()>=10;SI(ANNEE(DECALER(L10;;2))>ANNEE(DECALER(L10;-1;2));CNUM(ANNEE(DECALER(L10;0;2))&"001");CNUM(ANNEE(DECALER(L10;0;2))&TEXTE(CNUM(DROITE(DECALER(L10;-1;0);3))+1;"000")));CNUM(ANNEE(AUJOURDHUI())&"001"))

Alors, elle peut être améliorée car si l'on fait un tri sur les dates par exemple "De la plus petite à la plus grande" cela va casser les formules.

Bonjour,

Theze : Merci pour ta piste qui m'a été très précieuse pour une meilleure compréhension et elle marche super bien, mais petit Bémol quand je fais un tri sur la date, l'incrémentation de l' ID, change. As-tu une autre piste efficace comme la première pour me dépanner ? svp

Jean-Paul : Oui tu as très bien compris ma demande et tu as apporter une solution à celle ci. Et je te remercie pour ta formule qui m'a permis de me refaire une mise à jour perso de la fonction Décaler .

Mais tu m'a devancer dans ma deuxième requête qui est le petit problème du tri, as tu une proposition optimale à m'apporter ? svp

PS: Je me débrouille un peu en VBA, si jamais vous avez une idée optimale passant par le codage je suis preneur, si et seulement si le codage est a ma modeste hauteur celle de débutant (pas trop sophistiquer).

Grand Merci d'avance "Les Cerveaux"

Bonjour,

Comme les ID sont sensés ne pas changer une fois affectés, tu utilises les formules données puis "Copier", "Collage spécial", "Valeurs" afin de ne plus avoir que les valeurs dans les champs ensuite, tu peux trier sans problème !

ça marche.

Merci beaucoup

Salut guipsii-01, le fil

Une solution par codage qui demande à être améliorée. Mais qui prends en charge le tri, mais pas le collage de plusieurs ligne, si quelqu'un veut si pencher.

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim rngT As Range, rngD As Range, rngR As Range, rngID As Range, MaxD, sTemp As String, MaxID, e
    Set rngT = Range("Tableau3"): Set rngD = Range("Date"): Set rngID = Range("ID")
    ' On recherche si Target fait partie de la colonne 3 du tableau
    If Not Intersect(Target, rngD) Is Nothing Then
        If rngT.Rows.Count = 1 Then
            Target.Offset(0, -2).Value = CLng(Year(Target) & "001")

        ElseIf rngT.Rows.Count > 1 Then
    ' On redimensionne la plage Date pour rechercher l'indice le plus grand
            Set rngR = rngD.Resize(rngT.Rows.Count - 1)
    'On recupère la plus grande date
            MaxD = Application.WorksheetFunction.Max(rngR)
    ' On récupère l'ID de la plus grande date
    ' Peut être remplacer par un Fonction Recherche, à creuser...
            For Each e In rngR
                If e = MaxD Then
                    MaxID = e.Offset(, -2).Value
                    Exit For
                End If
            Next
    ' Il ne reste qu'a regarder si la date est supérieure...
            Select Case Year(Target)
                Case Is = Year(MaxD)
                    sTemp = Year(Target) & CStr(Format(CLng(Right(MaxID, 3)) + 1, "000"))
                    Target.Offset(, -2).Value = CLng(sTemp)

                Case Is > Year(MaxD)
                    Target.Offset(0, -2).Value = CLng(Year(Target) & "001")

    ' Et si tu veux traiter une date inférieure
                Case Is < Year(MaxD)
    '...
    '...
            End Select
        End If
    End If

    If Not rngT Is Nothing Then Set rngT = Nothing: If Not rngD Is Nothing Then Set rngD = Nothing
    If Not rngR Is Nothing Then Set rngR = Nothing

End Sub

Merci Jean-Paul

Rechercher des sujets similaires à "aide incrementation"