Améliorer la vitesse de calcul d'une macro

Résolu/Fermé
geo0258 Messages postés 20 Date d'inscription mercredi 25 janvier 2012 Statut Membre Dernière intervention 9 janvier 2019 - Modifié le 9 nov. 2018 à 09:55
geo0258 Messages postés 20 Date d'inscription mercredi 25 janvier 2012 Statut Membre Dernière intervention 9 janvier 2019 - 3 janv. 2019 à 19:03
Bonjour, je cherche à améliorer le temps de calcul d'une macro.

Pour faire simple :
Dans une feuille A, j'ai un tableau qui fait dans les 2500 lignes et avec environ 150 colonnes. Les 2500 lignes augmentent au fil des mois.
Dans la 1ere colonne, j'ai une clé unique. Dans les 149 suivantes j'ai des données qui doivent arriver de la feuille B en fonction de la clé unique et parfois d'autres critères.

Dans la feuille B, j'ai un tableau avec environ 30 000 lignes et 50 colonnes. Les 30 000 lignes augmentent au fil des mois.
Dans la 1ere colonne on retrouve la clé qui était unique en feuille A mais qui peut se répéter en feuille B

Pour remplir les 149 colonnes de la feuille A, je dois faire des RecherchesV, des somme.si.ens et des nb.si.ens.

Par exemple pour remplir A2 je dois sommer toutes les valeurs de ma clé unique (A1) retrouvées dans la feuille B et qui correspondent au critère 2

Puis pour remplir A3 je dois sommer toutes les valeurs de ma clé unique (A1) retrouvées dans la feuille B et qui corresponde au critère 3

Etc. Etc. Dans l'exemple ci-dessus c'est un somme.si.ens mais comme je vous l'ai dit ça peut être d'autres formules genre rechrecheV ou nb.si.ens.

Du coup vu que j'ai testé 2 techniques.

Solution 1 je fais une boucle sous VBA:

x = 1
While Worksheets("Feuille A").cells(x,1) <>""

Worksheets("Feuille A").cells(x,2)=worksheetfunction.sumifs(Range_a_sommer, Range_1, critere_1, range_2, critere_2)

Worksheets("Feuille A").cells(x,3)=worksheetfunction.vlookup(critere1, Range_1,numero_de_colonne, 0)

etc colonne 3

etc colonne 4

etc, etc... jusqu'à 149

x = x + 1

Wend


Dans ce cas la c'est très long à coder et c'est très long a exécuter car la macro parcoure toutes les lignes colonne 2 puis colonne 3 puis 4 et jusqu'à 150 donc 2500x149= 372 500 calculs

Solution 2:

- Je créé une 1ere ligne dans mon tableau feuille A qui restera toujours en 1ere ligne.
- Dedans je met toutes les formules nécessaires aux 149 colonnes
- Dans ma macro je désactive les calculs
- J'étire les 149 colonnes jusqu'en bas des 2500 lignes
- Je réactive les formules
- Je copie/colle tout en valeur pour ne pas avoir mes 372 500 calculs qui moulinent à cahque fois que je clic quelque part.

Résultat ici aussi c'est ultra long.

Je voudrais donc savoir, n'y a-t-il pas moyen auquel je n'aurais pas penser et qui pourrait aller plus vite. Par exemple si je me base sur la solution 1. Est-ce qu''il n'y a pas moyen d'appliquer ma formule de la colonne 2 à toute la colonne 2 d'un coup plutôt que de faire du ligne à ligne.

Merci d'avance pour votre ingéniosité.
A voir également:

4 réponses

fabien25000 Messages postés 673 Date d'inscription mercredi 5 octobre 2016 Statut Membre Dernière intervention 28 juillet 2022 59
Modifié le 9 nov. 2018 à 16:01
Bonjour,

en premier lieu, tu n'en parles pas donc tu peux utiliser
 Application.ScreenUpdating = False
à mettre au début de ton code sans oublier de le rétablier à
True
à la fin
ça a pour effet d’exécuter le code sans que l'écran ne suive. Tous les calculs se font et une fois fait, l'écran s'actualise.. ça fait gagner un peu sur la rapidité d'exécution

tu en demandes beaucoup en même temps aussi, suivant les performances de ton ordi c'est sûr que ça peut être long...

as tu pensé à scinder ton tableau sur plusieurs feuilles qui se mettraient à jour uniquement sur
Worksheet_Activate()
? ça serait problèmatique pour toi?

0
geo0258 Messages postés 20 Date d'inscription mercredi 25 janvier 2012 Statut Membre Dernière intervention 9 janvier 2019
9 nov. 2018 à 16:37
Bonjour Fabien merci pour la réponse j'avais déjà mis :
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False

Mais c'est quand même très long.

Pour la solution qui consiste à scinder le tableau en plusieurs:
Le truc c'est que lorsqu'il y a une mise à jour en feuille B je clic sur mon bouton pour alimenter la feuille A avec les mises à jour et/ou les nouvelles lignes rajoutées en feuille B. C'est seulement une fois que mes 149 critères sont calculés que ça me donne un résultat, en l'occurrence un prix pour un produit. Du coup même si je scinde en 3 ou 4 tableaux, le temps que chacun se remplisse les uns après les autres sera aussi long que de remplir une fois le gros tableau.

Tu ne sais pas si c'est possible de dire à toute une range que dans chaque cellule elle doit faire une rechercheV en fonction d'un critère qui est sur sa propre ligne? Plutôt que de dire a une cellule de faire une rechecheV, puis de passer à la cellule suivante, puis la suivante etc etc?
0
fabien25000 Messages postés 673 Date d'inscription mercredi 5 octobre 2016 Statut Membre Dernière intervention 28 juillet 2022 59
9 nov. 2018 à 16:51
Mais c'est quand même très long oui je m'en doute, c'est pour ça que j'ai bien précisé "un peu"

J'ai déjà vu un code du type
Range("A1", "B1", "C1").Value=toto
(pas sûr de la synthaxe) mais à part économiser des lignes de code, le programme passera toujuors dans toutes les cases

Désolé je n'ai pas trop de solutions à part changer d'ordi ou scinder ton fichier pour essayer de fluidifier un peu l'ensemble...
Je laisse la main (mais je continue à suivre pour ma culture)
0
geo0258 Messages postés 20 Date d'inscription mercredi 25 janvier 2012 Statut Membre Dernière intervention 9 janvier 2019
9 nov. 2018 à 17:07
Ok merci quand même :)
0