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 temps d'exécution trop lent


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2013
    Messages : 5
    Par défaut VBA temps d'exécution trop lent
    Bonjour,
    Je suis confronté à un problème que je n’arrive pas à résoudre.

    Contexte :

    J’ai une feuille Excel nommé BD qui contient des caractéristiques sur des outils, ces outils possèdent une catégorie, sous-catégorie, un numéro unique, un site de vente et d’autres caractéristiques.
    J’ai défini une plage de données qui va me permettre d’effectuer des recherches à l’aide de Combobox.
    Chaque Combobox effectue un tri sur une colonne de la plage de données, le résultat s’affiche dans une listbox.

    Mon problème c’est que le code prend beaucoup de temps lorsque j’ai trop de ligne à traiter (10000 lignes), donc j’aimerais savoir si quelqu’un à une idée pour réduire le tempsd’execution.

    Voilà, merci d'avance pour vos réponses.

    Ci-dessous le code utilisé.

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    Private Sub UserForm_Initialize()
     
    Me!Label47 = Format(Now, "dd/mm/yyyy")
    Me.Width = ScreenWidth * PointsPerPixel
    Me.Height = ScreenHeight * PointsPerPixel
     
    noCol = 1: ListeCol 1
    noCol = 2: ListeCol 2
    noCol = 3: ListeCol 3
    noCol = 4: ListeCol 4
    noCol = 5: ListeCol 5
     
    On Error Resume Next
     
    ListBox1.Clear
    UserForm5.Repaint
     
    End Sub
     
    Private Sub ComboBox1_DropButtonClick()
    noCol = 1: ListeCol 1
    End Sub
     
    Private Sub ComboBox2_DropButtonClick()
    noCol = 2: ListeCol 2
    End Sub
     
    Private Sub ComboBox3_DropButtonClick()
    noCol = 3: ListeCol 3
    End Sub
     
    Private Sub ComboBox4_DropButtonClick()
    noCol = 4: ListeCol 4
    End Sub
     
    Private Sub ComboBox5_DropButtonClick()
    noCol = 5: ListeCol 5
    End Sub
     
    Sub ListeCol(noCol)
     
    Set MonDico = CreateObject("Scripting.Dictionary")
     
    For i = 1 To [bd].Rows.Count
     
    ok = True
    For n = 1 To [bd].Columns.Count
     
      If n <> noCol Then
     
        If Not Range("bd").Cells(i, n) Like Me("comboBox" & n) Then ok = False
     
      End If
     
    Next n
     
    If ok Then
     
       tmp = Range("BD").Cells(i, noCol)
       MonDico(tmp) = tmp
     
    End If
    Next i
     
    MonDico.Add "", ""
    temp = MonDico.items
     
    Call Tri(temp, LBound(temp), UBound(temp))
     
    Me("ComboBox" & noCol).List = temp
     
    End Sub
    Sub Tri(a, gauc, droi) ' Quick sort
     
    ref = CStr(a((gauc + droi) \ 2))
    g = gauc: d = droi
     
    Do
     
    Do While CStr(a(g)) < ref: g = g + 1: Loop
    Do While ref < CStr(a(d)): d = d - 1: Loop
     
      If g <= d Then
     
        temp = a(g): a(g) = a(d): a(d) = temp
        g = g + 1: d = d - 1
     
      End If
     
    Loop While g <= d
     
    If g < droi Then Call Tri(a, g, droi)
    If gauc < d Then Call Tri(a, gauc, d)
    End Sub
     
    Private Sub ComboBox1_Change()
    filtre ' filtre par sous categorie
    End Sub
    Private Sub ComboBox2_Change()
    filtre
    End Sub
    Private Sub ComboBox3_Change()
    filtre
    End Sub
    Private Sub ComboBox4_Change()
    filtre
    End Sub
    Private Sub ComboBox5_Change()
    filtre
    End Sub
     
    Sub filtre()
     
    ligne = 0
    Me.ListBox1.Clear
     
    For i = 1 To [bd].Rows.Count
     
     ok = True
     
     For n = 1 To [bd].Columns.Count
     
         If Not Range("bd").Cells(i, n) Like Me("comboBox" & n) Then ok = False
     
     Next n
     
     If ok Then
     
       Me.ListBox1.AddItem
     
       For k = 1 To [bd].Columns.Count
     
         Me.ListBox1.List(ligne, k - 1) = Range("bd").Cells(i, k)
     
       Next k
     
       ligne = ligne + 1
     
      End If
    Next i
     
    On Error Resume Next
     
    End Sub

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    J'ai juste survolé ton code mais essaie de travailler avec une variable array au lieu de travailler avec les cellules :

    Le gain de temps est généralement spectaculaire.

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Bonsoir,

    Chaque Combobox effectue un tri sur une colonne de la plage de données, le résultat s’affiche dans une listbox.
    Juste pour ne pas re-coder ce qui existe déja, est-ce que les filtres automatiques d'Excel ne répondraient pas à ce besoin.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2013
    Messages : 5
    Par défaut
    Bonjour BlueMonkey
    les filtres automatiques d'excel ne permettent pas de répondre à mon besoin qui est de permettre une recherche selon plusieurs critères

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Les filtres automatiques permettent de cumuler des filtres entre les colonnes.
    Sinon il reste toujours les filtres élaborés.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2013
    Messages : 5
    Par défaut
    Merci à vous de vos réponses
    Daniel.C je vais voir pour travailler avec une variable

Discussions similaires

  1. Retour d'expérience : Temps d'exécution trop lent
    Par othmane126 dans le forum Développement de jobs
    Réponses: 12
    Dernier message: 23/02/2015, 09h47
  2. Temps d'exécution très lent
    Par michelin123 dans le forum MATLAB
    Réponses: 14
    Dernier message: 20/11/2007, 15h17
  3. Exécution trop lente du code
    Par DOM DOM dans le forum IHM
    Réponses: 0
    Dernier message: 01/09/2007, 08h17
  4. Exécution trop lente du code
    Par DOM DOM dans le forum VBA Access
    Réponses: 0
    Dernier message: 20/08/2007, 11h15
  5. [VBA-E]temps d execution trop lent
    Par chmod777 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 08/03/2006, 15h10

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