Calcul de quantité sur plage dynamique

Bonjour,

J'ai un nouveau problème sur mon tableau que je vais expliciter après. J'ai trouvé une solution qui marche parfaitement... mais elle est lente... très lente... oui... je vois les pourcentages qui augmente doucement... c'est infernal...

Quand j'ai un onglet ça fonctionne très bien mais à terme je dois avoir 30 onglets et la ça rame. J'aimerai savoir si il est possible de faire plus simple que ma formule de la mort.

Voici l'explication de ce que je veux :

Sur mon image en P16 je veux effectuer le calcul suivant :

Stock du jour de la dernière commande (M15) + Commande du jour de la dernière commande (M17) - Stock du jour (P15)

= ma valeur en P16 donc dans l'image le calcul fait 1 + 9 - 3 = 7

De la même manière, en V16 je voudrais le calcul par rapport à la dernière commande :

Donc P15 + P17 - V15 = 3 + 7 - 5 = 5

=> Oui on est sur un calcul simple voir très simple toute la difficulté réside dans le coté dynamique de la chose.

Si on résume la règle le calcul pour une case il faut :

Que le calcul ne se fasse que si la case de stock est renseignée (case du dessus) sinon vide,

Si elle est renseignée j'ai construit ma formule en mode :

=> on recherche la dernière fois ou le stock a été renseigné

=> Lorsqu'on trouve la valeur on recherche l'adresse de celle ci pour construire une plage qui nous permet de rechercher la dernière valeur de commande et on peut à la fin additionner et soustraire pour faire un joli calcul.

Ma formule actuellement pour la case P16 est la suivante :

=SI(ESTVIDE(P15);"";

(SI(ESTNA(RECHERCHE(9^9;$G15:O15));0;RECHERCHE(9^9;$G15:O15))+SI(ESTNA(RECHERCHE(9^9;INDIRECT(ADRESSE(LIGNE(P18);SI(ESTNA(EQUIV(RECHERCHE(9^9;$G15:O15);$G15:O15;0)+COLONNE($F15));0;EQUIV(RECHERCHE(9^9;$G15:O15);$G15:O15;0)+COLONNE($F15));3)&":"&ADRESSE(LIGNE(P18);COLONNE(O18);4))));SI(ESTNA((RECHERCHE(9^9;$G17:O17)));0;(RECHERCHE(9^9;$G17:O17)));SI(ESTNA((RECHERCHE(9^9;$G18:O18)));0;(RECHERCHE(9^9;$G18:O18))))-P15))

En pièce jointe, un tableau avec un seul onglet qui va assez vite (exemple.xlsx) et la version avec mes 30 onglets (j'ai juste copié coller les onglets) "Exemple 30 onglets.xlsx"

=> enfaite juste 15 onglets car sinon le fichier est trop gros.

Dans l'idée je cherche une optimisation des performances... la formule fonctionne bien après mes tests

Si vous avez besoin d'aide ou si ce n'est pas clair n'hésitez pas à poser les questions

Merci !!!

10exemple.xlsx (45.99 Ko)

Avec l'image c'est mieux ^^

1

Bonjour,

Pour commencer, Remplace les ESTNA() qui doublent les formules par SIERREUR().

Sinon, évite SOMMEPROD() sur un grand nombre de lignes (vides). Utilise SOMME.SI() ou SOMME.SI.ENS()

Cdlt.

bonjour à tous

salut Jean-Eric,

mon avis, en plus de ton conseil avisé de passer de SOMMEPROD à une autre fonction moins gourmande en ressources, c'est de ne pas créer de multiples onglets

s'arranger pour tout mettre dans un seul, avec des colonnes simples,

on fera dans cet onglet des saisies durant 10 ou 20 ans, sans fin

exemples de tables et de gestion de stock ici

https://forum.excel-pratique.com/viewtopic.php?f=3&t=115533

https://forum.excel-pratique.com/viewtopic.php?f=3&t=114388

on abusera des TCD pour extraire et synthétiser les données, comme dans l'exemple

note : ne JAMAIS fusionner de cellules, source de pb tôt ou tard

amitiés à tous

Merci pour vos réponses

J'ai utilisé les SIERREUR ca a un peu amélioré les choses. Mes SommeProd ici ne sont pas ultra consommateur, je bosserai dessus plus tard. J'ai trouvé une solution toute simple....

En fait avant je recherchais la dernière valeur non vide avec RECHERCHE(9^9;$G15:O15), de la... je recherchais la valeur que j'avais trouvé pour obtenir l'adresse de celle ci... et je recalculé une adresse de plage avec INDIRECT pour Récupérer la valeur de commande ou de qté reçue commandée .... mais en faite la fonction RECHERCHE fait ca nativement !! en rajoutant le paramètre vecteur :

RECHERCHE(9^9;$G10:K10;$G13:K13)

ici je vais donc chercher la dernière valeur non vide de la ligne 10 entre les colonne G et K, et pour cette valeur trouvée, je remonte la valeur qui se trouve sur la ligne 13 !!!! easy!!!

Ma formule passe donc de :

=SI(ESTVIDE(L10);"";(SI(ESTNA(RECHERCHE(9^9;$G10:K10));0;RECHERCHE(9^9;$G10:K10))+SI(ESTNA(RECHERCHE(9^9;INDIRECT(ADRESSE(LIGNE(L13);SI(ESTNA(EQUIV(RECHERCHE(9^9;$G10:K10);$G10:K10;0)+COLONNE($F10));0;EQUIV(RECHERCHE(9^9;$G10:K10);$G10:K10;0)+COLONNE($F10));3)&":"&ADRESSE(LIGNE(L13);COLONNE(K13);4))));SI(ESTNA((RECHERCHE(9^9;$G12:K12)));0;(RECHERCHE(9^9;$G12:K12)));SI(ESTNA((RECHERCHE(9^9;$G13:K13)));0;(RECHERCHE(9^9;$G13:K13))))-L10))

à

=SI(ESTVIDE(L10);"";(RECHERCHE(9^9;$G10:K10)+SI(ESTVIDE(RECHERCHE(9^9;$G10:K10;$G13:K13));RECHERCHE(9^9;$G10:K10;$G12:K12);RECHERCHE(9^9;$G10:K10;$G13:K13))-L10))

Merci en tous les cas pour vos conseil

Rechercher des sujets similaires à "calcul quantite plage dynamique"