Additionner contenu de plusieurs lignes selon critères

Bonjour à toutes et à tous,

J'aurais une fois de plus besoin de vos lumières

Cette fois, cela dépasse vraiment mes compétences en VBA.

Ce que je dois faire pour ma comptabilité :

- Réunir plusieurs lignes en une seule.

En gros, mon magasin reçoit des appels et je voudrais les réunir par Codes Clients, et additionner les temps d'appel.

A une ligne correspond un sous-appel. Par exemple, le Code C (code client) 3021 a appelé 2 fois (chaque appel est divisé en plusieurs sous-appels en fonction du service qu'il a demandé), or je voudrais que chaque appel du client représente une seule ligne avec la date du début de son appel (première ligne où il a appelé) et le nombre total des secondes de la durée de son appel (additionner les secondes qu'il a passé dans chaque service pour que les secondes représentent l'appel global), et ce, sur la même ligne.

Il y a donc plusieurs conditions à remplir et c'est ça qui pose vraiment problème. Un client peut avoir appelé plusieurs fois dans la journée, s'il s'est écoulé 30 minutes dans la colonne heure, on peut considérer qu'il s'agit d'un autre appel.

Le problème est assez complexe, désolé si mes explications sont confuses. Pour résumer un peu tout ça, le but est de simplifier le fonctionnement et de regrouper plusieurs sous-appels en appels complets.

Est-ce possible ?

Merci d'avance.

En PJ, le fichier.

Bonjour

Un essai. Te convient-il ?

Bonsoir !

Tu es un DUC, c'est exactement ce que je voulais, merci

Pas con de créer un nouveau tableau, je n'y avais pas pensé et c'est vrai que ça facilite pas mal les choses.

Plus qu'à étudier ton code et à m'en imprégné maintenant ^^

Et je vais essayer de mettre le tableau de destination sur une autre feuille, pour clarifier encore plus les choses.

Encore merci, bonne soirée.

Salut à toutes et à tous, salut gmb !

Bon, ton code est parfait, j'y suis presque donc je te remercie encore.

Cependant pour des soucis de clarté, j'ai décidé de m'y prendre autrement, j'ai inversé le tris des appels dans le tableau initial pour que l'appel le plus récent apparaisse en premier, c'est plus logique.

Du coup j'ai plusieurs petits problèmes.

Vu que j'ai inversé les tris, pour chaque appel dans mon tableau de destination, cela ne prend plus en compte l'heure du premier sous-appel mais celui du dernier. Or, il me faut bien celui du premier.

Et je voudrais, si c'est possible à réaliser en VBA, changer la méthode pour calculer les durées dans le tableau de destination.

En fait, au lieu de calculer la durée des appels en additionnant la durée de chaque sous-appel, je voudrais plutôt qu'on la calcule de la manière suivante : (Heure du premier sous-appel) - (Heure du dernier sous-appel) + (Durée du dernier sous-appel). En effet sans ça, des secondes se perdent dans la nature et ce n'est pas bon pour ma comptabilité.

Je ne sais pas si je suis clair, une fois de plus ^^

Merci d'avance

EDIT : Dernier point que j'ai oublié de mentionner, pardon. Pour le premier point à revoir, celui qui concerne l'heure des appels, je voudrais donc qu'il apparaisse dans le tableau de destination l'heure du premier sous-appel. Seulement, je voudrais que cela garde bien le numéro (qui peut changer selon les sous-appels parfois) du CENTRE (Colonne B) du dernier sous-appel. C'est tordu je sais :/

En PJ, le fichier avec tris inversés.

Bonjour

Il n'y a qu'à demander !

Bye !

Bonjour et merci pour ta précieuse aide, tu gères vraiment

Seulement quand je lis ton code (qui est très propre, aucun soucis là-dessus), j'ai l'impression d'être un légume, le VBA a vraiment du mal à rentrer, j'ai vraiment du mal avec la logique dès lors que l'on dépasse les fonctions "basiques".

C'est nikel pour les heures, cela prend bien en compte l'heure du premier sous-appel (là j'ai vu que tu avais inversé le tri, que tu partais en fait de la fin). Sur ce point-là, ça ne bougera jamais dans le futur, donc je garde et en plus, je pense avoir compris ^^

Par contre, je me prends la tête depuis une heure environ sur le comptage des durées. Encore une fois tu as fait ce que j'avais demandé mais imaginons que je veuille changer ça et revenir au comptage des durées normales en additionnant juste les durées (comme tu m'avais fait au début), que dois-je changer dans le code ? A chaque fois que j'essaie de toucher à ça, je fais tout planter et Excel ne répond plus :/

En gros je voudrais garder les heures du premier sous-appel dans le tableau de destination mais revenir à la version de comptage des durées plus classique, en additionnant juste les durées des différents sous-appels. Oui je suis compliqué mais en même temps, j'ai mal identifié mon problème initialement et du coup je t'ai demandé un truc dont je n'avais pas besoin, mille excuses. En effet, je suis parti à la recherche des "secondes perdues" mais c'est complètement con puisque elles sont perdues entre les différents sous-menus et ne vont pas rentrer en compte dans ma comptabilité dans tous les cas.

Et avais-tu pris note de l'Edit de mon dernier message ? Crois-tu que c'est possible à réaliser ? Sachant que lorsque l'on est baladé d'un service à un autre, le numéro (colonne B "CENTRE") peut changer et que je voudrais que ce soit le dernier CENTRE (celui du dernier sous-appel) qui apparaisse dans le tableau de destination. Je ne sais vraiment pas si c'est possible sachant que je veux qu'à l'inverse, ce soit l'heure du premier sous-appel qui apparaisse (donc rien à changer dans le code sur ce point là).

Gros pavé indigeste qui résume la confusion de mes pensées en VBA

Merci d'avance, et bon week-end (à toi et aux autres )

Bonjour

Voici la version 3.

Pardon pour l'Edit, j'avais zappé !

What else ?

Bonjour !

What Else ? Rien, pour l'instant ! ^^

Non je déconne, je pense que je vais arrêter de te saouler, je l'espère en tout cas.

Un grand merci, que dire de plus...

A une prochaine fois

Bonjour,

GMB, autre soucis et majeur cette fois-ci :/

Tout est nikel mais je me suis rendu compte qu'il y avait un gros problème.

En effet, nous avions défini précédemment qu'on considérait qu'on passait à un appel suivant au bout de 30 minutes.

Seulement un client peut appeler, raccrocher dans la foulée et rappeler 2 minutes plus tard. Or, dans le tableau de destination, il ne sera compté qu'un seul appel, puisqu'on a précisé dans la Macro qu'on passait à un appel suivant uniquement 30 minutes après.

N'est-il pas possible de faire en sorte que l'on passe plutôt à un appel suivant si :

((Heure du sous message+1) - (Heure du sous-message)) > (Durée du sous-message) + 10 secondes ?

Pourquoi 10 secondes ? Parce que je doute qu'un client rappelle moins de 10 secondes plus tard, le temps de composer le numéro et tout ça.

Je ne sais pas si j'arrive à exprimer la logique. En effet, avec le code précédent (besoins encore mal identifiés, pardon...), certains appels étaient perdu, même si la durée des appels était bonne car reportées sur d'autres appels.

A part ça, tout colle à merveille à ce qui est attendu.

Merci d'avance.

Bonne fin de journée.

Bonjour,

Il faut donc modifier la condition du Do While si j'ai bien analysé le problème, mais je fais toujours planter Excel dès que j'y touche, je bloque là. :/

 Do While Cells(Ln, 3).Value = Cells(Lgn, 3).Value And Cells(Lgn, 4).Value + Cells(Lgn, 5).Value - Cells(Ln, 4).Value - Cells(Ln, 5).Value > Cells(Ln, 6).Value + 10 

Ce code fournit une boucle infini, et je ne comprends pas à quoi c'est du...

Merci d'avance, bonne journée.

Bonjour

Voici la nouvelle version. A tester.

Bye !

Bonjour à toi et merci de te pencher encore sur mon cas

Alors il y un problème que j'ai aussi dans ma dernière version.

Si plusieurs appels sont passés dans la même journée, il n'y en a qu'un seul qui est compté.

J'avais pensé à un Do While qui équivaudrait à ça :

 Do While Cells(Ln, 3).Value = Cells(Lgn, 3).Value _
            And Cells(Ln, 4).Value = Cells(Lgn, 4).Value _
            And (Cells(Lgn, 5).Value - Cells(Ln, 5).Value) < 10 

EDIT : Ce code voudrait traduire l'algorithme suivant :

Tant que le code client est le même

Et que la date est la même

Et que le résultat de la soustraction de (l'heure du "Sous-appel + 1") - (l'heure du "Sous-appel") < 10 secondes

On rentre dans la boucle et on calcule la durée de l'appel. Sinon, ça veut dire que c'est un autre appel.

Ai-je déjà la bonne logique ?

Mais cela ne fonctionne pas non plus, si plusieurs appels sont passés le même jour, ça chie :/

Merci, en tout cas, cool de ta part

Pour répondre à ta question, je dirai que :

1 – en faisant la soustraction des cellules, tu n’obtiens pas des secondes mais une fraction de journée

2 – c’est moi qui ne suis plus la logique… n’expliquais-tu pas dans un précédent message que tu voulais distinguer deux appels espacés de plus de 10 secondes ? et n’en compter qu’un dans le cas contraire ?

Tu écris :

Si plusieurs appels sont passés dans la même journée, il n'y en a qu'un seul qui est compté.

Alors, à quoi sert cette condition que tu mets dans ton code :

And (Cells(Lgn, 5).Value - Cells(Ln, 5).Value) < 10

Bye !

Re-Bonjour,

Merci pour ces précisions

Par contre, lorsque j'ai écrit "Si plusieurs appels sont passés dans la même journée, il n'y en a qu'un seul qui est compté.", je voulais parler de la v4 de ton fichier.

En effet, en exécutant la macro contenu dans le fichier V4, il me semble que cela ne gère pas le cas où plusieurs appels auraient été passés dans la même journée.

Par exemple, le 10/12/2012, le client 3021 a appelé 2 fois dans la journée (appels espacés de bien plus de 10 secondes), pourtant, même avec ta macro, il n'est compté qu'un seul appel dans le tableau récapitulatif, c'est pour ça que je te demandais ton avis.

EDIT : Donc mon souhait n'a pas changé, je veux toujours qu'on considère qu'il s'agit d'un nouvel appel dès que les sous-appels sont espacés d'au moins 10 secondes. Mais même sur la V4 (ta dernière version dont je te remercie), cela ne fonctionne pas encore. Je désespère sérieux ^^

Encore merci,

Tibolito.

Re bonjour

On dirait qu’on ne parle pas du même document.

Tu dis :

Par exemple, le 10/12/2012, le client 3021 a appelé 2 fois dans la journée (appels espacés de bien plus de 10 secondes),

Or,

• Il n’a pas appelé 2 fois mais 8 fois : à 11h08mn55s, 11h09mn02s,11h09mn08s, 11h09mn26s, 11h09mn39s, 13h56mn49s, 13h56mn57s et 13h57mn02s

• De plus, les appels sont espacés de plus de 10 secondes mais, pour répondre à ta dernière demande, il n’y a pas plus de 10 secondes entre la fin d’un appel et l’appel suivant.

Si les règles n'ont pas changé, je ne vois pas ce qui cloche.

Mais tu peux toujours les changer...

A te lire

Re-salut,

Si, on parle bien du même document

Le client apparaît 8 fois dans le tableau en effet, mais il a en réalité appelé que deux fois : une fois à 11:08:55 et une fois à 13:46:59.

Justement, au départ, les appels sont divisés en multiples sous-appels, qui correspondent aux différents services sur lesquels le client a été baladé. Et c'est ça que je souhaite changer, car c'est vraiment farfelu.

C'est ce que j'ai essayé d'expliquer, peut-être maladroitement, sur le premier post de ce sujet.

Le but est donc de rassembler ces sous-appels pour en faire des appels "réels", pour qu'à la lecture du tableau, ce soit bien plus compréhensible (il est logique que 2 appels soient représentés par 2 lignes plutôt que par 8 ).

Dans ce cas précis, on voit bien qu'il s'agit de deux appels distincts puisque ils sont espacés de près de 3h.

Ce que je voudrais dans le tableau récapitulatif, c'est que ces appels soient regroupés, que leurs durées respectives soient comptabilisées. Et il s'agit d'un nouvel appel dès lors que : "(l'heure du sous appel+1) - (l'heure du sous appel) > 10 secondes.

Je veux donc que dès que deux sous-appels sont espacés de plus de 10 secondes, on considère que l'on passe à un autre appel réel.

C'est dur à expliquer et peut être que je m'y prends mal, c'est vrai.

Merci encore.

Re bonjour

Entre moi qui comprend mal et ton truc tordu difficile à expliquer, c’est pas gagné !

Mais on l’aura !

Version 5.

Bye !

Bonsoir,

Oui, le problème est dur à expliquer, j'essaie d'être le plus précis possible quand même.

Je te remercie pour ta v5

Alors cette version gère parfaitement le passage à un nouvel appel, c'est nikel !

Par contre, il y a un soucis qu'il n'y avait pas sur les anciennes versions.

En effet, je ne sais pas si tu as fait attention, mais après avoir appliqué la macro, il y a un léger problème puisque dans le tableau de destination apparaît le numéro de centre du premier sous-appel alors que je souhaiterais que pour chaque appel, il apparaisse plutôt le numéro de centre du dernier sous-appel.

Encore du charabia ^^ . Mais normalement tu devrais comprendre, puisque dans tes anciennes versions, le cas était parfaitement géré.

EDIT :

Je vais regarder ça plus en détail maintenant.

En tout cas, on se rapproche vraiment du but, il n'y a plus que ce petit détail à régler, tout le reste est parfait

Merci encore pour ta disponibilité et ton aide précieuse,

Bonne soirée

Bon, c'est bon pour moi je crois, j'ai réussi à corriger ça

Je te remercie GMB, sincèrement.

Mine de rien, je me suis vraiment plongé dans le code grâce à toi, ne serait-ce que pour essayer de comprendre.

J'espère atteindre ton niveau un jour en VBA, ça m'a gavé d'être aussi peu à l'aise pour ce cas-là.

Le fichier définitif est en PJ, et je passe en résolu !

Prions que ça ne chie pas sur mon fichier réel maintenant, je passerais vraiment pour un crétin à revenir ^^

Voilà ce que j'aime en lisant mon courrier : un premier message m'annonçant un problème et, juste derrière un deuxième me disant qu'il est résolu !

Donc, je ne touche plus à rien.

Allez , bon courage !

Rechercher des sujets similaires à "additionner contenu lignes criteres"