Range Vs tableau
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 ?
Si quelqu'un serait prêt à faire une vidéo-conférence sur Skype, je serais partant à 100%.
Mon problème se situe dans le module LT_et_FWD.
Les autres modules sont corrects. Je sais que mon code est très gros, j'ai tenté de commenter le plus possible.
Le code fait ce qu'il doit faire... mais serait-il possible d'utiliser un autre type de codage pour accélérer le tout ?
Voici le code en question:
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 SubMerci énormément!
Bonsoir
Un fichier allégé et anonymisé serait le bienvenu, afin de faire des tests
Car ce n'est pas évident au vu d'un code de se faire une idée
Ce que j'ai compris
Si le libellé d'une transaction existe dans les 2 pages, il faut que les sommes s'annulent
Bonsoir
Pas être facile, tu donnes un exemple et on trouve pas cet exemple sur les feuilles
Tu donnes de vrais exemples car sinon cela ne va pas être aisé à comprendre
Pour ma culture personnelle c'est koitesse "Lead time violé"
Le "Lead Time" ou "temps de réalisation" en français est le temps nécessaires à la réalisation d'une action. Dans notre contexte, il s'agira du temps nécessaire à la fabrication ou à l'achat d'un produit ou d'un service.
Et LT violé pour lorsque l'on ne respecte pas les temps nécessaire (Over ou sous-traitance par exemple)
C'Est Beau, j'ai réussis !!! Pis ayoye !!! Je viens de passer de 5 heures à 2 sec !!!
Malade !!! Je lache à tout jamais les range!! lol !!
BOnne soirée !