Bonjour à toutes et à tous,
Je n'arrive pas à mettre dans une boucle un traitement sur une date, c’est-à-dire à faire en sorte que la date que je calcule passe par une moulinette tant que sa valeur ne remplit pas une série de critères
[Dans la pièce jointe tous les détails (feuille "Ma question")]
Mon souci :
J'arrive à faire le calcul comme suit
a) délai respectif de livraison + jour de départ = jour de livraison
b) je teste si ce jour est un dimanche (si dimanche, alors livraison théorique le lendemain du dimanche)
c) si pas dimanche, alors je teste si jour interdit (fermeture exceptionnelle chez tous les clients)
d) si jour interdit, alors je repousse la date de livraison théorique au lendemain
MAIS, ET C'EST LA QUE JE COINCE
je ne sais comment "emboîter" mes tests pour qu'arrivé à cette étape, ça re-teste si ce fameux lendemain n'est à nouveau pas un dimanche et/ou un nouveau jour interdit
Je pressens une boucle imbriquée mais je n'y arrive pas … Peut-être qu'un œil extérieur verra l'arbre qui me cache la forêt ...
D'avance, merci pour vos lumières
Je n'arrive pas à mettre dans une boucle un traitement sur une date, c’est-à-dire à faire en sorte que la date que je calcule passe par une moulinette tant que sa valeur ne remplit pas une série de critères
[Dans la pièce jointe tous les détails (feuille "Ma question")]
Mon souci :
J'arrive à faire le calcul comme suit
a) délai respectif de livraison + jour de départ = jour de livraison
b) je teste si ce jour est un dimanche (si dimanche, alors livraison théorique le lendemain du dimanche)
c) si pas dimanche, alors je teste si jour interdit (fermeture exceptionnelle chez tous les clients)
d) si jour interdit, alors je repousse la date de livraison théorique au lendemain
MAIS, ET C'EST LA QUE JE COINCE
je ne sais comment "emboîter" mes tests pour qu'arrivé à cette étape, ça re-teste si ce fameux lendemain n'est à nouveau pas un dimanche et/ou un nouveau jour interdit
Je pressens une boucle imbriquée mais je n'y arrive pas … Peut-être qu'un œil extérieur verra l'arbre qui me cache la forêt ...
D'avance, merci pour vos lumières
Code:
Sub DateDeLivraison()
' 1 --- Le calendrier des jours particuliers est chargé
With Sheets("Calendrier")
Dim MonCalendrier As Range
Dim Cellule As Range
Dim DernLigCalendrier As Long
DernLigCalendrier = .Range("A" & Rows.Count).End(xlUp).Row
Set MonCalendrier = .Range("A2:B" & DernLigCalendrier)
End With
' 2 --- Détermination du Range où se trouvent les ventes
Dim lastlineVentes As Long
Dim TableVentes As Range
Dim CritereTri As Range
With Sheets("Ventes")
lastlineVentes = .Range("D" & Rows.Count).End(xlUp).Row
Set TableVentes = .Range("A2:D" & lastlineVentes)
Set CritereTri = .Range("A1")
TableVentes.Sort key1:=CritereTri, order1:=xlAscending, Header:=xlNo
End With
' 3 --- Détermination du Range où se trouvent les infos liées au transport
With Sheets("Transport")
Dim lastlineTransport As Long
Dim TableTransport As Range
lastlineTransport = .Range("A" & Rows.Count).End(xlUp).Row
Set TableTransport = .Range("A2:B" & lastlineTransport)
End With
' 3 --- Opérations sur délai et dates commencent
With Sheets("Ventes")
Dim i As Long
Dim DélaiLivraison As Long
Dim DateLivraison As Date
Dim JourLivraison As Long
For i = 2 To lastlineVentes
' Le délai de livraison est lu dans la table (par vlookup)
DélaiLivraison = Application.WorksheetFunction.VLookup(.Cells(i, 1), TableTransport, 2, False)
' La date de livraison est déterminée
DateLivraison = .Range("D" & i) + DélaiLivraison
' Le jour de la semaine est déterminé (1=dimanche; 2=lundi; ...; 6=vendredi; 7=samedi)
JourLivraison = Weekday(DateLivraison)
' si ce jour est un dimanche alors la livraison est repoussée d'un jour, au lundi
If JourLivraison = 1 Then
DateLivraison = DateLivraison + 1
End If
' une fois ces tests pratiqués on écrit la date de livraison éventuellement retouchée
.Cells(i, 2).Value = DateLivraison
' on contrôle que le jour de livraison éventuellement retouché ne coïncide pas avec un jour fermé
' dans ce cas le jour de livraison est repoussé au lendemain
For Each Cellule In MonCalendrier
If DateLivraison = Cellule Then
DateLivraison = DateLivraison + 1
.Cells(i, 2).Value = DateLivraison ' on "écrase" la date trouvée précédemment
End If
Next Cellule
Next i
End With
End Sub