IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Question de temps de calculs


Sujet :

Macros et VBA Excel

  1. #1
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut Question de temps de calculs
    Bonjour
    J'ai une question sur les temps de calculs d'un programme en VBA.
    J'ai en effet fait une boucle de calcul,
    du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    For i=1 to 1000
    temps=Now
     
    Calculs......
     
    Range("A1").cells(i,1)=Now-temps
     
    Next i

    et je vois que le temps de calcul augment à chaque itération.
    Alors je voudrais savoir s'il existe des moyens pour conserver un temps de calcul à peu près identique du début à la fin?

    Par exemple, dans ma boucle, j'ai créée des objets Range, mais je n'ai pas oublié de détruire ces objets:
    Set R=Nothing,


    pour éviter une dépassement de la pile, mais cela ne change pas grand chose.
    Ma question est
    existe t il d'autres moyens en VBA pour faire cela, ou est-ce inhérent à la programmation?

    Merci

  2. #2
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 37
    Points : 40
    Points
    40
    Par défaut
    Bonjour.
    D'abord, en quoi consistent tes calculs? Est-ce qu'ils dépendent de ta variable i ?
    Ensuite, si tu veux une exécution rapide, il te faut optimiser le code et notamment déclarer convenablement tes variables.
    L'utilisation de variables de type Variant allonge la durée de l'exécution du code.
    Enfin, sache que si tu dois parcourir une collection d'objets, la méthode For each est beaucoup plus rapide que For/Next.

    Cdlt.

  3. #3
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    Merci pour la réponse

    je ne recherche pas une rapidité de calcul, mais la constance du temps de calcul.

    Oui, ils dépendent de la variable i
    Plus précisément,
    j'ai un tableau de valeurs comme ceci:

    106 353
    206 453
    453 546
    454 768
    767 254
    765 456
    698 255
    534 465
    543 357
    536 645
    978 243
    143 536

    Ensuite, pour chacun de ces points, je calcule le nombre fois ou la valeur d'une ligne du tableau à droite dépasse la valeur du tableau à gauche, à la même ligne.

    Ensuite, si le nombre à droite est plus grand que le nombre à gauche, je colorie la cellule en vert et sinon en rouge.

    J'ai remarqué que ce qui faisait perdre du temps, a chaque itération, c'était le calcul lui-même, pas le coloriage.

  4. #4
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 37
    Points : 40
    Points
    40
    Par défaut précisions
    Si j'ai bien compris, tu as un tableau sur 2 colonnes A et B (pour l'exemple), et pour chaque ligne (1000 ?) tu compares la valeur dans la col.A avec celle dans la col.B.
    Mais je ne comprends pas bien
    je calcule le nombre fois ou la valeur d'une ligne du tableau à droite dépasse la valeur du tableau à gauche, à la même ligne.
    car sur une même ligne soit le nombre dans la col.A est supérieur à celui dans la col.B, soit le contraire, mais il n'y a pas de "nombre de fois"!
    Donc pourrais-tu :
    1/ donner plus de précisions
    2/ afficher le code que tu as symbolisé par "calculs........"

    Merci.

  5. #5
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    J'ai essayé de simplifier ce que je fais, mais en réalité, j'ai compliqué le truc lol.

    Je crois que tu vas comprendre mieux avec le code ci dessous:

    On a effectivement deux colonnes avec a peu près 2000 lignes.

    1 106 353
    2 206 453
    3 453 546
    4 454 768
    5 767 254
    6 765 456
    7 698 255
    8 534 465
    9 543 357
    10 536 645
    11 978 243
    12 143 536
    13 563 765
    ....

    Tu prends un point au hasard, par exemple la ligne 7.
    Ensuite, je regarde, autour d'un voisinage de 5 lignes de part et d'autres de ce point, si les valeurs de la colonne de droite sont supérieures à celle de gauche. Cela veut dire que pour le point 7 en question, on va regarder si les valeurs entre la ligne 2 (=7-5) et la ligne 12=7+5 de la colonne à droite sont supérieures à celle de gauche.
    Dans notre exemple les lignes 2,3, 4,10 et 12 vérifient la condition.
    Ensuite, je compte le nombre de fois on cette condition est remplie. Il y en a 5 pour ce point.
    Cela me donne le code suivant:



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A1").FormulaArray = "=SUM(IF(R" & ligne_b & "C" & colonne_prec & ":R" & ligne_h & "C" & colonne_prec & " <>R" & ligne_b & "C" & colonne & ":R" & ligne_h & "C" & colonne & ",1,0))"

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut deubelte et le forum
    Si tu expliquais ton problème ?
    Une simple boule de 1 à 1000 donnera une infinité de temps de calcul : ton µicroprocesseur est monotâche : il faudrait être sûr que 100% du temps et bien consacré à Excel, et ce n'est jamais le cas.
    Donc, chercher comment linéarisé le temps de calcul d'excel, me semble une idée absude.

    Dans mon jeune temps, en code machine, on calculait le nombre de cycle d'horloge de chaque instruction pour voir comment améliorer les programmes. Là oui, tu pouvais faire quelque chose

    Maintenant, tu utilises des routines de windows, au travers d'un interprétateur de texte qui lit ton code, sur une machine dont le temps de calcul est partagé, entre ton calcul, tes logiciels actifs et les "services" de windows. Si on pouvait simplement sur avoir un calcul du temps mis par les instruction, calculer 10000 fois le temps d'une opération donnerait une majorité d'une valeur. Et ce n'est pas le cas.
    A+

  7. #7
    Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 37
    Points : 40
    Points
    40
    Par défaut
    Tout à fait exact Gorfael !
    à deubelte :
    Cependant, une chose m'intrigue, car dans ton 1er message tu dis :
    et je vois que le temps de calcul augment à chaque itération.
    Or j'ai effectué un test (100 itérations) en utilisant ta formule de calcul sur une série de 200 nombres pris aléatoirement entre 1 et 999, et je n'ai pas observé d'augmentation de la durée d'exécution comme tu l'as indiqué!
    Mais comme le calcul d'une itération est trop rapide (<1ms), j'ai du mettre une pause d'une seconde entre chaque pour controler; les quelques écarts que j'ai pu observer (de l'ordre de 15ms) résultent des demandes en ressources des autres applications qui tournent (temps partagé).
    Si mon ordinateur était équipé d'un processeur à double coeur, cet écart aurait été proche de la moitié.
    Mais en quoi consite ta proc au juste?

Discussions similaires

  1. temps de calcul RSA
    Par othland dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 13/03/2006, 11h16
  2. Temps de calcul d'un algo
    Par Rémiz dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 23/12/2005, 13h52
  3. temps de calcul sius VC++ !!
    Par Axiome dans le forum MFC
    Réponses: 16
    Dernier message: 13/12/2005, 09h57
  4. Temps de calcul avec deux écrans
    Par Shaga dans le forum OpenGL
    Réponses: 2
    Dernier message: 14/11/2005, 09h24
  5. temps de calculs extremement long !!
    Par salseropom dans le forum C++
    Réponses: 9
    Dernier message: 19/01/2005, 20h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo