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 de code [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien méthodes métrologie sur site
    Inscrit en
    Novembre 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien méthodes métrologie sur site
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2010
    Messages : 107
    Par défaut Optimisation de code
    Bonjour à tous,

    Je sais que c'est un sujet récurrent et qu'il y a déjà des tutos là-dessus, mais après avoir parcouru tout ça et testé plusieurs choses, ce n'est pas satisfaisant à mon goût.

    En résumé mon code gère 4 ComboBox différentes en les remplissants sans doublons. Certaines des ComboBox influent sur le contenus des autres.

    Bref, dans la ComboBox qui est amenée à contenir le plus d'entrées, le temps de chargement est trop long à mon goût (peut-être trop luxueux, à vous de me le dire). Ce chargement se fait à partir d'une liste de 900 lignes environ, mais avec pas mal de doublons. C'est surtout le tri des doublons qui prend du temps à mon avis.

    Auriez-vous s'il vous plait des idées d'optimisation ?
    Je vous joins 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
     
    'Pour info ident, type_etalon, et secteur sont des ComboBoxes
     
    Private Sub ident_GotFocus()
     
    If type_etalon.Value <> "" Or secteur.Value <> "" Then
     
    Else
        ThisWorkbook.ActiveSheet.Unprotect
        Range("zy:zz").NumberFormatLocal = "@"
        ident.Clear
        For i = 1 To ThisWorkbook.Worksheets("liste").Range("a3").End(xlDown).Row
            ThisWorkbook.ActiveSheet.Cells(i, 701) = ThisWorkbook.Worksheets("liste").Cells(i + 3, 2).Value
        Next i
        ThisWorkbook.ActiveSheet.Range("zy:zy").AdvancedFilter _
        Action:=2, CopyToRange:=Range("zz1"), Unique:=True
        For j = 1 To Range("zz1").End(xlDown).Row
            ident.AddItem ThisWorkbook.ActiveSheet.Cells(j, 702).Value
        Next j
        Range("zy:zz").Columns.Delete
        ThisWorkbook.ActiveSheet.Protect
     
    End If
     
    End Sub
    Merci d'avance pour vos suggestions.

  2. #2
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    Bonjour,

    Pour cette partie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 1 To ThisWorkbook.Worksheets("liste").Range("a3").End(xlDown).Row
            ThisWorkbook.ActiveSheet.Cells(i, 701) = ThisWorkbook.Worksheets("liste").Cells(i + 3, 2).Value
    Next i
    Il vaut mieux une affectation directe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Dim n As Long
        Dim TabTemp As Variant
     
        n = ThisWorkbook.Worksheets("liste").Range("a3").End(xlDown).Row
     
        'le passage par un tableau temporaire n'est pas obligatoire mais mieux pour la lisibilité
        With ThisWorkbook.Worksheets("liste")
            TabTemp=.Range(.Cells(4, 2), .Cells(n + 3, 2)).Value
        End With
     
        With ActiveSheet
            .Range(.Cells(1, 701), .Cells(n, 701)).Value = TabTemp
        End With
    Pour l'alimentation de la comboBox, même principe: plutôt que d'ajouter les éléments un par un, autant les ajouter d'un bloc. Ceci avec la propriété List.

    Ce qui donnerait pour cette partie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For j = 1 To Range("zz1").End(xlDown).Row
            ident.AddItem ThisWorkbook.ActiveSheet.Cells(j, 702).Value
    Next j
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Dim n As Long
        Dim TabTemp As Variant
     
        n = Range("zz1").End(xlDown).Row
        With ActiveSheet
            TabTemp = .Range(.Cells(1, 702), .Cells(n, 702)).Value
        End With
     
        ident.List = TabTemp
    Cordialement.

  3. #3
    Membre confirmé
    Homme Profil pro
    Technicien méthodes métrologie sur site
    Inscrit en
    Novembre 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Technicien méthodes métrologie sur site
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2010
    Messages : 107
    Par défaut
    Excellent !
    Je me doutais qu'il était possible de remplir la ComboBox d'un seul coup sans passer élément par élément, mais je n'ai pas trouvé sur les forums.
    Je teste ça et je te dis quoi !

    En tout cas merci pour ta réponse.

    Je confirme c'est excellent.

    La première solution me permet de passer de 3s de temps d'exécution à 0,2s.
    Je suis pleinement satisfait.
    J'essayerai désormais d'éviter de travailler élément par élément quand je le peux.

    Encore merci !

  4. #4
    Membre émérite Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Par défaut
    Tant mieux,

    Va faire un tour ici à l'occasion. 80% des problèmes d'optim sous Excel sont liés à des parcours de collections (cells, worksheets, etc.) qui sont assez lents. Les tableaux sont donc à privilégier quand c'est possible.

    Bonne journée.

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

Discussions similaires

  1. optimiser le code d'une fonction
    Par yanis97 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/07/2005, 08h41
  2. Optimiser mon code ASP/HTML
    Par ahage4x4 dans le forum ASP
    Réponses: 7
    Dernier message: 30/05/2005, 10h29
  3. optimiser le code
    Par bibi2607 dans le forum ASP
    Réponses: 3
    Dernier message: 03/02/2005, 14h30
  4. syntaxe et optimisation de codes
    Par elitol dans le forum Langage SQL
    Réponses: 18
    Dernier message: 12/08/2004, 11h54
  5. optimisation du code et var globales
    Par tigrou2405 dans le forum ASP
    Réponses: 2
    Dernier message: 23/01/2004, 10h59

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