Difficultés pour améliorer la rapidité d'une itération lourde. (Macro)

morest

XLDnaute Occasionnel
Salut à tous,

Voilà je suis confronté à un problème pénible. J'ai créé une macro pour faire l'itération de calcul. Le problème est que c'est très lent et je cherche une méthode pour réduire considérablement le temps de la macro.

Voici donc une fiche excel avec la fameuse macro, en cliquant sur les ovales vous déclenchez celle que j'avais initialement fait ("très lent") puis amélioré ("lent") en cherchant sur le forum avec la fonction "Application.ScreenUpdating = True".

Le but est plutôt simple, chacune des cellules en colonne "A" doit atteindre la valeur en "B". La macro s’arrête après avoir balayé la totalité des possibilités.

Merci beaucoup d'avoir pris le temps de lire mon post et également merci si vous pouvez m'aider.
@+
 

Pièces jointes

  • Classeur1.xls
    39.5 KB · Affichages: 77
  • Classeur1.xls
    39.5 KB · Affichages: 95
  • Classeur1.xls
    39.5 KB · Affichages: 81

_Thierry

XLDnaute Barbatruc
Repose en paix
Re : Difficultés pour améliorer la rapidité d'une itération lourde. (Macro)

Bonjour Morest, le Forum

En effet c'est longuet !!! :)

Mais là où j'ai un problème, ca sert à quoi un truc pareil ? J'ai du mal à comprendre quel est le but ? Tester les ordis ou bien ?

Désolé peut-être j'ai louppé quelque chose ?

@+Thierry
 

morest

XLDnaute Occasionnel
Re : Difficultés pour améliorer la rapidité d'une itération lourde. (Macro)

Salut Thierry,

En soit ça sert à rien mais au final je vais le relier avec un classeur de données et avec 2-3 formules cela me donnera un résultat pour toutes les possibilités. Le problème c'est que le fichier de données évolue rapidement et que cette macro ne permet pas une utilisation fluide :(. En plus imagine la même chose avec un classeur de 1 mo quasiment, hyper long :(

Je ne suis pas suffisamment bon sur excel pour trouver une solution même si je continue à chercher activement! ^^.
@+
 

Dranreb

XLDnaute Barbatruc
Re : Difficultés pour améliorer la rapidité d'une itération lourde. (Macro)

Bonjour.
Attendons de voir la nature des vrais calculs à effectuer. S'ils ne peuvent résulter que d'évaluations de formules on sera toujours limité en performance. Sinon, d'une façon générale, il faut travailler avec des tableaux en mémoire. La méthode Range est très pénalisante, et ce quel que soit le nombre de valeurs de cellules transvasées. 1000 accès à une seule cellule sont donc en gros 1000 fois plus longs qu'un seul accès à 1000 cellules !
À +
 

morest

XLDnaute Occasionnel
Re : Difficultés pour améliorer la rapidité d'une itération lourde. (Macro)

Salut Dranreb,

En fait les données c'est tous simple, c'est simplement des tableaux croisés avec des recherchev partout après j'ajoute simplement une annexe qui copie le résultats si la condition est validée. Mais le problème c'est que ma macro est trop lourde quoi qu'il arrive, la à vide elle est déjà 10 fois trop lente :(.

Tu conseilles donc de commencer déjà par utiliser un "cells(x, y)"?
 

MJ13

XLDnaute Barbatruc
Re : Difficultés pour améliorer la rapidité d'une itération lourde. (Macro)

Bonjour à tous

En fait les données c'est tous simple, c'est simplement des tableaux croisés avec des recherchev partout après j'ajoute simplement une annexe qui copie le résultats si la condition est validée

Le problème c'est qu'avec le fichier fourni, il est très difficile d'envisager une solution (enfin pour moi :eek:).

IL faudrait peut-être avoir un fichier avec quelques données représentant mieux le problème avec les tenants et les aboutissants et connaître le but du jeu.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Difficultés pour améliorer la rapidité d'une itération lourde. (Macro)

Tu conseilles donc de commencer déjà par utiliser un "cells(x, y)"?
Non. Je conseille d'utiliser un Dim TV() en faisant TV = MaTrèsGrandePlageSource.Value au début et MaTrèsGrandePlageRésultante.Value = TV à la fin.
(TV est un nom que j'utilise assez souvent: ça veut dire: Tableau de Variant)
 
Dernière édition:

phlaurent55

Nous a quittés en 2020
Repose en paix
Re : Difficultés pour améliorer la rapidité d'une itération lourde. (Macro)

Bonjour à tous,

ce code ultra-court réalise la même chose
Code:
Sub Start()

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Range("A1") = 0
Range("A2") = 0
Range("A3") = 0
Range("A4") = 0
Do
Range("A1") = Range("A1") + 1
Loop Until Range("A1") = Range("B4")
Do
Range("A2") = Range("A2") + 1
Loop Until Range("A2") = Range("B1")
Do
Range("A3") = Range("A3") + 1
Loop Until Range("A3") = Range("B3")
Do
Range("A4") = Range("A4") + 1
Loop Until Range("A4") = Range("B2")

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub
à+
Philippe
 

Pièces jointes

  • 111.xls
    33.5 KB · Affichages: 64
  • 111.xls
    33.5 KB · Affichages: 70
  • 111.xls
    33.5 KB · Affichages: 70
Dernière édition:

néné06

XLDnaute Accro
Re : Difficultés pour améliorer la rapidité d'une itération lourde. (Macro)

Bonjour à tous,

Peut-etre ce code avec utilisation de tableau et si je ne me suis pas trompé ?

A+

René
 

Pièces jointes

  • Copie de Classeur1.xls
    38.5 KB · Affichages: 75
  • Copie de Classeur1.xls
    38.5 KB · Affichages: 78
  • Copie de Classeur1.xls
    38.5 KB · Affichages: 79

morest

XLDnaute Occasionnel
Re : Difficultés pour améliorer la rapidité d'une itération lourde. (Macro)

Re,

Phlaurent55 merci pour ton idée mais en fait tu as inversé l'ordre du coup le nombre de valeur balayé est vraiment moins important d'où probablement la rapidité obtenu. En fait si on regarde le schéma attendu c'est comme ca :
A1 = 1
A2 = 1
A3 = 1
A4 = 1
ensuite A2 va de 1 à 5 puis A3 viens à 2 puis A2 refait une boucle puis A3 = 3 jusqu'à la valeur limite en B2 et B3 puis on fait +1 sur A4 et on recommence donc au final le nombre de valeur balayé est très important mais merci quand même pour ton aide^^.

En revanche René ta macro fais bien ce que je cherche par contre elle le fais sans utiliser la fiche de calcul si je vois bien? J'ai fait un pas à pas et la fiche n'est pas modifé, ais je mal vu quelque chose? :p

Merci, @+
 
Dernière édition:

néné06

XLDnaute Accro
Re : Difficultés pour améliorer la rapidité d'une itération lourde. (Macro)

Re,
C'est exact , la feuille n'est pas modifié jusqu'à la fin de la procédure où elle réinscrit dans les cellules les résultats obtenus dans les tableaux Dim par la boucle for i .....

Les calculs sont fait en mémoire, ce qui accélère la procédure.

Si tu n'as pas besoin des résultats intermédiaires mais uniquement du résultat final, cette formule devrait convenir ?

A+

René
 
Dernière édition:

néné06

XLDnaute Accro
Re : Difficultés pour améliorer la rapidité d'une itération lourde. (Macro)

Re,

Il est possible de marquer des points d'arrêts et d'avoir les valeurs de dim (x) et (y), mais toi seul sais à quel moment tu désires ce point d'arrêt.

Tu peux utiliser le principe du tableau qui est dans cet exemple comme le mentionnait notre ami Dranreb.
Ce principe est beaucoup plus rapide que l'inscription sur chaque cellule.

Si tu nous adresse une feuille plus complète avec des explications plus conséquentes, nous pourrions mieux comprendre le problème .


A+

René
 
Dernière édition:

morest

XLDnaute Occasionnel
Re : Difficultés pour améliorer la rapidité d'une itération lourde. (Macro)

Re,

En fait j'essaie d'avoir une vérification en temps réel à chaque étape une petite vérification. Il faut imaginer un calcul du genre si A1*A2*A3*A4 = un multiple de 5 alors enregistrement de la valeur sinon ça continu. Je l'ai pas ajouté pour simplifier la demande et que ça pose pas de problème à faire.

J'espère que c'est plus clair maintenant :( peut être que je m'exprime mal.
Merci encore, @+
 

Efgé

XLDnaute Barbatruc
Re : Difficultés pour améliorer la rapidité d'une itération lourde. (Macro)

Bonjour à tous , "z'etes trop nombreux :)"
Il me semble, mais peut être puis-je me tromper, qu'une réelle explication du 'Ce que j'ai / Ce que je veux" serait particulièrement bienvenue.
Pourquoi écrire sur la feuille ?
Quelle est la condition qui écrit où ?
Enfin deux trois détails qui pourraient trouver réponse avec un fichier exemple représentatif de la réalité.....
Moi "j'dis ça j'dis rien"
Cordialement
 

Statistiques des forums

Discussions
312 273
Messages
2 086 701
Membres
103 374
dernier inscrit
damned42