XL 2013 Tester une date puis à nouveau le résultat de ce test : comment "imbriquer" les tests

Sebast

XLDnaute Impliqué
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


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
 

Pièces jointes

  • Question_forum_26102015.xlsm
    57.4 KB · Affichages: 32
  • Question_forum_26102015.xlsm
    57.4 KB · Affichages: 35

Sebast

XLDnaute Impliqué
Re : Tester une date puis à nouveau le résultat de ce test : comment "imbriquer" les

Salut pierrejean,

merci pour ton aide, que je n'ai pas pu tester car j'obtiens dès ouverture du fichier le caractère "# valeur" dans la colonne Date Livraison. J'ai d'abord pensé à un souci de format mais même en formatant la colonne comme une date, rien n'y fait.

Avant toute chose, je me rends compte que je me suis planté de fichier à uploader, j'avais prévu une version expurgée avec uniquement le code tel que présenté dans le corps de la demande (et pas tous les autres essais) ... mais globalement ça ne change pas grand chose car c'est bien DateDeLivraison() qui me pose problème.

Cependant, j'ai regardé ton code qui parait très intéressant mais demande encore que je le digère ...
Pourquoi créer un dictionary avec la feuille transport alors qu'on a une table sans doublon ? (j'aurais peut-être dû le préciser).

As-tu une idée pourquoi ce "# valeur" à l'ouverture ?

Encore merci
 

Sebast

XLDnaute Impliqué
Re : Tester une date puis à nouveau le résultat de ce test : comment "imbriquer" les

Bonjour à toutes et à tous,

je joins en fait le fichier auquel je pensais initialement, c'est à dire la version expurgée.
Je n'ai pas réussi à résoudre ce problème de # valeur.
 

Pièces jointes

  • Question_forum_27102015.xlsm
    30.7 KB · Affichages: 26

pierrejean

XLDnaute Barbatruc
Re : Tester une date puis à nouveau le résultat de ce test : comment "imbriquer" les

Re

teste cette version
NB: Le dictionnaire est une manière comme une autre d’accéder au délai de livraison
 

Pièces jointes

  • Question_forum_27102015_b.xlsm
    33.5 KB · Affichages: 26

Sebast

XLDnaute Impliqué
Re : Tester une date puis à nouveau le résultat de ce test : comment "imbriquer" les

re,

merci pour ce fichier et les explications.
J'ai le même problème. Tant que je n'active pas les macros, ton fichier présente une colonne renseignée et dès que j'active les macros, je retrouve les "# valeur".

Une idée ?
 

Sebast

XLDnaute Impliqué
Re : Tester une date puis à nouveau le résultat de ce test : comment "imbriquer" les

Re,

tu as raison, j'avais oublié de rectifier mon profil. Je suis à cheval sur 2 PC, l'un avec 2010, l'autre 2013. La version pourrait-elle être la raison de ce "# valeur" ?

J'ai fait Entrée et ça marche ! Est-ce un problème soluble seulement avec cette intervention manuelle ?

J'ai jeté un oeil rapide, j'ai bien l'impression que les différents cas de figure sont bien pris en compte.
Je vais regarder en détail et te reviens pour - probablement - quelques explications.

Encore merci pour ton aide
 

Sebast

XLDnaute Impliqué
Re : Tester une date puis à nouveau le résultat de ce test : comment "imbriquer" les

PierreJean,

après examen du code, je comprends la philosophie générale et c'est vrai que l'emploi de fonctions est un bon moyen de ne pas s'embrouiller l'esprit avec des conditions à rallonge

Cependant, j'avoue avoir encore du mal avec les tableaux (Lbound, Ubound) même si j'ai bien enregistré que ça optimise le traitement.

Etant très "vert" en la matière, j'ai essayé de modifier les parties de ton code qui utilisent Lbound/Ubound mais je n'y arrive pas …

Pour essayer de simplifier, j'ai également considéré que dans la feuille 'Calendrier', le simple fait qu'il y ait une date valait que cette date soit interdite (plus de colonne B, puisque de toutes façons, n'y figurait pas de date "autorisée" )

PierreJean, pour que j'arrive à réellement assimiler, peux-tu essayer d'adapter ton code initial à ces simplifications (en particulier l'abandon - momentané - des tablo) ?


Merci d'avance pour ton aide
 

Pièces jointes

  • Question_forum_28102015.xlsm
    33.6 KB · Affichages: 24
  • Question_forum_28102015.xlsm
    33.6 KB · Affichages: 31

Sebast

XLDnaute Impliqué
Re : Tester une date puis à nouveau le résultat de ce test : comment "imbriquer" les

Bonsoir PierreJean,

désolé pour ma réponse tardive, je n'étais pas proche d'in ordi et pensais recevoir un message du forum me signalant un mouvement dans la discussion (je n'ai peut-être pas bien paramétré mon compte).

Encore une fois, tu réponds parfaitement à mon besoin : c'est à la fois précis, efficace et compréhensible pour moi qui suis loin d'être virtuose. Le code fait le job et je peux me l'approprier car je l'assimile.
Je ne voyais pas l'intérêt des fonctions jusqu'à présent, voilà un fil qui m'a convaincu du contraire ...

Encore merci pour ta disponibilité

Sebast
 

Discussions similaires