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 :

code tres tres lent à optimiser


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Femme Profil pro
    Inscrit en
    Mars 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 120
    Points : 61
    Points
    61
    Par défaut code tres tres lent à optimiser
    Bonjour bonjour,

    J'aurais juste besoin d'un petit conseil. J'ai un programme qui fais des addition de constante n fois. C'est un petit peu compliqué à expliquer voici un exemple:

    addition=1 'constante

    Dans ma colonne excel j'ai:


    Je prend la 1ere valeur (5), je lui ajoute addition 1 fois (je tombe sur 6), je lui ajoute addition 2 fois (je tombe sur 7), je lui ajoute addition 3 fois (aucune valeur ne correspond je dois donc arrêter la recherche et passer à la valeur suivante (10)).

    Or je n'arrive pas à arrêter le programme lorsqu'il à fini et donc passer directement à la valeur suivante (10).

    Voici le code qui fais cette partie:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
           For n = 1 To 50
                        If Cells(i, 1) < valeur + n * addition And Cells(j, 1) > valeur + n * addition Then
                         trouve = True
                        End If
           Next n

    Pour chaque valeur le programme va chercher 50 fois (je sais bien que c'est ceci qui fait ralentir le programme ), j'aimerai que ce n soit variable et se termine à 2 pour l'exemple précédent.
    Comment faire ? Il y a bien le "exit for" que je pourrais utiliser mais comment lui dire d'arrêter pour ne pas ralentir le programme?

    Merci par avance

  2. #2
    Membre chevronné Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Points : 1 999
    Points
    1 999
    Par défaut
    Comment faire ? Il y a bien le "exit for" que je pourrais utiliser mais comment lui dire d'arrêter pour ne pas ralentir le programme?
    Bien sur c'est une solution, tu fait une boucle de 50 et dès que tu ne trouve plus tu sors.

    Regarde aussi du côté des autres boucles (Do while, do until), tu peux mettre ta condition en début ou en fin de boucle.

    En reprenant ton exemple, ça donnerai quelque chose comme ça :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     For n = 1 To 50
                        If Cells(i, 1) < valeur + n * addition And Cells(j, 1) > valeur + n * addition Then
                         trouve = True
                         else
                           exit for
                        End If
           Next n

  3. #3
    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 marie33000 et le forum
    Pour me répéter encore et encore, on ne connaît du problème que ce que tu veux bien donner.
    C'est bien d'essayer de donner un exemple, mais finit-le, qu'on ait une idée.
    Je prend la 1ere valeur (5), je lui ajoute addition 1 fois (je tombe sur 6), je lui ajoute addition 2 fois (je tombe sur 7), je lui ajoute addition 3 fois (aucune valeur ne correspond je dois donc arrêter la recherche et passer à la valeur suivante (10)).
    Or je n'arrive pas à arrêter le programme lorsqu'il à fini et donc passer directement à la valeur suivante (10).
    Tu dois tester quoi ? Tu fais 2 additions ? 2 comparaisons ? Qu'est-ce que tu cherches les ruptures de séquences au pas de ta constante "addition" ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    X=1
    do 
         for Y=X+1 to [A65536].end(xlup).row
              If Cells(Y, "A") <> Cells(X,"A")+addition then
                   'ce que je fais de Y
                   X=X+Y-1
                   exit for
              end if     
         next Y
         X=X+1
    Until X = [A65536].end(xlup).row
    Évidemment "j'invente" du code (pas de traitement de la dernière séquence par exemple). Mais je ne sais pas ce qu'on doit faire, avec un exemple de code que je ne peux même pas rattacher avec l'explication qui précéde...

    Pour pouvoir expliquer, il faut que tu trouves le fonctionnement de ta macro (l'algorythme). Et souvent en le faisant tu trouves le codage. On peut aider dans cette recherche, à condition de pouvoir comprendre le besoin. Pas en le devinant!
    A+

  4. #4
    Membre du Club
    Femme Profil pro
    Inscrit en
    Mars 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 120
    Points : 61
    Points
    61
    Par défaut
    Merci aalex_38 pour ta réponse ça fonctionne
    Gorfael vous y allez un peu fort là... c'est limite de l'acharnement...
    Je demandais juste un moyen de sortir de ma boucle "for" sans continuer inutilement de tester les "n". De plus je pense avoir été assez explicite vu que aalex_38 m'a compris et m'a fournis une bonne réponse...
    Je ne vois donc pas où est la problématique. Mais soit si vous avez du temps de libre je vous laisse chercher des incohérences dans mon code ou il y en a pas...

    Merci pour ton aide aalex_38 et merci d'avoir essayer de m'aider Gorfael

  5. #5
    Membre chevronné Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Points : 1 999
    Points
    1 999
    Par défaut
    Bonjour à tous,

    Marie, il n'y a pas lieu de s'enerver, en général quand on connait les tenants et les aboutissants d'un code on est plus à même de répondre voir de proposer des solutions alternatives.

    Gorfael est un expert et c'est parce qu'il cherche l'utilité d'un tel code qu'il te fait cette réponse, moi je me suis contenté (comme souvent) de répondre à ta demande.

    Ce forum est absolument génial, et on peut aller loin avec grace aux nombreux experts qui prennet la peine de nous répondre.

    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 23/05/2007, 10h25
  2. pc tres tres lent
    Par pollux75 dans le forum Sécurité
    Réponses: 3
    Dernier message: 20/09/2006, 21h35
  3. [MMX] Optimisation d'un code C++ -> plus lent
    Par Laurent Gomila dans le forum x86 32-bits / 64-bits
    Réponses: 12
    Dernier message: 17/05/2006, 18h47
  4. Impression très très lente avec Samba
    Par Daav dans le forum Réseau
    Réponses: 4
    Dernier message: 29/12/2004, 18h45

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