Calcul d'une différence de temps à partir de certaines lignes

Bonjour,

une version adaptée (non testée)

Bonjour,

Ça fonctionne je vous remercie. Je viens de remarquer une autre erreur. Je prends un exemple concret : le 21/10/20 consignation du tank 11 à 01:59, remplissage du tank 11 à 02:57 et soutirage du tank 11 le 22/10/20 à 11h43. Le calcul fait donc la différence entre l'heure de soutirage et l'heure de remplissage. Or, en fait il manquait la ligne de soutirage, le calcul a donc pris la première ligne de soutirage qu'il trouvait après la ligne de remplissage du tank 11 et qui en l'occurrence correspondait en fait à une autre consignation du tank 11 du 21/10/20 à 13:55 et d'un autre remplissage du tank 11 le 21/10/20 à 16h34. Il faudrait pouvoir ajouter que s'il trouve une autre consignation du même tank et un autre remplissage du même tank avant le soutirage alors il abandonne, il oublie la recherche du soutirage, il supprime les deux lignes de consignation et remplissage ne correspondant pas à un soutirage correct et il reprend avec la nouvelle consignation et le nouveau remplissage. Je ne sais pas si vous voyez ce que je veux dire ?

bonsoir,

une nouvelle version.

Bonjour,

Je vous remercie. Je viens de regarder le fichier. Quelque chose ne va pas et je ne parviens pas à modifier le code pour que ça fonctionne. De ce que je comprends, le code que vous avez écrit abandonne la recherche d'un triplet s'il trouve une consignation d'un même ou d'un autre tank avant un remplissage. Ce n'est pas bon, s'il a trouvé une consignation pour un tank x, un remplissage 10h après max de ce tank x et qu'il cherche un soutirage du tank x mais qu'il tombe sur un nouveau remplissage de ce même tank x avant d'avoir trouvé le soutirage alors on abandonne les deux premières lignes de consignation et remplissage. C'est la seule condition. Il peut y avoir une consignation ou un remplissage d'un autre tank entre le remplissage et le soutirage du tank x. En fait il n'est juste pas possible de re remplir un tank déjà rempli sans l'avoir soutiré avant, vous voyez ce que je veux dire ?

bonjour,

une erreur dans la gestion des 10h max.

Bonjour, le problème reste le même. Dans vos lignes de code vous mettez "Or .Cells(j, 4) <> .Cells(i, 4)" mais pour moi c'est faux ? Au contraire il faut que les lignes de consignation et remplissage d'un tank x soient supprimées que s'il y a une autre consignation et remplissage du même tank x avant le soutirage. Autrement dit, avec la BDD raccourcie, je devrais avoir un calcul d'âge du lait pour le tank 8 consigné le 02/01/16, rempli le 02/01/16 à 22h57 et soutiré 03/01/16 à 16h22 et un autre calcul d'âge du lait pour le tank 8 consigné le 04/01/16 à 16h36, rempli le 04/01/16 à 21h19 et soutiré le 05/01/16 à 13h40. En effet, le soutirage du premier tank 8 a eu lieu entre la consignation du second tank 8 et entre le remplissage du second tank 8, c'est donc OK. Les lignes de consignation et remplissage du premier tank 8 auraient dû être supprimées s'il y avait eu un remplissage du second tank 8 avant le soutirage du premier tank 8.

L’algorithme s’applique sur une copie des données triés sur le numéro de tank et donc quand le numéro de tank est différent de celui de la consignation ou du remplissage il ne sert à rien de continuer à chercher. Voir la feuille contrôle pour voir le résultat du tri et vérifier si c’est correct ou pas. J’ai mis un v pour indiquer ce qui selon moi et selon ma compréhension de tes instructions forme un triplet complet. J'ai l'impression de tourner en rond.

Donc je te propose de repartir de la feuille de contrôle (ta bbd triée sur n° de tank et ordre croissant sur la date), d'y indiquer les lignes qui forment un triplet en attribuant à ces triplets un numéro unique et l'explication pour laquelle elles forment un triplet et indiquer les lignes à rejeter avec l'explication pour laquelle il faut les rejeter.

j'y jetterai un oeil à l'occasion.

Ci-joint la feuille de contrôle remplie (en gris pâle et foncé : les triplets OK que vous avez trouvé et pour lesquels je suis d'accord, en rouge les triplets non trouvés entièrement à supprimer pour lesquels nous sommes d'accord tous les deux, et en vert le triplet que vous ne trouvez pas et que je trouve). Le triplet vert est OK car le soutirage du premier tank 8 se trouve avant le remplissage du second (même si la consignation du second est avant ce n'est pas gênant, c'est le remplissage du second tank qui ne peut pas être avant le soutirage du premier tank). En espérant que ce soit plus clair...

9age-des-laits.zip (279.32 Ko)

En fait il faudrait que les lignes soient supprimées s'il y a à la fois la consignation et le remplissage du second tank avant le soutirage du premier. Je pense que c'est la seule chose à modifier. Changer la ligne de code suivante :"If (.Cells(q, 1) = "CONSIGNATION" And .Cells(q, 4) = .Cells(i, 4)) Or .Cells(q, 4) <> .Cells(i, 4) Then" avec "If (.Cells(q, 1) = "REMPLISSAGE" And .Cells(q, 4) = .Cells(i, 4)) Or .Cells(q, 4) <> .Cells(i, 4) Then" n'est pas bon. Il faut arriver à lui faire comprendre qu'il faut supprimer les lignes que s'il y a A LA FOIS la consignation et le remplissage du second tank avant le soutirage du premier.

bonsoir,

une nouvelle version, à première vue cela correspond à la sélection que tu m'as mise.

un retour ? merci de rien avec plaisir

Bonjour,

Je m'excuse, je reviens seulement de vacances je regarde ça demain ! Je vous remercie beaucoup !

Bonjour,

Je viens de tout vérifier, je tiens à vous remercier. Sur la BDD que vous aviez tout est OK (l'amélioration a bien été apportée concernant le tank 8 donc c'est OK). Par contre, le but était de supprimer les lignes de consignation et remplissage lorsque que la ligne de soutirage associée à ce tank se trouve après une consignation ET un remplissage d'un second même tank (si juste après une consignation c'est OK on garde les lignes mais si après une consignation ET un remplissage on supprime). Ex : j'ai rajouté dans l'onglet BDD finale des lignes concernant le tank 12 pour mettre en application ce que j'ai dit. Il y a une première consignation du tank 12, suivi d'un remplissage de ce tank. Seulement la ligne de soutirage du tank 12 se trouve après la consignation et le remplissage d'un second tank 12 donc les premières lignes de consignation et remplissage devraient être supprimées. J'ai bien expliqué sur le fichier joint dans l'onglet "tri sur tank et date pour contr". Pourriez-vous m'aider une dernière fois s'il vous plait ? Je vous remercie d'avance.

J'ai essayé plusieurs choses à partir du code proposé mais je ne parviens pas à résoudre cette subtilité...

bonjour,

Une nouvelle version. En espérant que cette fois-ci tous les cas possibles ont été identifiés.

Bonsoir, je vous remercie beaucoup ! je regarde ça mardi et vous fait un retour !

Bonjour, je vous remercie beaucoup, ça fonctionne parfaitement ! J'ai essayé de comprendre votre code et je ne comprends pas bien votre stratégie avec les triplets, je vais essayer de creuser. Je ne comprends pas non plus à quoi sert la variable ligneprec ?

Bonjour,

J'ai finalement compris votre démarche qui est très astucieuse ! Serait-il possible d'ajouter une condition dans la boucle de recherche de soutirage svp ? Il faudrait que l'espace de temps entre un remplissage et un soutirage soit strictement supérieur à 5h et inférieur ou égal à 50h (si l'espace de temps est inférieur à 5h oublier la ligne de soutirage trouvée et rechercher une autre ligne de soutirage et si l'espace de temps est supérieur à 50h oublier les lignes de consignation, remplissage et soutirage. J'ai expliqué tout cela comme d'habitude dans le fichier. Je pense que c'est cette fois la dernière subtilité du calcul.

Je vous remercie d'avance et vous souhaite une bonne soirée !

Léa

bonjour,

une adaptation

Je vous remercie ! Ca fonctionne parfaitement !

Bonne journée à vous !

Rechercher des sujets similaires à "calcul difference temps partir certaines lignes"