Salut Vincegt,
voilà ton fichier à ma sauce...
- j'ai supprimé les volées de semaine du "futur" qui n'apportent rien (j'imagine...!?) à tes analyses ;
- en colonne [F:F] se trouvera dorénavant la semaine en attente d'être encodée ;
- quand la colonne est complète, la macro se charge de :
* insérer une nouvelle colonne avec calcul des semaines ;
Cette insertion ne se produira que pour dégager l'espace d'encodage de la semaine suivante
* créer la formule Jour -1 en [D22].
* de rechercher la semaine à - 1 an avec, éventuellement un message de non-existence, et de créer la formule en [C22].
- ici, pour l'exemple, il y a un retard d'encodage de plusieurs semaines (il peut y avoir des vacances, des oublis, absence de rapport de ventes,...) ; la macro détecte le retard et insère autant de fois que nécessaire au fur et à mesure de l'encodage pour résorber le retard.
Cette façon de faire optimise l'espace (pas de semaines inutiles) et évite (théoriquement) les erreurs de numérotation des semaines.
Private Sub Worksheet_Change(ByVal Target As Range)
'
Dim dDate As Date, iYear%, iWeek%, iCol1%, iCol2%
'
If Not Intersect(Target, Range("F6:F21")) Is Nothing And WorksheetFunction.CountA(Range("F6:F21")) = 16 Then
If DateAdd("d", 7, fctDateSem(CInt(Cells(2, 6)), CInt(Cells(3, 6)))) <= fctDateSem(Year(Date), WorksheetFunction.IsoWeekNum(Date)) Then
Call InsertWeek
dDate = DateAdd("yyyy", -1, fctDateSem(CInt(Cells(2, 7)), CInt(Cells(3, 7))))
iWeek = WorksheetFunction.IsoWeekNum(dDate)
iYear = Year(dDate)
On Error Resume Next
iCol1 = Rows(2).Find(what:=iYear, lookat:=xlWhole, LookIn:=xlValues, searchdirection:=xlNext).Column
If iCol1 > 0 Then iCol2 = Range(fctCol(iCol1) & 3).Resize(1, Cells(3, Columns.Count).End(xlToLeft).Column).Find _
(what:=iWeek, lookat:=xlWhole, LookIn:=xlValues, searchdirection:=xlNext).Column
On Error GoTo 0
[D22].FormulaLocal = "=G22/H22"
If iCol2 > 0 Then
[C22].FormulaLocal = "=G22/" & fctCol(iCol2) & "22"
Else
[C22] = 0
MsgBox "La semaine " & iWeek & " de l'année " & iYear & " n'a pas été trouvée !", vbCritical + vbOKOnly, "Info"
End If
End If
End If
'
End Sub
A+