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] Amelioration dun code


Sujet :

Macros et VBA Excel

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

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut [VBA-E] Amelioration dun code
    Coucou,

    voilà j'ai une feuille excel avec dans une colonne un nom et dans l'autre, sur la meme ligne, une valeur.

    je dois faire la somme lorsque le nom est le meme.

    Exemple


    A 10
    B 12
    C 3
    B 9
    C 14


    je dois avoir dans ma feuille finale :

    A 10
    B 21
    C 17


    or un nom peut apparaitre à n'importe quelle ligne.

    pour le moment mon code regarde la premiere ligne de ma feuille source et si le nom n'est pas dans ma feuille cible alors il ajout une ligne (dans la feuille cible) avec ce nom et la valeur. Si le nom est deja present il ajoute la valeur à la valeur deja présente.

    Le probleme est que comme il y a environ 80 noms différents, lorqu'il prend un nom de la feuille source il peut faire jusque 80 comparaisons... comme j'ai plus de 40000 lignes.... ca prend du temps (4 minutes environ) et le souci est que j'ai à répéter ca une dizaine de fois (par semaine).

    Je voulais donc savoir s'il existait une autre methode plus rapide que la mienne

  2. #2
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut
    Pourquoi ne pas faire une formule ? je crois que le "NB.SI" fait ce que tu demande

    EDIT : ah nan ça te dit juste le nombre de cellules qui contiennent la meme valeur..mais tu dois pouvoir le concaténer avec une somme ou un truc comme ça..Vais chercher
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  3. #3
    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
    Points : 15 543
    Points
    15 543
    Par défaut
    Si le nom est deja present il ajoute la valeur à la valeur deja présente.
    C'est qui "il" ?
    Peux-tu nous montrer le code de tes boucles (car je pense que tu as deux boucles imbriquées...)

  4. #4
    Membre éclairé Avatar de laloune
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2005
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2005
    Messages : 484
    Points : 873
    Points
    873
    Par défaut
    je dois faire la somme lorsque le nom est le meme.
    illight a raison, même si je pencherais plutot pour un somme.si:

    somme.si(plage_qui_contient_les_critères;critère;plage_qui_contient_les_nombres_a_sommer)

    Bon dev...
    laloune
    laloune
    Consultant B.I.
    Spécialité(s): Excel, SQL, Business Intelligence (Jedox Palo, Talend)

    "A problem worthy of attack proves its worth by fighting back." Piet Hein

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

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    Ok illight mais mon probleme n'est pas d'avoir un resultat mais d'ameliorer le temps d'execution.

    Donc le NB.si peut convenir (j'irai verifier ) mais je ne sais pas si ca sera plus rapide.. enfin je testerai pour voir

    sinon voici mon code actuel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    For i = 2 To NombreLignes
        j = 3
            Do While Ceclasseur.Worksheets(Nomfeuille).Cells(j, NombreColonnes) <> ""
                'Si la sclass a deja été rencontrée
                If Source.Worksheets("data").Cells(i, 4) = Ceclasseur.Worksheets(Nomfeuille).Cells(j, NombreColonnes) Then
                    'on ajoute la valeur
                    Ceclasseur.Worksheets(Nomfeuille).Cells(j, NombreColonnes + 1) _
                    = Ceclasseur.Worksheets(Nomfeuille).Cells(j, NombreColonnes + 1) _
                    + Source.Worksheets("data").Cells(i, 5)
                    GoTo 1:
                Else
                    j = j + 1
                End If
            Loop
            'si on arrive ici c'est que le sclass n'a pas été trouvé
            Ceclasseur.Worksheets(Nomfeuille).Cells(j, NombreColonnes) = Source.Worksheets("data").Cells(i, 4)
            Ceclasseur.Worksheets(Nomfeuille).Cells(j, NombreColonnes + 1) = Source.Worksheets("data").Cells(i, 5)
    1:
        Next


    nombredeligne est le nombre de lignes qu'il y a à comparer dans la feuille source.

    nombrecolonnes est calculé juste pour savoir la place où vont etre copiées les valeurs (dans la feuille de Ceclasseur).

  6. #6
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut
    je confirme que le NB.SOMME marche très bien suffit que dans ta macro tu fasse une formule après tu la tire
    Dans ton autre feuille, tu peux mettre tous les noms, les trier puis supprimer les doublons, ensuite tu met ta formule et tu la tire (tout ça tu peux le faire en macro )

    Et je pense qu'une formule sera toujours plus rapide qu'une macro avec des boucles
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

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

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    Perso, d'apres mes souvenir des formules, j'utiliserai plutot une recherche verticale non?

    si il trouve pas j'ajoute le nom en dessous sinon j'ajoute la valeur au niveau de la ligne qu'il me trouvera. enfin je ne suis toujours pas convaincu que ce sois plus rapide je pense qu'il faudrai modifier mon code mais je sais pas trop comment j'ai deja lu que travailler avec des "array" rendait plus rapide mais bon jvois pas trop si jpeux m'en servir

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

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    mon code??

    il est au dessus ouvre les yeux

  9. #9
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut
    Ousk il l'a mis le code Elstak

    Pour la formule c'est ça..
    Donc d'abord ce que j'ai fait c'est que j'ai mis tes valeur de "nom" dans la feuille1 dans la première colonne, et les valeurs dans la 2e colonne, et ensuite dans la feuille 2 j'ai mis les 3 noms avec la formule donc adéquate en face donc voici la formule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SOMME.SI(Feuil1!$A$1:$B$5;A1;Feuil1!$B:$B)
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

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

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    jcomprend pas trop ton somme.si

    d'ailleur je trouve rien à propos de ca dans l'aide excel 2003 !!

    il faut savoir à l'avance les noms qu'il y aura? car moi je les ignore au debut... ca change d'une semaine à l'autre

  11. #11
    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
    Points : 15 543
    Points
    15 543
    Par défaut
    Ok pour le code, mon post a dû le croiser ou j'ai pas vu
    Elstak, pourquoi ne pas utiliser Find ? Inconvénient : si le nom peut se rencontrer plusieurs fois...
    Tu dis

    Mais l'idée de la formule, si ça correspond à ce que tu veux, est bonne. Une formule donne un résultat instantané si tu peux la placer dans ta feuille dans laquelle tu souhaite placer le résultat. Mais pour ce que j'ai compris, la donnée "résultante" doit se trouver à la place de la donnée cherchée... Et là, ça marche pas. Faudrait ajouter une colonne
    Tu dis

    somme.si est une formule Excel, ce n'est pas une fonction VBA. Tu as la réponse dans mon post précédent

  12. #12
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut
    C'est une fonction d'Excel, elle y est pas dans Excel 2003 ?

    Je te joins le fichier exemple que j'ai fait

    Par contre je part dans une demi heure, donc si jamais t'a un soucis et que je suis plus la , je ne pourrait te répondre que lundi, mais je pense que ouskel et les autres pourrons aussi t'aider
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

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

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    Ok pour le code, mon post a dû le croiser ou j'ai pas vu

    tututu pas d'excuse... jlai posté 7 minutes avant donc on s'est pas croisé

    Elstak, pourquoi ne pas utiliser Find ? Inconvénient : si le nom peut se rencontrer plusieurs fois...
    jamais utilisé le find mais là c'est sur le nom se rencontre plusieur fois ! donc c'est foutu pour ca...


    Mais pour ce que j'ai compris, la donnée "résultante" doit se trouver à la place de la donnée cherchée... Et là, ça marche pas. Faudrait ajouter une colonne
    Euh.. je saisi pas tout là...

    somme.si est une formule Excel
    Oui j'ai bien cherché dans l'aide excel mais il y a aucun resultat

    j'ai tapé somme.si et somme si .... rien

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

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    Ok merci illight !

    moi je pars dans 2min30

    mais pas de souci ca presse pas, le code fonctionne c'est juste pour gagner du temps

  15. #15
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 338
    Points : 4 295
    Points
    4 295
    Par défaut
    Citation Envoyé par Elstak

    j'ai tapé somme.si et somme si .... rien

    elle est dans la catégorie "maths et trigo"
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

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

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    jlai trouvée !!

    dans formules/formules courantes/formules mathematiques/additionner des nombre

    ca coule de source

    allez je regarde ca cet aprem salut !

  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
    Points : 15 543
    Points
    15 543
    Par défaut
    Pfff ! Sait même pas chercher dans l'aide
    Citation Envoyé par A Somme.si, l'aide Excel
    Additionne des cellules spécifiées si elles répondent à un critère donné.

    Syntaxe

    SOMME.SI(plage;critère;somme_plage)

    plage représente la plage de cellules sur lesquelles baser la fonction.
    critère représente le critère, sous forme de nombre, d'expression ou de texte, définissant les cellules à additionner. Par exemple, l'argument critère peut être exprimé sous une des formes suivantes : « 32 », « >32 », « pommes ».
    somme_plage représente les cellules à additionner. Les cellules comprises dans l'argument somme_plage sont additionnées si et seulement si les cellules correspondantes situées dans l'argument plage répondent au critère. Si l'argument somme_plage est omis, ce sont les cellules de l'argument plage qui sont additionnées.

    Exemple

    Supposons que la plage A1:A4 contienne la valeur immobilière de quatre maisons, soit respectivement, 100 000 F, 200 000 F, 300 000 F et 400 000 F. La plage B1:B4 contient les commissions sur ventes suivantes correspondant à ces valeurs immobilières : 7 000 F, 14 000 F, 21 000 F et 28 000 F.
    SOMME.SI(A1:A4;">160000";B1:B4) égale 63 000 F
    Mais pour ça, il faut aller dans Recherche, taper Somme.si et sélectionner Somme.si

  18. #18
    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
    Points : 15 543
    Points
    15 543
    Par défaut
    Bon, tu dis si ça te convient, sinon, on verra avec Find et FindNext. Faut bien que tu apprennes

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

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    oui j'ai bien lu l'aide.

    mais je ne connais pas les noms moi !

    il faudrai avant que je puisse trouver les différents noms...

    jveux bien voir find et findnext

    jvais deja chercher un peu pour voir ce que c'est....

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

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    Je pense avoir trouvé une piste

    avec un SORT, je trie la colonne des noms de ma feuille source mais apres... je sais pas trop encore faudrait que j'initialise le premier nom puis que je fasse un while (je ne suis pas à la derniere ligne de mon fichier source) si le nom est le meme alors j'ajoute le nombre a la colonne a coté (sur ma feuille destination), sinon je descennd d'une ligne (tjr sur la destination) et ainsi de suite..

    je sais pas si je suis clair mais c'est assez clair dans ma tete

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [VBA-E] ListBox et Codes postaux
    Par forsay1 dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 13/03/2006, 10h07
  2. [VBA-W] Arranger un code HTML
    Par FLCEOAP dans le forum VBA Word
    Réponses: 1
    Dernier message: 10/03/2006, 13h17
  3. [VBA-E]Combobox et code trop long!! (debutante)
    Par legend dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/03/2006, 14h23
  4. [VBA] Erreur dans un code. Hierarchie DAO.
    Par snoopy69 dans le forum VBA Access
    Réponses: 3
    Dernier message: 22/10/2005, 22h28

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