1 votes

Pouvez-vous recommander des améliorations de vitesse à ma formule Excel? J'ai besoin de l'appliquer à plus de 500 000 cellules, donc chaque économie compte.

Contexte

J'ai besoin de prendre un certain nombre d'activités avec des dates de début et de fin souhaitées, et vérifier si elles sont raisonnables compte tenu de la contrainte que seules 3 (par exemple) peuvent être entreprises simultanément. Puisqu'il ne peut jamais y en avoir plus de 3 en cours, dans mon emploi du temps je dois permettre des retards. Bien que je sache que cela peut être fait dans MS Project, j'ai besoin que cela soit fait spécifiquement dans Excel.

Problème

J'ai réussi à formuler cela dans Excel, et cela fonctionne absolument comme prévu pour un petit nombre de tâches sur une courte période (jusqu'à environ 30 000 cellules). Cependant, je dois l'appliquer à beaucoup plus d'activités, sur une durée beaucoup plus longue (potentiellement jusqu'à 500 000 cellules au total - ce qui prend actuellement environ 10 minutes à faire!). Pouvez-vous recommander des améliorations à ma formule? J'ai déjà fait beaucoup d'optimisation moi-même, et j'ai étudié quelques autres options (voir ci-dessous) :

Méthode actuelle

Capture d'écran de la méthode actuelle avec un profil indicatif

Veuillez noter que ma méthode repose sur le fait que les activités se voient attribuer un numéro de priorité, et sont classées en fonction de cela (ce sera simplement la durée de début la plus précoce).

Explication de la formule pour générer le profil/diagramme de Gantt:

  1. Si c'est la première ligne ($B9 = 1) dans le diagramme de Gantt, ne réfléchissez pas trop car il n'y a pas d'autres activités avant vous : il suffit de mettre des 1 dans chacune des cellules si vous êtes dans les dates souhaitées (SI(ET(AO$3>=$C9,AO$3<=$D9),1,"")).
  2. Pour les autres lignes... La formule vérifie si (A) vous êtes dans la plage de dates correcte (B) s'il y a déjà 3 activités en cours au-dessus de vous (C) si vous avez déjà mis suffisamment de 1 dans cette activité.

(J'utilise des tableaux Excel là où je veux que la formule soit cohérente dans chaque ligne, c'est pourquoi j'ai le 1er et le 2e point dans la même formule)

Tentatives d'amélioration actuelles:

  1. Au lieu de faire la somme de la plage entière, j'ai essayé de définir une SOMME(DEPLACER(...)) pour que moins de cellules aient besoin d'être additionnées. Cependant, après avoir essayé cela, cela signifiait simplement que la formule manquait certaines activités et conduisait donc à ce que certaines activités commencent malgré la contrainte ou durent plus longtemps que la durée prévue.
  2. Au lieu de le faire au niveau quotidien, j'ai essayé de le faire de manière hebdomadaire/mensuelle. Bien que cela accélère certainement le calcul, ce niveau de granularité ne donnait pas des résultats précis - donc je dois rester avec une granularité quotidienne.

TL:DR:

Y a-t-il un moyen d'optimiser davantage =SI($B10=1, SI(ET(AO$3>=$C10,AO$3<=$D10),1,""), SI(ET(AO$3>=$C10,SOMME(AO$4:AO9)<$D$13,SOMME($F10:AN10)<$E10),1,"")). Merci.

1voto

Mobus Points 1871

Vous gagneriez du temps CPU en supprimant le cas isolé de la ligne 1, car la comparaison constante n'est pas nécessaire pour 99,9% des lignes. Insérez simplement une ligne vide juste en dessous des en-têtes et supprimez le premier IF:

=IF(ET(AO$3>=$C10;SUM(AO$4:AO9)<$D$13;SUM($F10:AN10)<$E10);1;"")

De plus, il semble que AO$3<=$D10 et SUM($F10:AN10)<$E10 fassent la même comparaison de date de fin. Autant rester avec la comparaison unique rapide sans somme :

=IF(ET(AO$3>=$C10;SUM(AO$4:AO9)<$D$13;AO$3<=$D10);1;"")

Ensuite, définissez une plage nommée "contrainte" comme une constante (se réfère à =3) afin d'éviter une recherche de cellule :

=IF(ET(AO$3>=$C10;SUM(AO$4:AO9)

Optez ensuite pour des IF imbriqués au lieu de ET, afin qu'Excel n'ait pas besoin de calculer la somme intensive à chaque fois, lorsque les conditions du cadre sont déjà FAUSSES. Disposez les IFs dans l'ordre de plus grande probabilité d'être faux :

    =IF(AO$3<=$D10;IF(AO$3>=$C10;IF(SUM(AO$4:AO9)

Et enfin remplacez SUM par COUNT

=IF(AO$3<=$D10;IF(AO$3>=$C10;IF(COUNT(AO$4:AO9)


**Les apparences comptent également :**

Comme nous l'avons déjà discuté, le formatage conditionnel est hors de question. Vous pouvez cependant utiliser des caractères ascii comme ceci "" au lieu d'un 1 :

    =IF(AO$3<=$D10;IF(AO$3>=$C10;IF(LIGNE(AO9)-LIGNE(AO$4)+1-NBVAL(AO$4:AO9)

``

Mais cela se fait au détriment d'un comptage plus compliqué du nombre de "" précédents. Pour une alternative plus rapide, utilisez le nombre 4 formaté en police Webdings (ressemble presque à ceci ) :

    =IF(AO$3<=$D10;IF(AO$3>=$C10;IF(COUNT(AO$4:AO9)

`

Vous pouvez utiliser n'importe quel nombre de 0 à 9 et changer la police pour obtenir un effet plus visuel de "graphique à barres". Cependant, il doit s'agir d'un nombre, sinon COUNT ne fonctionnera pas et vous devrez recourir à la formule plus lente de type COUNTBLANK.

` `` ``` ```` `````

0voto

Máté Juhász Points 20291

Vous avez un nombre énorme de cellules à travailler, j'utiliserais des colonnes d'aide pour calculer les dates de début et de fin réelles et rendre le calcul du côté droit beaucoup plus simple.

  • Formule pour le début réel : =SI(COMPTE.SI($F$1:F1;">="&B2)<$C$11;B2;GRANDE.VALEUR($F$1:F1;$C$11)+1)
  • Formule pour la fin réelle : =E2+D2-1

entrer la description de l'image ici

Maintenant, dans la partie calendrier, vous pouvez utiliser une formule comme ceci : =SI(ET(X$1>=$E2;X$1<=$F2);1;"")

Mettre à jour

Comment fonctionne la formule :

  • COMPTE.SI($F$1:F1;">="&B2) - compte les activités précédentes se terminant après le début souhaité
  • COMPTE.SI(...)<$C$11 - le compare à la contrainte
  • =SI(....,B2,... - garde le début souhaité si possible
  • =SI(...,...;GRANDE.VALEUR($F$1:F1;$C$11)+1) - s'il y a besoin de retarder, vérifiez quelle activité se termine le plus tôt parmi celles qui contraignent votre début, +1 pour commencer le lendemain

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X