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:
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 |