J'aimerais pouvoir récupérer des stats sur le nombre d'appels simultanés max par jours sur un mois . J'ai fouillé le forum , mais les exemples ne fonctionnent pas comme je le souhaite , dans le sens ou sur un mois de stats , cela va calculer le nombre d'appels max sur l'ensemble d'un jour. (donc l'addition de 4 lundi par mois par exemple...)
L'objectif serait d'avoir un graphique qui affiche le nombre d'appels simultanés max par jours , sur un mois.
lundi 01 janvier = appels max 6
mardi 02 janvier = appels max 2
etc...
finalement je fusionne début et fin en une colonne pour n'avoir qu'une seule boucle, plus simple à gérer.
1.9 s pour les 36000 lignes
Les résultats semblent plus cohérents :
Bonjour a tous ,
Merci pour vos réponses.
Mais l'objectif n'est pas de connaitre le nombre total d'appels par jour. Mais de connaitre le nombre d'appels simultanés.
Par exemple de savoir que le 01/01/2022 sur la période de 20:30 a 20:40 j'ai eu 2 appels simultanés.
Bonjour à tous
Je suis parti sur des tranches de 10 minutes.
144 lignes sur 31 colonnes, ça rame un peu...
Mais bon, c'est fait, je le poste.
Cordialement
une approche originale qui reporte la complexité sur un tri préalable et sur le fait qu'on peut désolidariser la fin d'un appel de son début.
Ca revient à faire 2 boucles simultanées mais non imbriquées ni synchronisées, et sans besoin de regarder seconde par seconde x appels.
Ce qui donne un code court et très rapide : 0.07 s pour les 16000 lignes.
En cas de début d'un appel simultané à la fin d'un autre, je considère qu'ils se chevauchent pour retenir un max le plus important (seulement +1 mais bon, il fallait faire un choix...)
Je tiens compte de tous les appels, à la seconde près. Si certains ne doivent pas être pris en compte il faudra les éliminer avant.
Je te laisse contrôler la justesse des résultats ;-) Je n'ai contrôlé que les 1 qui m'ont surpris...
Par exemple je ne trouve pas 2 en max le 01/01 (?)
Ton 2nd appel débute à 20:38:10 alors que le précédent s'est fini à 20:38:06, ils ne sont pas simultanés. Si tu veux arrondir à la minute, fais-le réellement, pas seulement à l'affichage par un format.
eric
PS : si besoin tu peux avoir l'heure du maxi en remplaçant la dernière ligne ici :
VB:
' maxi jour ?
j = Int(datas(lig1, 1))
If marche > result(j, 2) Then result(j, 1) = datas(lig1, 1): result(j, 2) = marche
une approche originale qui reporte la complexité sur un tri préalable et sur le fait qu'on peut désolidariser la fin d'un appel de son début.
Ca revient à faire 2 boucles simultanées mais non imbriquées ni synchronisées, et sans besoin de regarder seconde par seconde x appels.
Ce qui donne un code court et très rapide : 0.07 s pour les 16000 lignes.
En cas de début d'un appel simultané à la fin d'un autre, je considère qu'ils se chevauchent pour retenir un max le plus important (seulement +1 mais bon, il fallait faire un choix...)
Je tiens compte de tous les appels, à la seconde près. Si certains ne doivent pas être pris en compte il faudra les éliminer avant.
Je te laisse contrôler la justesse des résultats ;-) Je n'ai contrôlé que les 1 qui m'ont surpris...
Par exemple je ne trouve pas 2 en max le 01/01 (?)
Ton 2nd appel débute à 20:38:10 alors que le précédent s'est fini à 20:38:06, ils ne sont pas simultanés. Si tu veux arrondir à la minute, fais-le réellement, pas seulement à l'affichage par un format.
eric
PS : si besoin tu peux avoir l'heure du maxi en remplaçant la dernière ligne ici :
VB:
' maxi jour ?
j = Int(datas(lig1, 1))
If marche > result(j, 2) Then result(j, 1) = datas(lig1, 1): result(j, 2) = marche
tous les appels sont comptés.
Si tu veux en exclure il faut les supprimer en début de macro car dans l'algorithme une fin n'est pas liée à son début.
Si tu as 5 appels en cours et qu'une fin arrive, je passe à 4 et je me moque totalement de savoir si c'est le 1er ou le 4e qui s'est fini.
D'autre part, certains appels à 0 ne sont pas à 0. Ils apparaissent ainsi car tu n'affiches pas les secondes.
Celui en ligne 10 par exemple débute à 01/01/2022 07:40:09 pour finir à 01/01/2022 07:40:41
A vraiment 0 tu en as 743. Mais s'il s'agit de dimensionner un équipement, il a quand même occupé une place et empêché un autre appel d'aboutir si tu es à toc. Donc... ???
Précise à partir de combien de secondes tu considères comme valide un appel pour le comptabiliser, j'ajouterai.
Faut-il aussi les supprimer de la feuille ?
Commenter le code ne t'aidera pas beaucoup, je préfère t'expliquer le principe.
Il s'agit de parcourir tous les événements dans l'ordre chronologique, en sachant s'il s'agit d'un début ou d'une fin.
Une image :
Tu es au pied d'un escalier, un appel arrive, tu montes une marche (la variable), et tu mets le pointeur sur le début suivant.
Un appel se termine, tu descends une marche, et tu mets le pointeur sur la fin suivante.
A chaque fois que tu montes une marche tu regardes si tu as battu le record de la journée et tu enregistres si c'est le cas (et tu mets le pointeur sur le début suivant).
C'est simple et performant. Tu fais 2 fois x (nombre de comm) boucles seulement au lieu de voir l'état sur des millions de secondes.
Première fois que je fais ça. Si ça te plait je veux bien un + ;-)
eric
Après avoir trier les données sur Start date et End date en ordre ascendant, j'ai utilisé la fonction médiane pour connaître les chevauchements de début et fin d'une ligne sur la précédente.
je viens de faire un tri avant d'envoyer les données dans le fichier de Eriic (supprimer les appels de 0 seconde ), mais les données sont quand même pas normales... 100 appels simultanées c'est impossible... voir meme 700 le 30/04
D'accord, je regarde.
Déjà je retombe bien à 0 (1 en fait mais pas grave) à chaque début de journée, ce qui est plutôt bon signe sur la logique de l'algorithme.
Par contre déboguer quand des centaines de lignes sont en cause est plutôt fastidieux et chronophage.
Et avec 2 jours à 40 de fièvre j'ai un peu de fatigue... ;-)
A+
eric