XL 2021 Planning chantier avec SERIE.JOUR.OUVRE.INTL

  • Initiateur de la discussion Initiateur de la discussion kdet
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

kdet

XLDnaute Occasionnel
Bonsoir à tous, le forum,

J'aurai besoin de votre aide sur la fonction SERIE.JOUR.OUVRE.INTL
Dans mon planning, le chantier fonctionne du lundi au vendredi.
En G10 j'ai utilisé cette formule : LET(deb;[@DEBUT];dur;[@DUREE];fer;Fériés;weekend;11;SI(OU(ESTVIDE(deb);ESTVIDE(dur));"";SERIE.JOUR.OUVRE.INTL(deb;dur-1;1;fer))) et il y a deux résultats incohérents. Je ne sais pas ce qui cloche sur la formule.
J'aimerais apporter quelques précisions : le chantier peut exceptionnellement travailler le Samedi, Dimanche et Jous Fériés si on devrait finir le chantier en avance.
Je voudrais les inclure dans la formule mais je ne sais comment faire.
Je ne sais pas si c'est possible, sinon auriez-vous une solution.

Vous remerciant par avance de votre aide.
kdet
 

Pièces jointes

l'utilisation des commentaires ralentit vraiment l'exécution des macros. A mon avis, il faut éviter cela et ajouter une colonne supplémentaire.
Dans l'exemple en PJ, j'ai 14 tâches et avec "Benchmark" je sais le temps d'exécution de chaque fonction.
J'ai amélioré la méthode "Job75" dans la fonction "f_Avance1" et elle prendra les jours à partir du fin vers le début sans priorité.
Puis j'ai la méthode "BSALV1" dans la fonction "f-Avance2" et cette méthode utilise une priorité pour ces dates, donc on part aussi du fin au début mais une première fois pour les samedis normaux, puis pour les dimanches normaux, puis pour les fériés du lu-ven, puis les fériés du samedi et alors les fériés du dimanche.
Le but final est de faire cela comme "fonction" sans intervention d'une macro "event", comme je l'ai fait dans les colonnes O:Q, mais pour les moment, j'utilise les colonnes I:N pour l'explication. Plus tard, quand vous avez fait votre choix, ces colonnes et quelques macros seront supprimées.
Les colonnes "BSALV2" sont le résultat de la fonction que j'avais présenté la semaine passée, la seule différence avec BSALV1, c'est que la séquence est du début vers le fin au lieu du contraire. Mais bon, BSALV2 est à ignorer, je suppose, c'est pourquoi, je l'ai grisé.
Bon, pour chaque méthode et 14 lignes, mon ordinateur a besoin d'environ 100 ms, soit 5-6 ms/ligne. C'est significatif mieux que les propositions précédentes !!! Mais cela n'a rien à voir avec l'algorithme de job75 ou moi, mais l'utilisation des commentaires.
Vous voyez aussi qu'on a une MFC qui montre les différences entre colonne J et L. Bon, La colonne L est un peut plus tôt pour "combattre un incendie alors que la maison est déjà en feu" 😉 (BSALV2 est le plus prudent, puis BSALV1 et puis Job75). Les jours fériés sont en majuscule et autres jours en miniscules.
PS. l'avancement, pour le moment est une simple calculation avec les jours, mais si vous voulez utiliser les jours qu'on a travaillé, ce n'est que petit ajout à la fonction.
 

Pièces jointes

Dernière édition:
Bonjour kdet, bsalvv, le forum,
l'utilisation des commentaires ralentit vraiment l'exécution des macros.
C'est vrai mais cela n'a guère d'importance car normalement on ne traite qu'une seule ligne du tableau à chaque entrée.

Sauf avec la Workbook_Open ou lors de copier-coller.

Allez deux dernières modifications, j'ai remplacé dans la Worksheet_Change :
VB:
With ListObjects(1).Range 'tableau structuré
    Set Target = Intersect(Target, .Cells)
    If Target Is Nothing Then Exit Sub
    Set Target = Intersect(Target.EntireRow, .Columns(7))
End With
par :
VB:
With ListObjects(1).Range 'tableau structuré
    Set Target = Intersect(Target, .Columns(4).Resize(, 4)) 'Colonnes E F G H
    If Target Is Nothing Then Exit Sub
    Set Target = Intersect(Target.EntireRow, .Columns(7))
End With
La macro ne s'exécute pas quand on modifie les colonnes B C D, la Workbook_Open est donc beaucoup plus rapide.

J'ai aussi ajouté dans la Workbook_Open :
VB:
Me.Saved = True 'évite l'invite à la fermeture si aucune modification

A+
 

Pièces jointes

Dernière édition:
comme je l'avais dit dans mon poste précédent, à la limite, on a seulement besoin d'une fonction et on n'a pas d'autres soucis (events, etc). Dès qu'on change une des 3 cellules, la fonction se recalcule tout seul. Impossible de battre cette principe. En plus et pour moi, dès le début, mon reproche principal, si on peut planifier un samedi normal au lieu d'un dimanche ou un férié, même si ce samedi n'est pas directement avant le fin, il faut le faire. Un samedi est beaucoup moins cher et c'est plus facile à trouver des victimes qu'un dimanche ou un férie.
 

Pièces jointes

l'utilisation des commentaires ralentit vraiment l'exécution des macros. A mon avis, il faut éviter cela et ajouter une colonne supplémentaire.
Dans l'exemple en PJ, j'ai 14 tâches et avec "Benchmark" je sais le temps d'exécution de chaque fonction.
J'ai amélioré la méthode "Job75" dans la fonction "f_Avance1" et elle prendra les jours à partir du fin vers le début sans priorité.
Puis j'ai la méthode "BSALV1" dans la fonction "f-Avance2" et cette méthode utilise une priorité pour ces dates, donc on part aussi du fin au début mais une première fois pour les samedis normaux, puis pour les dimanches normaux, puis pour les fériés du lu-ven, puis les fériés du samedi et alors les fériés du dimanche.
Le but final est de faire cela comme "fonction" sans intervention d'une macro "event", comme je l'ai fait dans les colonnes O:Q, mais pour les moment, j'utilise les colonnes I:N pour l'explication. Plus tard, quand vous avez fait votre choix, ces colonnes et quelques macros seront supprimées.
Les colonnes "BSALV2" sont le résultat de la fonction que j'avais présenté la semaine passée, la seule différence avec BSALV1, c'est que la séquence est du début vers le fin au lieu du contraire. Mais bon, BSALV2 est à ignorer, je suppose, c'est pourquoi, je l'ai grisé.
Bon, pour chaque méthode et 14 lignes, mon ordinateur a besoin d'environ 100 ms, soit 5-6 ms/ligne. C'est significatif mieux que les propositions précédentes !!! Mais cela n'a rien à voir avec l'algorithme de job75 ou moi, mais l'utilisation des commentaires.
Vous voyez aussi qu'on a une MFC qui montre les différences entre colonne J et L. Bon, La colonne L est un peut plus tôt pour "combattre un incendie alors que la maison est déjà en feu" 😉 (BSALV2 est le plus prudent, puis BSALV1 et puis Job75). Les jours fériés sont en majuscule et autres jours en miniscules.
PS. l'avancement, pour le moment est une simple calculation avec les jours, mais si vous voulez utiliser les jours qu'on a travaillé, ce n'est que petit ajout à la fonction.
Bonjour bsalv, le forum,
Les commentaires c'est pour une meilleure visibilité et encore merci @bsalv
j'opte pour : "la fonction sans intervention d'une macro"
kdet
 
comme je l'avais dit dans mon poste précédent, à la limite, on a seulement besoin d'une fonction et on n'a pas d'autres soucis (events, etc). Dès qu'on change une des 3 cellules, la fonction se recalcule tout seul. Impossible de battre cette principe. En plus et pour moi, dès le début, mon reproche principal, si on peut planifier un samedi normal au lieu d'un dimanche ou un férié, même si ce samedi n'est pas directement avant le fin, il faut le faire. Un samedi est beaucoup moins cher et c'est plus facile à trouver des victimes qu'un dimanche ou un férie.
Re, bsalv, le forum,
j'ai ce message :
1776511720691.png


kdet
 
Bonjour kdet, bsalvv, le forum,

C'est vrai mais cela n'a guère d'importance car normalement on ne traite qu'une seule ligne du tableau à chaque entrée.

Sauf avec la Workbook_Open ou lors de copier-coller.

Allez deux dernières modifications, j'ai remplacé dans la Worksheet_Change :
VB:
With ListObjects(1).Range 'tableau structuré
    Set Target = Intersect(Target, .Cells)
    If Target Is Nothing Then Exit Sub
    Set Target = Intersect(Target.EntireRow, .Columns(7))
End With
par :
VB:
With ListObjects(1).Range 'tableau structuré
    Set Target = Intersect(Target, .Columns(4).Resize(, 4)) 'Colonnes E F G H
    If Target Is Nothing Then Exit Sub
    Set Target = Intersect(Target.EntireRow, .Columns(7)).Cells 'j'avais oublié .Cells
End With
La macro ne s'exécute pas quand on modifie les colonnes B C D, la Workbook_Open est donc beaucoup plus rapide.

J'ai aussi ajouté dans la Workbook_Open :
VB:
Me.Saved = True 'évite l'invite à la fermeture si aucune modification

A+
Bonjour job75, le forum,

j'en prends bonne note de vos modifications.
Encore merci.

kdet
 
bonjour Job75, kdet,
je n'avais plus une macro "M_Renouveller", maintenant elle y est (éventuellement à lancer avec le bouton "Recalculer")
Ily a un 2ième bouton "Saute de ligne" pour modifier la présentation de la colonne "Comment", oubien on met tout sur une ligne oubien on a des sautes de lignes.
 

Pièces jointes

Juste une remarque.

Sur un projet bien étudié et bien dirigé il n'est normalement pas nécessaire de travailler les samedis dimanches ou jours fériés.

Les "crash programs" seront donc exceptionnels et réalisés à la demande du client ou pour compenser des évènements imprévisibles.

Le surcoût des heures supplémentaires ou des jours chômés travaillés n'aura alors que peu d'importance.
 
Bonjour kdet, bsalv, le forum,

Si maintenant comme le dit bsalv les samedis sont moins coûteux on pourra les utiliser en priorité avec ce code dans la Worksheet_Change :
VB:
        If Target > 0 Then
            ReDim a(1 To Target.Offset(, -1) + avance - Target.Offset(, -3) + 1, 1 To 2) 'tableau auxiliaire
            n = 0: nn = 0: com = "Travail :"
            For jour = Target.Offset(, -1) + avance To Target.Offset(, -3) Step -1
                If n = avance Then Exit For
                nn = nn + 1: a(nn, 1) = jour
                If Weekday(jour) = 7 And Application.CountIf(fer, jour) = 0 Then a(nn, 2) = 1: n = n + 1 'samedis non fériés d'abord

            Next jour
            nn = 0
            For jour = Target.Offset(, -1) + avance To Target.Offset(, -3) Step -1
                If n = avance Then Exit For
                nn = nn + 1
                If Weekday(jour) = 1 Or Application.CountIf(fer, jour) > 0 Then a(nn, 2) = 1: n = n + 1 'dimanches et fériés ensuite
            Next jour
            For nn = 1 To UBound(a)
                If a(nn, 1) <= Target.Offset(, -1) And a(nn, 2) Then com = com & vbLf & "- " & Format(a(nn, 1), "ddd dd/mm/yyyy")
            Next nn
            With Target(1, 0).AddComment(com).Shape.TextFrame
                .Characters.Font.Name = "Courier New" 'chasse fixe
                .AutoSize = True 'ajuste la taille
            End With
        End If
Avec une avance de 7 jours en H14 seuls 3 samedis sont travaillés.

A+
 

Pièces jointes

Dernière édition:
comme promis, une nouvelle version avec 3 modes si on utilise des jours d' "Avance"
  • Relax (R) = projet bien étudié, mais si ôn doit avancer le fin pour raison "X", on commence dès le début à choisir les samedis normaux, puis les dimanches normaux, puis les fériés du Lu au Ve, puis les fériés du samedi et puis les fériés du dimanche. Avec ces jours,vous pouvez encore "jouer", donc ce n'est pas encore 100% fixé.
  • Urgent (U) = on fait comme dans le mode "Relax", mais on commence au "Fin" vers le début avec ces priorités.
  • Crash (C) = on prend les jours non-ouvrables à partir du Fin au Début, sans priorité
Le bouton "Saute des lignes" connait 3 possibilités maintenant.
Je me demande si vous ne voulez pas une date limite comme jalon, donc le projet est fini avec telle date, au lieu de "x" jours Avance, donc remplacer la colonne G par une date


Edit : bonjour Job75
 

Pièces jointes

Dernière édition:
Bonjour le forum,

Je reviens sur :
l'utilisation des commentaires ralentit vraiment l'exécution des macros.
Chez moi l'exécution de la Worksheet_Change sur la ligne 14 prend 85 ms dont 82 ms pour :
VB:
            With Target(1, 0).AddComment(com).Shape.TextFrame
                .Characters.Font.Name = "Courier New" 'chasse fixe
                .AutoSize = True 'ajuste la taille
            End With
.Characters.Font.Name = "Courier New" => 65 ms
.AutoSize = True => 15 ms.

Le changement de police est chronophage mais quand une seule ligne est traitée c'est tout à fait acceptable.

A+
 
okay, une dernière version (petite adaptation)
on a 2 versions functionnelles.
La mienne
  • renouvelle la colonne D toujours (mais cela a seulement de l'importance quand on dépasse minuit.)
  • utilise pour le moment 5 années de féries.
  • on a 3 modes de "crash" en case d'utilisation des jours "d'avance"
  • est un petit peu plus performante (négligable)
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour