2010-10-30 13 views
1

J'effectue des calculs de matrice qui prennent beaucoup de temps à se terminer. J'aimerais optimiser encore mes formules. Toutes les formules sont de même nature: elles remplissent une fonction de haut niveau (Moyenne, Pente, Min, Max) à travers une colonne de valeurs. Cependant, toutes les cellules d'une colonne ne sont pas incluses dans le tableau. J'utilise plusieurs critères IF pour choisir les cellules à inclure. Toutes les comparaisons sont effectuées sur la ligne actuelle. Voici un exemple des données:Optimisation d'IF à critères multiples

 A    B    C   D   E 
1 Company  Generation  Date   Value  ToCalculate 
2 Abc   1    1/1/2010  5.6   
3 ...   ...    ...   ...  ... 

E ressemblerait à quelque chose comme ça

{=Average(If(A2=A2:A1000, If(B2=B2:B1000, If(C2 > C2:C1000, D2:D1000))))} 

Donc, une fois E2 est calculé alors je dois remplir automatiquement vers le bas la colonne E. Colonne F, G, H, .. Utilise la même approche, soit sélectionne différentes valeurs à utiliser ou une fonction différente à effectuer. Mon ensemble de données est assez volumineux, et avec seulement quelques-uns d'entre eux, la feuille de calcul prend une heure de plus pour calculer. De temps en temps, j'ajoute un quatrième critère, tous les autres critères étant les mêmes.

Existe-t-il une efficacité? Quelques réflexions:

  1. Puis-je utiliser un seul tableau par colonne au lieu de milliers par colonne? Est-ce que je peux condenser les trois premiers critères de manière à ce que les résultats soient des numéros de ligne? Peut-être alors les formules suivantes n'auront pas à chercher de multiples critères mais peuvent simplement exécuter la fonction?
  2. ou en quelque sorte construire le crtieria jusqu'à? Ainsi, une nouvelle colonne renvoie toutes les lignes où la société est la même. une autre colonne renvoie toutes les lignes de la première colonne où la production est la même ... et ainsi de suite ...
+0

Vous pouvez appliquer la formule matricielle à la zone entière (Colonne E) à la fois en sélectionnant d'abord la zone, puis en entrant la matrice-formule. –

Répondre

1

Pour la moyenne, vous pouvez le faire sans tableaux:

=AVERAGEIFS(D2:D$1000,A2:A$1000,A2,B2:B$1000,B2,C2:C$1000,"<="&C2) 

Comme il y a aussi un COUNTIFS et un SUMIFS, je pense que vos pentes pourraient être calculées de la même façon.

Pour le reste des fonctions (max, min, etc), nous devrions analyser au cas par cas.

J'ai fait un léger test de performance, et c'est apparemment mieux, mais bien sûr, mes jeux de données sont juste moqués.

HTH!

Remarque: Excel 2007 et versions ultérieures seulement!

Modifier - Répondre à votre commentaire.

Sans connaître les dimensions du problème est difficile de donner des conseils, mais je vais risquer quand même:

Vous pouvez écrire une fonction VBA:

1) Génère une nouvelle feuille pour chaque entreprise -generation paire
2) trie les données dans les feuilles par date
3) Ajoute les formules à ces feuilles (pas conditionals nécessaires dans ce contexte)
4) Recalcule et obtient les résultats de ces formules et renseigne la feuille originale
5) supprime les feuilles auxiliaires

+0

Salut belisarius - bonne suggestion! J'utilise un certain nombre de comptes et de moyennes, qui ont tous les deux un équivalent «IFS». Cela nécessite encore beaucoup de la même logique à recalculer à chaque fois. Une façon de faire # 2 et # 3 suggéré ci-dessus? Si je suis toujours à la recherche de la même société et de la même génération, y a-t-il un moyen de capturer les lignes et de les utiliser comme entrée pour les autres fonctions? Aiderait avec Slope, Rsq, et les fonctions qui ne supportent pas "IFS". Pensées? – SFun28

+0

Le CountIFS, SumIFS, etc. a été un gros coup de pouce de performance. J'ai réduit le temps de calcul de 33%. La solution VBA est intéressante. Je vais en explorer d'autres et réécrire. – SFun28

+0

@ SFun28 Content de l'entendre! Si vous essayez la solution VBA, n'oubliez pas de désactiver la mise à jour de l'écran ou votre temps augmentera de 1000% –

1

Pour capturer les lignes et la réutilisation essayer cette approche:
Trier les données par la société & Generation.
Faire une liste unique de sociétés & générations (utiliser le filtre avancé, unique seulement, copier)
Pour chaque paire de génération de la société dans la liste construire 2 colonnes de formules.
La première colonne indique le nombre de lignes dans les données de cette paire (utilisez NB.SI), la deuxième colonne donne la première ligne des données pour cette paire (= première ligne pour la paire précédente + nombre de lignes pour la paire précédente).
Ensuite, vous pouvez utiliser une fonction comme OFFSET pour renvoyer uniquement les lignes de données pour la paire Company-Generation et l'intégrer dans la formule finale de la fonction/tableau (AVERAGEIFS etc)
Vous pouvez étendre cette méthode de tri et de comptage pour inclure les dates voulait.
Il y a un inconvénient: si la liste des villes et des générations change, vous devez modifier la liste des uniques et des formules associées.
Il existe des exemples de cette approche sur mon site Web au
http://www.decisionmodels.com/optspeedk.htm
http://www.decisionmodels.com/optspeedj.htm

+0

Salut Charles - c'est une approche vraiment créative. Malheureusement, ma plate-forme automatise plusieurs milliers de formules Excel et je ne sais pas quelles formules sont utilisées à l'avance (la plate-forme est utilisée par certains analystes), donc je devrais analyser la formule et la reconnaître comme un "critère multiple". ", puis faites le travail pour déterminer ce qui est utilisé dans les critères, puis appliquez votre logique. C'est pourquoi les CountIfs, etc. sont si utiles - je peux dire à mes analystes que c'est une meilleure façon de spécifier des formules. Il ne nécessite aucun travail de plate-forme. – SFun28

+0

Mon ultime espoir était de pouvoir les conseiller sur la façon d'éviter de spécifier les mêmes deux critères pour chaque formule. Il ne semble pas qu'il y ait un moyen purement formel de le faire - un code extérieur est requis. Super site en passant! J'ai effectivement utilisé des conseils sur votre site pour résoudre d'autres problèmes d'automatisation Excel.=) – SFun28

+0

Salut, Contactez-moi par e-mail (vous pouvez trouver mon email sur mon site) si vous êtes intéressé par le bêta-test d'une solution possible. –