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