XL 2013 Accéler une serie de sommeprod sur plusieurs lignes et variables

GADENSEB

XLDnaute Impliqué
Bonjour le forum,
J'ai joins mon fichier crashtest
Je cherche à accélérer une série de sommeprod (colonne D) qui sont tjrs sur le mm principe avec seule variable la colonne B

Code:
=SOMMEPROD((LIGNE=B6)*(FUTUR="non")*(BQ="oui")*(DEBITCREDIT))

Dans mon fichier original j'ai une trentaine de ligne.
Le temps de calcul est super long.......Donc je me dis que l'on peut accélérer le tout en macro....
QQn aurait une idée ?

Bonne journée

seb
 

Pièces jointes

  • OPTIMISER LES SOMMEPROD - V0.xlsm
    23 KB · Affichages: 58

Dranreb

XLDnaute Barbatruc
S'ils gênent les temps de réponse d'Excel lors de modifications de la base on peut déjà envisager de les calculer seulement à l'activation de la feuille. Si ça s'inscrit dans un cadre plus général de génération de rapports j'ai des outils pour les sortir.
 

GADENSEB

XLDnaute Impliqué
en fait le recalcul se fait déjà à l'actualisation de la feuille

Schéma à la validation de l'usf
1- inscription des données dans la BDD
2- Validation de formules sur les données saisis (cela calcule d'autres données dans la bdd par rapport au données inscrites)
3- MEF des données de la BDD (format date, taille colonne, police....)
4- Activation de la feuille proncipale
5- 3 outils d'extraction (evec leur MEF) s'enclenche pour faire des extract precis dans la feuille pincipale
6-Sommeprod (ou alors les sommeprod s'executent pendant l'étapes 5 ce qui peut expliquer le ralentissement)

Tes outils d'extract sont sous quelles forme ?


nb : l'étape 2 se répéte sur l'ensemble de la bdd, alors qu'il ne faudrait qu'elle ne s'execute que sur les données inscrites lors de la validation de l'usf.. je sais ce n'est pas optimisé
 

Dranreb

XLDnaute Barbatruc
Il s'agit d'un module MClassement muni d'une fonction GroupOrg qui renvoie une collection dont les éléments, classés et sans doublon, contiennent une collection, qui peut elle même contenir des collections. Il travaille avec deux modules de classe, l'un (TableIndex) qui trouve des inverses de rangs en somme, c'est à dire des numéros d'éléments dans l'ordre nécessaire à l'accès dans celui de leurs valeurs, l'autre, tout simple, qui définit simplement le type SsGroup des objets de la collection (Essentiellement deux propriétés: Id As Variant et Contenu As Collection). Pour produire un rapport il ne reste plus qu'à imbriquer des For Each In.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
J'ai pourtant fait de mon mieux pour documenter mes modules de service, et notamment la fonction GroupOrg de MClassement. Il y a aussi une reprise des explications dans le module de classe SsGroup (il comporte même beaucoup plus d'explications que de programmation !)
Qu'est ce qui n'est pas clair ?
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour
L'exploration d'une collection renvoyée par la fonction GroupOrg peut bien sûr remplacer un SommeProd. Puisque toutes les informations de détails sont regroupées ensemble il suffit d'en additionner la colonne souhaitée dans la boucle la plus interne. Dans GrpOrgCoucoud.xls il n'y avait pas de dernière boucle For Each Détail In puisqu'il voulais seulement compter quelque chose, or le nombre d'éléments d'une collection est toujours disponible immédiatement sans avoir besoin de l'explorer.
Je suis toujours en attente d'un classeur de ta part pour faire un exemple différent, sortant un rapport que tu souhaite.
Et je suis toujours en attente de précisions quant à ce que tu n'as pas compris. Mais tu peut aussi commencer par me dire ce que tu as compris afin que je puisse te confirmer que ce n'est pas parce que tu l'as mal compris que tu n'a pas compris le reste. Compris ?…
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Une collection de GroupOrg serait plus adaptée pour sortir tout ce qu'il y a et seulement tout ce qu'il y a plutôt que de filtrer sur un seul truc comme ça pour compléter des lignes par ci par là contenant tout ce qui est possible (tous les mois en l'occurrence, et en lettres en plus, que leur classement alpha mettrait dans le mauvais ordre. Pour des regroupements par mois avec GroupOrg il vaudrait mieux =FIN.MOIS($B2;0) avec format "mmmm" en colonne D dans COMPTES). Mais on pourrait aussi essayer avec quand même.
C'est dommage que tLigne soit à une seule dimension fixe. S'il serait quand même supporté en écriture à la place d'un tableau d'une ligne et 19 colonnes, ca l'empêche d'être directement l'image exacte de la propriété Value d'un Range représentant l'ensemble de la ligne. La boucle For C = 1 to 19 pour le lire dure donc 19 fois plus longtemps que son chargement en une seule fois. Toi qui cherche à grappiller du temps par ci par là, je te le signale…
Pourquoi les données ne sont pas mises sous forme de tableau Excel ? Je peux les y mettre ?
S'il n'y a que ces colonnes C et G ça ne vaut pas le coup d'installer MClassement.GroupOrg pour ça. Ça sort trop de son cadre d'application. Par contre il pourrait y avoir du travail pour ComboBoxLiées (il utilise le même module de classe TableIndex) en autre en permettant de s'affranchir de la colonne POSTE puisqu'il saurait faire tout seul et sans qu'aucune programmation ne soit nécessaire pour ça dans l'UserForm le rapprochement entre GROUPE et LIGNE spécifiés dans deux ComboBox différentes.
 

Discussions similaires

Statistiques des forums

Discussions
312 361
Messages
2 087 609
Membres
103 606
dernier inscrit
lolo1970