Function WeekNumber(Optional ByVal vDate As Variant) As Byte
If IsMissing(vDate) Then vDate = Date
WeekNumber = DatePart("ww", vDate, vbMonday, vbFirstFourDays)
End Function
Sub Decalage_semaine()
Dim nbPers&
Dim lastLig&
Dim SEM As Integer
Dim R As Range
Dim lastDate As Date
Dim i&
Dim j&
Dim var
'--- Nombre de personnes ---
lastLig& = [a65536].End(xlUp).Row
nbPers& = lastLig& + 1 - Range("a" & lastLig& & "").End(xlUp).Row
'--- Dernière date ---
lastDate = Range("f" & lastLig& - nbPers&)
'On calcule tout d'abord la semaine en cours
SEM = WeekNumber(Now)
'On vérifie que l'on a bien passé une semaine
If Cells(3, 7) = "Semaine " & SEM Then
MsgBox (SEM & " est déjà la semaine actuelle")
'--- Si la semaine en G3 est supérieure à la semaine courante ---
ElseIf CInt(Mid(Cells(3, 7), Len("Semaine ") + 1)) > SEM Then
MsgBox ("La semaine affichée en G3 est supérieure à la semaine actuelle (" & SEM & ")")
Else
'--- Déplace la semaine périmée en dernière position ---
Set R = Range("a2:g" & nbPers& + 2)
R.Cut Destination:=Range("a" & lastLig& + 2 & ":g" & lastLig& + 2 + nbPers& & "")
R.Range("g2") = "Semaine " & SEM + 3
'--- Indique les dates de la nouvelle semaine ---
For i& = 1 To 5
Cells(lastLig& + 2, i& + 1) = lastDate + i& + 2
Next i&
'--- Efface les anciennes données de la nouvelle semaine ---
var = R
For i& = 2 To UBound(var, 1)
For j& = 2 To UBound(var, 2) - 1
var(i&, j&) = ""
Next j&
Next i&
R = var
'--- Supprime les lignes de l'emplacement de la semaine périmée ---
Set R = Range("a2:g" & nbPers& + 3)
R.Delete Shift:=xlUp
[a1].Select
End If
End Sub