Calcul de délai d'intervention avec plage horaires et jours

Bonjour à toutes et tous,

Cela fait un bon moment que je cherche un moyen de solutionner mon casse tête.

Ayant tenté en vain d'adapter différents exemples similaires et d'appliquer moulte infos glanées ci et la sur des forums, rien a faire, je m'en sors pas...

Pour me résumer par rapport au VBA, je suis comment dirais-je ....... Comme un musicien qui connais pas grand chose au solfège.

Mon casse tête est le suivant:

Je souhaite pouvoir calculer par une fonction personnalisée, le délai d'intervention écoulé suite au signalement de la panne d'un appareil.

Il s'agit du délai entre la panne et le début d'intervention du technicien. Quand au dépannage, c’est une autre histoire.

Bien entendu, il y a des conditions.

Ces interventions se font seulement en heures ouvrables de 08:00 à 12:00 et de 12:45 à 16:45 soit deux plages de 4 heures pour un total de 8 heures.

Pas non plus d'intervention les Week-end et jours fériés.

Une demande d'intervention peut être faite en dehors de ces plages horaires, mais le délai est pris en compte uniquement à partir de la 1ère heure ouvrable qui suit la demande.

Exemple:

Une panne survient le mardi 26 février 2013 à 10:00.

Le technicien arrive sur place le mardi 26 février 2013 à 15:00.

Délais d'intervention = mardi 26 février 2013 de 10:00 à 12h00 + mardi 26 février 2013 de 12h45 à 15:00 soit 02:00 + 02:15 = 04:15 de délai d'intervention.

Mais aussi, la panne aurait pu être signalée le mardi 26 février 2013 à 06:00 et le technicien arrivant toujours à 15:00.

De ce fait, délais d'intervention = mardi 26 février 2013 de 08:00 à 12h00 + mardi 26 février 2013 à 12h45 à 15:00 soit 04:00 + 02:15 = 06:15 de délai d'intervention.

Il s'agit là du calcul sur une seule et même journée, mais la fonction doit tenir compte de plusieurs jours éventuels entre la panne et l'intervention et des WE et jours fériés.

Lors de mes recherches sur le Net, j'ai trouvé quelques lignes de code données par lacombine le 25 Mars 2010 sur ce même forum.

Il précise dans son post que le calcul ne tient pas compte de la pose méridienne.

Code de lacombine

Function HeureOuvrées(Début, Fin, PlageFériés)
For i = Début * 1 To Fin * 1 Step TimeValue("0:01")
If Hour(i) >= 8 And Hour(i) < 18 And Day(i) = Day(i + TimeValue("0:01")) _
And Application.CountIf([PlageFériés], CDate(Int(i)) * 1) = 0 _
And Weekday(CDate(Int(i)) * 1, 2) < 6 Then x = x + 1
Next
HeureOuvrées = x / 1440
End Function

J'ai bien tenté de faire une adaptation, mais ce n’est pas terrible. Cetains calculs sont bons, mais certains autres ne le sont pas !!!

Code que j'ai tenté d'adapter à mes besoins

Function HeureOuvrées(Début, Fin, PlageFériés)
For i = Début To Fin Step TimeValue("00:01")

If Hour(i) >= 8 And Hour(i) < 12 And Day(i) = Day(i + TimeValue("0:01")) _
 And Application.CountIf([PlageFériés], CDate(Int(i))) = 0 And  Weekday(CDate(Int(i)), 2) < 6 _
 Then x1 = x1 + 1
If Hour(i) >= 12.45 And Hour(i) < 16.45 And Day(i) = Day(i + TimeValue("0:01")) _
 And Application.CountIf([PlageFériés], CDate(Int(i))) = 0 And Weekday(CDate(Int(i)), 2) < 6 _
 Then x2 = x2 + 1

x = x1 + x2
Next
HeureOuvrées = x / 1440
End Function

(voir fichier Excel 2007 joint)

Si l'une ou l'un d'entre vous qui me lisez pouviez m'aider, ce serait un grand soulagement car ça fait plusieurs semaines que je me torture les neurones en vain.

Cdlt

Bonjour

Un essai

Bonjour le forum,

Bonjour Banzai64,

Merci Banzai64 pour ce retour super rapide.

Non seulement c'est rapide, mais cela fonctionne très bien en ce qui me concerne.

J'ai fait quelques test et j'ai remarqué que au delà de 546:07 heures de délai la fonction m'affiche #VALEUR!

Pourquoi ???

Comme je suis un peu curieux, j'ai cherché à comprendre.

Sans doute une valeur qui ne convient pas ou un type de variable à modifier.

J'ai remplacé le type de la variable X qui est Integer par Double, puis Currency, puis Variant afin de voir si cela changeait qq chose.

(Je suppose que VBA utilise les valeurs décimales des dates et heures)

Effectivement, cela évolue, j'ai moins de #VALEUR!

Sur les 51 calculs effectués dans le fichier joint, 17 donnent l'erreur #VALEUR!

Quand je change le type de la variable X en Double par exemple je passe à 6 qui donnent l'erreur #VALEUR!

En revanche, je me sens bien embêté pour l'expliquer.....

Peut être que quelqu'un peut fournir une explication ?

Toujours est-il que la fonction que tu as "pondue" me convient amplement, car les délais d'interventions auxquels je suis confronté habituellement ne dépassent jamais 3 ou 4 jours. Au pire, mais cela reste exceptionnel tout au plus 1 à 2 semaines.

Conclusion, c'est parfait pour moi.

Je vais continuer à faire des tests avec des horaires un peu tordus sur des périodes plus courtes qui me conviennent (de quelque minute à 1 mois).

Je posterais le résultat pour ceux que ça peut intéresser

Merci encor et bonne fin de WE.

Bonjour

Oui c'est un dépassement de capacité qui provoque cette erreur

Le fait de typer X en double pallie ce problème

x contient le nombre de minute :

546:07= 546 * 60 =32760 + 7 = 32767 (maxi Integer=32 767) Résultat ok

546:08= 546 * 60 =32760 + 8 = 32768 (maxi Integer=32 767) dépassement de capacité ==> #VALEUR!

Moi je l'ai typé en Long

Mais sur les 6 (non conformes au calcul manuel : 4 sont dus au mauvais calcul manuel)

Exemple

mercredi 02 janvier 2013 13:45 mardi 09 avril 2013 16:00 546:15 546:15 Résultat conforme au calcul manuel

mercredi 02 janvier 2013 13:45 mardi 09 avril 2013 16:45 548:00 547:00 45 minutes en plus donne 547:00 et pas 548:00

mercredi 02 janvier 2013 13:45 mardi 09 avril 2013 20:00 548:00 547:00 On doit trouver 547:00

Exemple

dimanche 10 février 2013 08:00 jeudi 23 mai 2013 13:45 549:00 549:00 Résultat conforme au calcul manuel

dimanche 10 février 2013 08:00 jeudi 23 mai 2013 16:45 550:00 552:00 3 heures en plus donne 549:00 + 3 = 552:00

dimanche 10 février 2013 08:00 jeudi 23 mai 2013 20:00 550:00 552:00 Même journée mais après la débauche

Et pour les 2 qui restent vérifies bien tes calculs

Bonjour à tous,

une fonction que j'avais faite, que j'ai un peu modifiée.

Tu peux définir 4 plages différentes pour chaque type de jour : lundi à dimanche + férié.

J'ai mis tes données sur mon classeur car j'avais trop de lenteurs sur ton fichier de 11:04.

eric

322gna.zip (97.69 Ko)

Bonjour à tous,

Banzai64

Effectivement, je me suis bel et bien planté sur mes calculs manuels.

Donc en reprenant mes calculs, ça marchait déjà beaucoup mieux bien...

De plus, le fait de passer X en Long, ça marche encore beaucoup plus mieux bien.

Comme promis, voici quelques essais de 1 minute à plus de 2000 heures en passant de 1 journée à plus d'un an à cheval sur 3 années.

C'est un peu long quand les heures s'accumulent, mais ça marche nikel.

eriiic,

Ta fonction est également impéccable pour mon besoin.

Merci beaucoup.

Bonne soirée à toutes et tous.

Bonjour, je suis débutant sur excel vba et je souhaite calculer le temps passer en deux dates en tenant compte de trois paramètres: Date de début, date actuelle, date de fermeture du ticket, et jours féries. L’idée c'est de tire si pas de date de fin alors calculer le temps passé entre la date de début et la date actuelle sinon ne rien faire ou encore écrire dossier classé.

Mes plages de travail: 8h-18h

Pour cela je suis partie sur cette fonction :

Cas ou j'ai pas encore la date fin: ainsi je souhaite calculer ici le temps déjà passé le dossier:

Function HeureOuvrées(Début, DateActuelle, DateFin, PlageFériés)

For i = Début * 1 To DateActuelle * 1 Step TimeValue("0:01")

If Hour(i) >= 8 And Hour(i) < 18 And Day(i) = Day(i + TimeValue("0:01")) _

And Application.CountIf([PlageFériés], CDate(Int(i)) * 1) = 0 _

And Datefin ="" And Weekday(CDate(Int(i)) * 1, 2) < 6 Then x = x + 1

Next

HeureOuvrées = x / 1440

End Function

Cependant à chaque fois que je fais appel à cette fonction: mon fichier excel bugs au point ou je ne peux plus rien faire ( j'ai soupçonné une boucle infini mais lorsque je regarde le code c'est le cas)

Pouvez vous m'apporter de l'aide

Bonjour,

tu aurais dû créer ton propre topic plutôt que de te rattacher à un vieux truc que peu de personne va lire.

Pourquoi faire une boucle pour compter les minutes ? Multiplié par le nombre de fois où tu utilises ta fonction c'est du temps perdu.

Il faut compter le nombre de jours ouvrés * 10h desquels tu soustrais le temps manquant du 1er et du dernier jour (ou alors ce sont des jours entiers ? aucune précision là-dessus !).

Il y aurait bien d'autres choses à dire sur ta fonction. Démarre ta propre question avec un petit fichier qu'on voit le contenu de tes cellules, le *1 parait étonnant.Et soit précis....

eric

Merci eriiic, désolé d’avoir écrit ici. Je vais créer le nouveau topic et mettre le maximum d’éléments. Meri

Rechercher des sujets similaires à "calcul delai intervention plage horaires jours"