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 :

Optimisation du temps d'exécution d'un code vba [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 2
    Par défaut Optimisation du temps d'exécution d'un code vba
    Bonjour à tous,

    Je viens de commencer à apprendre le langage VBA et j'éprouve quelques difficultés..
    Je dois créer un code qui utilise deux listes différentes et créé à partir de celles-ci une liste concaténée sans doublons.
    Petite précision : mes listes sont très longues (6000+ cellules)

    Je me suis débrouillée pour écrire une ébauche de code mais il met 40 min à s'exécuter, et le résultat qui s'affiche est faux, alors que lorsque je teste sur 200 valeurs tout va bien.

    J'ai lu dans d'autres post qu'il fallait passer par un tableau mais je n'arrive pas à écrire une procédure sans erreur..

    Pourriez-vous m'aider ?
    Merci d'avance !

    Voici mon code :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    Sub Fusion_sans_doublon()
     
        Dim J As Long                                                                                 'on définit l'incrément
        Dim L As Long                                                                                 'on définit l'incrément
        Dim DLigneA As Long
        Dim DLigneC As Long
        Dim DLigneE As Long
     
        DLigneA = Range("A1").End(xlDown).Row                                                         'dernière ligne de la colonne A (liste 1)
        DLigneC = Range("C1").End(xlDown).Row                                                         'dernière ligne de la colonne C (liste 2)
        DLigneE = Range("E1").End(xlDown).Row                                                         'dernière ligne de la colonne E (liste concaténée sans doublons)
     
        Workbooks("Mon_classeur").Worksheets("Ma_feuille").Range("E2:E18000").Select                  'on efface la colonne E
        Selection.ClearContents
     
        Workbooks("Mon_classeur").Worksheets("Ma_feuille").Range("C2:C18000").Select                  'on copie la colonne C dans la colonne E
        Selection.Copy
        Cells(2, 5).Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
     
        L = 2
     
        For J = 2 To DLigneA                                                                          'pour chaque ligne de la colonne A, on teste si la valeur est dans la colonne C
            DLigneE = Range("E1").End(xlDown).Row
            While Cells(J, 1) <> Cells(L, 3) And L <= DLigneC                                         'tant que la valeur testée ne se trouve pas dans la colonne
                L = L + 1                                                                             'on augmente l'incrément
            Wend                                                                                      'on est sorti de la boucle While: soit la valeur est dans la colonne C, soit on a cherché dans toute la liste C et elle n'y est pas
            If L = DLigneC + 1 And Cells(J, 1) <> Cells(DLigneC, 3) Then                              'si l'incrément L vaut le nombre de lignes de la colonne
                Cells(DLigneE + 1, 5) = Cells(J, 1)                                                   'on remplit la colonne E de la valeur
            End If
        Next J
     
    End Sub

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    Bonjour,

    Votre code (je ne suis pas rentré dans le détail) est bien pour des besoins d'apprentissage mais ..... je ne suis pas surpris qu'il soit fort long.... Je vous suggère:

    1. De ne pas oublier que vous travaillez sous Excel, donc que vous pouvez bénéficier des fonctions natives Excel (comme supprimer les doublons)
    2. Que vous avez, en une ligne, la possibilité d'utiliser un Range.RemoveDuplicate en VBA
    3. PLus difficile, en passant par des dictionnaires.

    Je vous suggère de regarder un peu la doc la dessus ... et attendez vous à un temps de traitement de quelques secondes au pire
    Bon courage

  3. #3
    Nouveau candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 2
    Par défaut
    Merci beaucoup ! J'ai utlisé un Range.RemoveDuplicate et ça marche très bien !

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

Discussions similaires

  1. [XL-2007] Optimisation du temps d'exécution d'un code vba
    Par chepa dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 12/06/2012, 09h39
  2. Optimisation de temps d'exécution d'un Code VBA
    Par Adilleroy dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 26/07/2010, 13h16
  3. [Fait]Temps d'exécution d'un code
    Par JeremieT dans le forum Contribuez
    Réponses: 2
    Dernier message: 30/08/2006, 06h20
  4. optimiser le temps d'exécution de l'explorateur windows
    Par ben_iap dans le forum Autres Logiciels
    Réponses: 6
    Dernier message: 31/01/2006, 22h04
  5. Réponses: 9
    Dernier message: 20/06/2005, 12h17

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