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 :

[VBA-E]Probleme d'optimisation


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 102
    Par défaut [VBA-E]Probleme d'optimisation
    Voila, j'ai conçu (avec l'aide de personnes du site; merci! ) un programme me permettant d'entrer des données dans une table annuel a partir de fichiers mensuels.

    Grosso modo je copie et colle le fichier mensuel.
    Pour i allant de la premiere à la derniere entrée, il regarde entrée par entrée si celle ci existe dans le fichier annuel.

    Si oui, il ajoute les valeurs
    Si non, il ajoute une entrée.

    Le probleme est que j'ai donc deux boucles for imbriqués.

    mes fichiers mensuels ont environ 2000 entrées et le fichier annuel approche les 8000, soit 2000*8000=16000000 d'opérations. Et vu que le PC n'est vraiment pas un foudre de guerre...ça dure....ça dure....

    il me reste plein d'années a traiter. 1h20 par mois, c'est trop long.

    Des techniques d'optimisations?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    coucou,

    je compernd peut etre mal le probleme mais pourquoi as tu 2 boucle for??

    pour moi tu devrais en avoir une et 2 conditionnelles


    Citation Envoyé par sk8bcn
    Si oui, il ajoute les valeurs
    Si non, il ajoute une entrée.

    Le probleme est que j'ai donc deux boucles for imbriqués.

    Fait voir cette partie de code

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 102
    Par défaut
    avant de te faire peur avec mon code (c'est long) je te donne un exemple

    mensuel
    client 1 10€
    client 4 60€

    annuel
    client 1 5€ 20€
    client 2 10€
    client 3 5€ 5€ 15€ 50€

    ma premiere boucle for va regarder le mensuel pour i allant de 1 à 2


    ma seconde s'imbrique: pour j allant de 1 à 3
    si numero de client mensuel=numero client annuel, ajouter la valeur derriere le nom et marquer l'enregistrement (enregistrement = Vrai)

    next j

    si enregistrement = faux, on ajoute l'entrée

    next i


    Donc le résultat est:

    annuel
    client 1 5€ 20€ 10€
    client 2 10€
    client 3 5€ 5€ 15€ 50€
    client 4 60€

  4. #4
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 102
    Par défaut
    Une précision: je ne peux couper ma boucle a la premiere apparition d'une entrée car une entrée peut réapparaitre

    annuel
    client 1 5€ 20€ 10€ cloturé
    client 2 10€
    client 3 5€ 5€ 15€ 50€
    client 4 60€
    client 1 10€

    est une possibilité. En fait, si je parlais en terme de clé façon SGBD, ma clé serait (Numéro de client, nombre d'apparition dans la liste)

    En conséquence:

    client 1 5€ 20€ 10€ cloturé <----ici en fait j'enregistre client 1,nb apparitions=0
    client 2 10€
    client 3 5€ 5€ 15€ 50€
    client 4 60€
    client 1 10€<----ici j'enregistre client 1,nb apparitions=1


    remonter le liste en sens inverse pourrait avoir du sens, mais si un utilisateur trie la liste le programme bug. :/

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 102
    Par défaut
    bon je change ma question. While est-il plus rapide que for?

  6. #6
    Membre Expert Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Par défaut
    L'avantage du "While", c'est qu'il s'arrête dès qu'il a sa condition remplie, alors que "For" va forcément jusqu'au bout de son comptage, même s'il a déjà fait ce que tu lui demandais.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    coucou,
    je n'ai pas relu tout ton probleme mais je dirai que l'on ne peut pas parler de vitesse entre les 2 instructions.

    1)Si tu fais for i=1 to n, il fera n fois les instructions.
    Si tu fais un while, tu as une condition au minimum (while i<n, il faudra egalement ne pas oublier de mettre i=i+1 avant ton Loop), si tu n'a que cette condition, je n'en suis pas sur à 100% mais pour moi les 2 traitements se valent au niveau rapidité.

    2)Par contre si tu as une autre condition du genre : while i<n And j<200 (c'est une condition que j'ai prise au hasard biensur ) et que j risque de depasser 200 assez rapidement alors ca t'evite de boucler n fois.

    Mais de toute facon je pense que, selon ce que tu veux faire, tu ne rencontrera que rarement le 2eme cas car soit tu veux faire le traitement n fois et tu connait n (donc tu fais un for ou un while) soit tu as une autre variable pour laquelle tu ne sais pas comment sa valeur va évoluer et si tu fais un for tu n'aura pas dans tous les cas le resultat attendu(et donc tu fais un while)

    je ne sais pas si c'est clair mais tu dois t'en rendre compte meme sans savoir programmer, dans ta tete tu dois connaitre les conditions et donc savoir quelle instruction il te faudra


    Edit : saleté de bipbip, alors que je m'applique à faire une réponse complete, toi t'arrives, tu laches 2 phrases et hop je passe pour un copieur de réponse apres

  8. #8
    Membre Expert Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Par défaut
    Elstak, s'il te plait, évite de répéter de manière moins efficace ce que j'ai déjà écrit. Tu pollues le post de sk8bcn...

    Warf, warf, warf... Mort de rire...

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    Je ne répondrais qu'une chose à ce coup bas :

  10. #10
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 102
    Par défaut
    En fait Elstak, j'ai tenté un Do...loop while et j'ai aussi changé tous les appels à

    worksheets("....").cells(.,.)

    par des

    dim .... as worksheets
    set ....=worksheets("....")

    par ailleurs, j'ai trié les pages par probabilité de présence (pour ainsi dire) pour optimiser la sortie de boucle while.

    De 5 heures de traitement, j'esperais descendre à2h...résultat: 20 MINUTES. O_o

    20 minutes.... gwaaaaa mon premier code devait vraiment etre mauvais.

    Néanmoins! Je sors plus vite des boucles while et dans ma tete (he he) je devrais en sortir trois fois plus vite en moyenne (1/5 des données bouclent totalement, le reste, je dirais 3/5 sortent vites et 1/5 lentement). Ce ne sont que des estimations.

    5h/3= environ 2h

    Mais là, on arrive à 20 minutes.

    Est-ce que le recours aux variables a fait gagner du temps de traitement? Le guide de Rabilloud semble indiquer que oui, mais je ne vois pas pourquoi?

  11. #11
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 102
    Par défaut
    au fait merci à tous les deux et au site!

    De Noob, je passe à developpeur débutant! Et sincèrement les progrès fait font plaisir!

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    Hello,

    Citation Envoyé par sk8bcn
    5h/3= environ 2h

    Mais là, on arrive à 20 minutes.

    Est-ce que le recours aux variables a fait gagner du temps de traitement? Le guide de Rabilloud semble indiquer que oui, mais je ne vois pas pourquoi?
    bah dure à dire comme ca sans le code avant / apres mais si tu veux voir ce que faista boucle pour un nombre donné, tu changes ta condition, par exemple au lieu de "while j<1000" tu met "while j<2" et tu place des debug.print dans ta boucle (tu sais t'en servir?) ainsi tu vois quand ca sort etc... et en ayant changé ton 1000 par 2 t'evite de passer 20 min pour avoir le resultat. Enfin je sais pas quelles sont tes conditions de ta boucle mais je pense que tu as compris l'idée

  13. #13
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Trois questions avant une hypothèse :

    - Sectionnes-tu tes données dans les feuilles ? (avec Select)
    - Sélectionnes-tu les feuilles ? (avec Select)
    - Les mouvements de feuilles sont-ils apparents ?

    Tu dis

    A+

  14. #14
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 102
    Par défaut
    A elstak: non je ne sais pas utiliser debug.print! quand je verifie ce qu'il ce passe, j'utilise des pas à pas.

    aucun select SAUF pour les tris.

    En revanche, mon nouveau code dispose de screenupdating=false, puis true. Mais sans select, je pense pas que la difference soit enorme.

    Le code contient beaucoup de reference a des variables. Je peux le mettre...mais il est assez ennuyeux à lire.

    En resumé c'est ça:
    trier par date la table resultat

    lire la table 1 par boucle for.
    tant que: l'entete en ligne i n'est pas egal à l'entete de la table 1 ou que j>au nombre de lignes du resultat
    faire j+1


    si j<nb de lignes,
    ajoutez les donnees en j
    sinon
    creer une nouvelle entrée et mettre les resultats.

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    Ok pour le pas à pas si tu t'en sers bien ca revient aux debug.print.

    en gros les debug.print sont des sorte de msgbox mais dont le contenu est copié dans une fenetre (ta pas 1 fenetre qui s'ouvre par debug.print).

    tu peux faire par exemple

    en supposant "a" comme variable, t'aura sa valeur dans la fenetre d'execution (ctrl+g pour l'afficher)

    ca peut etre mieux que le pas à pas dans certain cas surtout dans les boucle je pense car le code tourne "normalement" et ensuite tu peux voir les valeur qu'on prises tes valeurs dans la fenetre d'execution

  16. #16
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 102
    Par défaut
    oh, c'est cool ça! Le premier coup j'ai fait un pas à pas simple. Apres plusieurs F8 j'ai mis une balise en sortie de boucle. Mais ça je me le note! Merci!

  17. #17
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Bon, pour le screenupdating, effectivement, si tu ne fais pas de sélection, ça n'apporte pas grand chose
    Pour le tri, si tu ne le fais qu'une fois...
    Reste
    lire la table 1 par boucle for.
    tant que: l'entete en ligne i n'est pas egal à l'entete de la table 1 ou que j>au nombre de lignes du resultat
    faire j+1

    si j<nb de lignes,
    ajoutez les donnees en j
    sinon
    creer une nouvelle entrée et mettre les resultats.
    Pour t'aider, je crois que nous allons devoir passer par le code...
    Pour les variables, elles ralentissent bien évidemment le code et occupent de la place en mémoire. En outre la lecture d'une variable est plus longue que l'exécution d'une instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MaVar = Cells(i,j).Value
    Cells(k,l).value = MaVar
    est bien sûr plus long que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(k,l).value  = Cells(i,j).Value
    A défaut de connaître ton code

    A+

  18. #18
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 102
    Par défaut
    En fait (juste pour etre sur) la reduction de de 5h à 20minutes me semble parfait et le programme tourne correctement.

    Je me demandais surtout POURQUOI il avait pu etre reduit à ce point.

    Je peux poster le code si besoin est. Si personne n'a de réponse, ce n'est pas grave, je suis deja assez content comme ça et bien content de contribuer/ennuyer sur ce forum

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    Citation Envoyé par sk8bcn
    Si personne n'a de réponse, ce n'est pas grave, je suis deja assez content comme ça et bien content de contribuer/ennuyer sur ce forum
    jcrois que sans le code y'en aura pas

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

Discussions similaires

  1. [VBA excel] Probleme sur bouton commande
    Par RedBurn dans le forum Macros et VBA Excel
    Réponses: 21
    Dernier message: 22/11/2005, 10h10
  2. [VBA] [Excel] Probleme de rafraichissement d'un label
    Par lejert dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/11/2005, 17h09
  3. [VBA-E] Probleme couleur macro
    Par Mugette dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 20/09/2005, 11h11
  4. [VBA-E] Probleme supression de la virgule
    Par Flyin_arno dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 26/07/2005, 15h22
  5. [VBA-E] problème avec le sendkeys
    Par darkpocket dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/02/2005, 14h25

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