Bonjour à tous,
J'ai cru comprendre en fouillant dans certains forum, qu'il est beaucoup plus rapide de prendre une base de données dans une feuille Excel, et de la mettre en tableau. Cependant, je n'ai pas trop saisi le truc. (Le comment faire). Car pour le moment, j'ai un code qui prend plus de 5 heures à rouler. Je compare et fait des recherches de 150 000 lignes à 30 000 autres.

Mon code est très gros, et je n'ai pas réussi à le réduire. Mais l'utilisation des tableaux pourrait peut-être m'aider. Comment faire ?

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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
Sub LT_Viole()
 
Dim ligne_commande As Long
Dim ligne_viole, nb_somme As Long
Dim derniere_modif, prochaine_modif, ligne_transaction As Long
Dim nb_transaction As Long
Dim ligne_transaction_somme, i As Long
Dim Progression As Double
Dim somme, somme1 As Double
Dim trouver As Integer
Dim derniere_cellule As Long
Dim Article As Range
 
'Trouve la dernière cellule des Lead Times violés
derniere_cellule = Sheets("LT violé").Range("A1048576").End(xlUp).Row
 
'Compte le nombre de transactions
nb_transaction = Sheets("Transactions").Range("F1").CurrentRegion.Rows.Count
 
Progression = 0
ligne_transaction_somme = 3
ligne_viole = 3
derniere_modif = 3
prochaine_modif = 3
'Cherche pour toutes les transactions
 
'Parcours toutes les transactions d'une feuille
For ligne_transaction = prochaine_modif To nb_transaction
    somme = 0
    somme1 = 0
    nb_somme = 1
    trouver = 0
    ligne_transaction_somme = ligne_transaction
    Sheets("Transactions").Cells(ligne_transaction, 2) = "NON"
 
    'S'il n'y a pas d'article, le passe
   If IsEmpty(Sheets("Transactions").Cells(ligne_transaction, 6)) Then
        GoTo Prochaine_transaction
 
    End If
 
 
    'Si aucune correspondance est trouvée dans la feuille "LT violé", c'est que forcément il n'a pas de d'influence, alors on le passe
   Set Article = Sheets("LT violé").Range("C3:C" & derniere_cellule).Find(Sheets("Transactions").Cells(ligne_transaction, 6), , xlValues, xlPart)
    If Article Is Nothing Then
        GoTo Prochaine_transaction
    End If
 
 
 
        'Calcule la première ligne
       'Val est utilisé, car il peut arriver qu'il y a une lettre (Erreur de la part des employés)
       somme = somme + Val(Sheets("Transactions").Cells(ligne_transaction_somme, 10))
 
    'Permet de compter la somme des transactions d'une même pièce, d'une même journée.
   'Il est important de déterminer si le total est positif ou négatif.
   Do
 
        'Cherche un article correspondant
       'Regarde si c'est la même date
       'Si c'est pas la même date, sort du Do.
       If Sheets("Transactions").Cells(ligne_transaction_somme, 6) = Sheets("Transactions").Cells(ligne_transaction_somme + 1, 6) And _
        Sheets("Transactions").Cells(ligne_transaction_somme, 9) = Sheets("Transactions").Cells(ligne_transaction_somme + 1, 9) Then
            somme = somme + Val(Sheets("Transactions").Cells(ligne_transaction_somme + 1, 10))
 
        Else
            prochaine_modif = ligne_transaction_somme + 1
            Exit Do
 
        End If
 
        'Nb__Somme permet de trouver le nombre d'articles identiques de la même journée
       nb_somme = nb_somme + 1
        ligne_transaction_somme = ligne_transaction_somme + 1
 
    '10000000000 est un chiffre arbitraire, car on se servira jamais de cette ligne de commande
   Loop Until ligne_transaction_somme = 10000000000#
 
 
    'Si la somme est <0, c'est qu'il y a des lignes qui ont probablement causées un requis au système.
   If somme < 0 Then
 
        'Parcours toutes les transactions de la sommation (Précédent Do)
       Do
            'Parcours toutes les lignes de la feuille "LT violé" afin de trouver une correspondance
           Do
                'Si le # de l'article de la transation est inférieure à celui-ci vérifié, on passe à la prochaine transaction.
               If Sheets("Transactions").Cells(ligne_transaction, 6) < Sheets("LT violé").Cells(ligne_viole, 3) Then
                    GoTo Next_transaction
                End If
 
 
                'Cherche un article correspondant
               'Vérifie si c'est une quantité négative
               'Regarde si la date de commande est < à la Date saisie
               'Regarde si la date saisie est inférieure à la date de livraison
               If Sheets("Transactions").Cells(ligne_transaction, 6) = Sheets("LT violé").Cells(ligne_viole, 3) And _
                Sheets("Transactions").Cells(ligne_transaction, 10) < 0 And _
                Sheets("LT violé").Cells(ligne_viole, 10) < Sheets("Transactions").Cells(ligne_transaction, 9) And _
                Sheets("Transactions").Cells(ligne_transaction, 9) < Sheets("LT violé").Cells(ligne_viole, 12) Then
 
 
                    'Actualise la somme. Si celle-ci est toujours négative, il y a d'autres transactions qui ont causées un LT violé.
                   somme1 = somme1 + Val(Sheets("Transactions").Cells(ligne_transaction, 10))
 
                    If somme1 > 0 And nb_somme > 0 Then
                        GoTo Next_transaction
                    End If
 
 
                    If somme1 = 0 Then
                        GoTo Next_transaction
 
                    End If
 
                    'Inscrit qu'il y a eu un LT violé à cause de cette transaction
                   'Inscrit le résultat à savoir si la commande a été livrée à temps ou non.
                   Sheets("Transactions").Cells(ligne_transaction, 2) = "OUI"
                    Sheets("Transactions").Cells(ligne_transaction, 3) = Sheets("LT violé").Cells(ligne_viole, 7)
                    Sheets("Transactions").Cells(ligne_transaction, 4) = Sheets("LT violé").Cells(ligne_viole, 8)
 
                    derniere_modif = ligne_viole
 
                    'Permet de savoir si on a trouvé une correspondance exacte (Un LT violé)
                   trouver = 1
 
 
                End If
 
 
            ligne_viole = ligne_viole + 1
 
            'Si on a trouvé quelque chose
           If trouver = 1 Then
                GoTo Next_transaction
            End If
 
            Loop Until ligne_viole = derniere_cellule
 
Next_transaction:
        nb_somme = nb_somme - 1
 
        'Vérifie si c'est une quantité positive
       If Sheets("Transactions").Cells(ligne_transaction, 10) > 0 Then
            somme1 = somme1 + Val(Sheets("Transactions").Cells(ligne_transaction, 10))
        End If
 
        'S'assure qu'on a vérifé toutes les transactions
       If nb_somme > 0 And trouver = 0 Then
            Sheets("Transactions").Cells(ligne_transaction, 2) = "NON"
            ligne_transaction = ligne_transaction + 1
 
        ElseIf nb_somme > 0 And trouver = 1 Then
            ligne_transaction = ligne_transaction + 1
            trouver = 0
 
        ElseIf nb_somme = 0 And trouver = 0 Then
            Sheets("Transactions").Cells(ligne_transaction, 2) = "NON"
 
        End If
 
        'Si la ligne_viole active est supérieure à 10, on recule de 10 pour être sur d'inclure toutes les données
       If ligne_viole > 10 And derniere_modif < 10 Then
            ligne_viole = ligne_viole - 10
        ElseIf derniere_modif > 10 Then
            ligne_viole = derniere_modif - 10
        Else
            ligne_viole = derniere_modif
        End If
 
        Loop Until nb_somme = 0
 
 
 
'Si la somme >= 0, c'est que les transactions s'annulent
   Else
 
'Valide s'il a trouvé un LT violé ou non
Validation:
        If trouver = 0 Then
 
            'Met "NON" à toutes les lignes de la somme si il n'a rien trouvé
           For i = ligne_transaction To ligne_transaction_somme
                ligne_viole = derniere_modif
                'Inscrit "NON" si aucune transaction n'a occasionnée de LT violé
               Sheets("Transactions").Cells(i, 2) = "NON"
            Next i
 
            ligne_transaction = ligne_transaction_somme
 
        Else
 
            'Si la ligne_viole active est supérieure à 10, on recule de 10 pour être sur d'inclure toutes les données
           If ligne_viole > 10 And derniere_modif < 10 Then
                ligne_viole = ligne_viole - 10
            ElseIf derniere_modif > 10 Then
                ligne_viole = derniere_modif - 10
            Else
                ligne_viole = derniere_modif
            End If
 
        End If
 
    End If
 
Prochaine_transaction:
'Actualise la barre de progression
Progression_actualiser (Int((ligne_transaction / nb_transaction) * 100))
 
 
 
Next ligne_transaction
 
 
End Sub
 
'Actualise la barre de progression
Sub Progression_actualiser(ByRef Progression As Integer)
'Sub Progression_form()
Progression_form.Height = 108
'Call Progression_form.Show
 
'Progression = Progression + 1
Progression_form.Image_barre_2.Width = Progression * 1.5
Progression_form.Label_barre_2.Caption = Progression & "%"
DoEvents
 
 
End Sub

Merci infiniment à celui ou celle qui m'aidera!