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 Sub

Merci é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

Résolu!

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 !

Rechercher des sujets similaires à "range tableau"