Comment améliorer Sommeprod()

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Bonsoir,

Comment améliorer Sommeprod() lorsque cette fonction

- travaille sur des champs de taille importante
- est recopiée x1000 fois

Sur l'exemple en PJ, avec une fonction perso matricielle, on passe d'un temps de recalcul de 3 sec à 0,05 sec pour 4.000 lignes

=SOMMEPROD((dates=A2)*(numero=B2))

ou

=CombienFois(numero; dates)

Code:
Function CombienFois(champ, champcritere)
  Application.Volatile
  Set mondico = CreateObject("scripting.dictionary")
  a = champ
  b = champcritere
  For i = 1 To UBound(a)
    temp = a(i, 1) & " " & b(i, 1)
    mondico(temp) = mondico(temp) + 1
  Next i
  Dim retour()
  ReDim retour(LBound(b) To UBound(b))
  For i = LBound(b) To UBound(b)
    temp = a(i, 1) & " " & b(i, 1)
    retour(i) = mondico(temp)
  Next i
  CombienFois = Application.Transpose(retour)
End Function


JB
Formules Matricielles
 

Pièces jointes

  • CombienPerso.xls
    399 KB · Affichages: 74
  • CombienSommeprod.xls
    397.5 KB · Affichages: 42
  • MatricielPerso.xls
    36.5 KB · Affichages: 55
  • MatricielPerso.xls
    36.5 KB · Affichages: 54
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
Re : Comment améliorer Sommeprod()

Bonsour®

Merci Jacques pour ce rappel à privilégier l'utilisation de ("scripting.dictionary")dans de nombreux cas matricielles.

pour info :
(merci Misange pour la "résurrection" du site de LL)

Ce lien n'existe plus

Ces formules ne représentent pas la meilleure réponse aux problèmes posés. Dans de nombreux cas il est préférable de recourir à des fonctions VBA ou à des formules "normales".
Les formules matricielles sont en effet de gros consommateurs de mémoire vive et de temps de calcul. Elles permettent néanmoins d'obtenir certains résultats apparemment impossibles à obtenir par de simples formules, sans macro.
Ce lien n'existe plus
 

david84

XLDnaute Barbatruc
Re : Comment améliorer Sommeprod()

Bonjour,

SOMMEPROD étant une fonction faite avant tout pour faire la somme des produits, autant la comparer dans ce cadre.

Ci-joint 2 tests entre SOMMEPROD et 2 fonctions personnalisées utilisant Dictionary et la trame initiale de Jacques.

Attention toutefois à comparer ce qui est comparable : outre le fait qu'une fonction personnalisée bien construite sera généralement plus rapide qu'une fonction matricielle "généraliste" (puisque pensée et construite pour ce problème spécifique), le mode de validation de ces fonctions personnalisées (entrée de la formule en une seule fois dans l'ensemble de la plage d'un côté, validation de SOMMEPROD cellule par cellule de l'autre) ne permet pas à mon avis de jauger la vitesse de traitement de SOMMEPROD.

Constatons simplement que les fonctions personnalisées sont plus rapides et plus adaptées dans ce contexte précis.
A+
 

Pièces jointes

  • SommeProd.xls
    874 KB · Affichages: 37
  • SommeProd.xls
    874 KB · Affichages: 48
  • SommeProd.xls
    874 KB · Affichages: 43
  • SommeProdMat.xls
    616 KB · Affichages: 43

Discussions similaires

Réponses
12
Affichages
247

Statistiques des forums

Discussions
312 206
Messages
2 086 219
Membres
103 158
dernier inscrit
laufin