Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL pour MAC Temps de production

Jefekoi

XLDnaute Junior
Bonjour,

C'est encore moi, mais lorsque l'on voit les résultats que vous donnez aux différents problèmes sur le forum, on peut que vous sollicitez
Un Grand bravo aux personnes qui nous aident qui parfois sont des calculs assez difficiles

Donc voici mon problème.
J'ai trouvé mille et un exemple sur le net mais sans trouver ce que je cherche exactement:

Je commence une production :
07/12/2018 09:16:32
Je la termine à :
10/12/2018 15:40:13

Je voudrais récupérer le temps passé sachant que :
Horaires :
7h00/11h45
13h00/15h45

Le matin il y a une pause de 10mn : 9h30/9h40
Le Midi un arrêt de 1h15 : 11h45/13h00
L'après midi une pause de 10mn : 15h00/15h10

Vérifier si jours férié ou pas .

Prendre en compte les week-end car la production peut commencer un vendredi et terminer un lundi .

J'ai trouvé un semblant de quelque chose sur le Net
Dans l'onglet Fériés j'ai ajouté des cellules avec un commentaire :"Voilà ce que je voudrais prendre en compte"


Merci pour votre aide.
 

Pièces jointes

  • Exemple_.xls
    51.5 KB · Affichages: 18

job75

XLDnaute Barbatruc
Bonsoir jefekoi, Patrick,

Le fichier en retour avec ces fonctions VBA :
Code:
Function Delai(deb As Date, fin As Date) As Date
Dim dat As Long, t As Date, dur As Date
Application.Volatile
dat = Int(CDec(deb))
t = TimeValue(deb)
dur = PremDer(dat, t)
For dat = dat + 1 To Int(CDec(fin))
  If IsError(Application.Match(dat, [Feries], 0)) Then dur = dur + [Ouverture].Cells(Weekday(dat, 2), 3)
Next
t = TimeValue(fin)
Delai = dur - PremDer(dat - 1, t)
End Function

Function PremDer(dat As Long, t As Date) As Date 'traite le 1er et le dernier jour
If IsNumeric(Application.Match(dat, [Feries], 0)) Or Weekday(dat, 2) > 5 Then Exit Function
Dim jour As Double, x As Double
jour = [Ouverture].Cells(Weekday(dat, 2), 3)
If t <= [Ouverture].Cells(Weekday(dat, 2), 1) Then PremDer = jour: Exit Function
If t <= [Pause].Cells(1) Then PremDer = jour - t + [Ouverture].Cells(Weekday(dat, 2), 1): Exit Function
x = [Pause].Cells(1) - [Ouverture].Cells(Weekday(dat, 2), 1)
If t <= [Pause].Cells(1, 2) Then PremDer = jour - x: Exit Function
If t <= [Pause].Cells(2, 1) Then PremDer = jour - x - t + [Pause].Cells(1, 2): Exit Function
x = x + [Pause].Cells(2, 1) - [Pause].Cells(1, 2)
If t <= [Pause].Cells(2, 2) Then PremDer = jour - x: Exit Function
If t <= [Pause].Cells(3, 1) Then PremDer = jour - x - t + [Pause].Cells(2, 2): Exit Function
x = x + [Pause].Cells(3, 1) - [Pause].Cells(2, 2)
If t <= [Pause].Cells(3, 2) Then PremDer = jour - x: Exit Function
If t <= [Ouverture].Cells(Weekday(dat, 2), 2) Then PremDer = jour - x - t + [Pause].Cells(3, 2)
End Function
J'ai nommé "Pause" la plage des pauses.

A+
 

Pièces jointes

  • Exemple(1).xls
    89 KB · Affichages: 18

Jefekoi

XLDnaute Junior
Merci beaucoup pour ton aide, il y a une erreur sur la ligne : dat = Int(CDec(deb))

Erreur de compilation:
Sub ou Function non définie
 

Pièces jointes

  • Capture d’écran 2018-12-09 à 21.21.18.png
    66.4 KB · Affichages: 21

job75

XLDnaute Barbatruc
Bonjour jefekoi, le forum,

L'originalité de la solution que j'ai donnée tient à ceci :

- boucle très rapide sur les jours, même une période de 100 ans est acceptable

- les calculs compliqués sont réservés au 1er et au dernier jour (fonction PremDer).

J'ai déjà utilisé cette méthode sur d'autres fils, faites une recherche sur PremDer.

Dernière remarque : s'il y a beaucoup de cellules à calculer supprimer Application.Volatile pour éviter les recalculs intempestifs de la fonction.

A+
 
Dernière édition:
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…