Supprimer une ligne d'un fichier suivant 2 autres fichiers

Bonjour,

Voici le problème que j'aimerai résoudre :

Je dispose de trois fichiers : "Données" (celui que j'utilise pour faire différentes manip') + "Carnet" + "Livraisons".

J'aimerai que :

Si la ligneDonnées n'apparait ni dans ligneCarnet ni dans ligneLivraisons, alors on ajoute à la fin de la ligneDonnées : " à supprimer".

Voici le code que je pensais bon :

Sub CommandesSupprimées()

ScreenUpdating = False

'Déclaration des différents éléments
Dim wbCarnet As Workbook
Dim wsCarnet As Worksheet

Dim wbLivraisons As Workbook
Dim wsLivraisons As Worksheet

Dim wbDonnées As Workbook
Dim wsDonnées As Worksheet

Dim FinCarnet As Long
Dim FinLivraisons As Long
Dim FinDonnées As Long

'Récupération de nos deux fichiers : Carnet vide et Livraisons
nomFichier1 = Application.GetOpenFilename(Filefilter:="Fichiers XYZ (.xls)(.xlsm), *.xls*", Title:=" Sélectionnez le Carnet Vide", MultiSelect:=False)
If nomFichier1 = "Faux" Then
        Exit Sub
End If

nomFichier2 = Application.GetOpenFilename(Filefilter:="Fichiers XYZ (.xls)(.xlsm), *.xls*", Title:=" Sélectionnez les Livraisons ", MultiSelect:=False)
If nomFichier2 = "Faux" Then
        Exit Sub
End If

'Préparation à l'utilisation de nos trois fichiers
Set wbCarnet = Workbooks.Open(nomFichier1)
    Set wsCarnet = wbCarnet.Sheets(1)

Set wbLivraisons = Workbooks.Open(nomFichier2)
    Set wsLivraisons = wbLivraisons.Sheets(1)

Set wbDonnées = ThisWorkbook
    Set wsDonnées = wbDonnées.Sheets(1)

'Délimitation de la fin de nos trois fichiers en référence à une colonne toujours remplie
FinCarnet = wsCarnet.Range("I1000000").End(xlUp).Row
FinLivraisons = wsLivraisons.Range("C1000000").End(xlUp).Row
FinDonnées = wsDonnées.Range("J1000000").End(xlUp).Row

'Traitement'
'----------'

ligneD = 2
'Pour notre fichier "Données"
For ligneD = 2 To FinDonnées
    'Si on a un document de vente
    If wsDonnées.Cells(ligneD, 10).Value <> "" Then
        'Pour notre fichier "Carnet"
        For ligneC = 2 To FinCarnet
            'Si on a un document de vente
            If wsCarnet.Cells(ligneC, 9).Value <> "" Then
                'Pour notre fichier "Livraisons"
                For ligneL = 2 To FinLivraisons
                    'Si on a un document de vente
                    If wsLivraisons.Cells(ligneL, 3).Value <> "" Then
                    'Si le document de vente de "Données" ne correspond à aucun document de vente de "Carnet"
                    If wsDonnées.Cells(ligneD, 10).Value <> wsCarnet.Cells(ligneC, 9).Value And wsDonnées.Cells(ligneD, 10).Value <> wsLivraisons.Cells(ligneL, 3).Value Then
                    'On écrit dans la colonne 29 de notre fichier "Données" = Commande supprimée
                    wsDonnées.Cells(ligneD, 29).Value = "Commande Supprimée"

                    End If
                    End If

                Next ligneL

            End If

        Next ligneC

    End If

Next ligneD

ScreenUpdating = True

End Sub

Cependant la boucle sur la ligneD (de mon fichier Données) reste bloquée à 2 et la macro tourne pendant de longues minutes sans résultat. Je suis obligé d'arrêter manuellement cette dernière.

Si vous avez une idée de la provenance de ce petit soucis, je vous en serai très reconnaissant

jeremymacapuche

PS : pour comparer les différentes lignes des différents fichiers, je fais référence à une valeur unique qui est "numéro de commande" (par exemple pour "Données" : wsDonnées.Cells(ligneD, 10).Value .

Bonjour,

T'es-tu rendu compte que tu testes absolument chaque ligne ! Supposons que tu aies 1000 lignes par classeur, tu vas faire :

1000 * 1000 * 1000 = 1 000 000 000, soit un milliard de tests. Et sur chaque ligne du fichier Données : 1 million.

Tu devrais revoir ta méthode de recherche.

Cordialement.

Bonjour !

Merci de t'être intéressé à mon sujet

Tu penses que je ne devrai pas utiliser un système de boucles ?

Je pense que :

- la multiplication de variables redondantes est inutile : les variables objets classeurs et feuilles ne servent que peu dès lors qu'il s'agit d'atteindre des plages parfaitement définies, 2 variables plage subviennent donc largement aux besoins ; les variables bornes ne servent plus, sauf pour Données ; une variable compteur pour la boucle sur données ; une variable (type ?) pour recueillir la valeur cherchée et la chercher dans les 2 autres plages ; pour le cas où on recherche avec Find, 2 variables plage pour la recherche...

- le recours à getOpenFileName pour des fichiers supposés identifiés et dont le chemin doit être connu est superflu, on peut passer directement à l'ouverture ;

- boucle sur chaque ligne de données en affectant la valeur à chercher à une variable ;

- recherche de cette valeur dans les 2 plages concernées : méthode Find (ou utilisation de Match, mais Find paraît préférable, pas d'erreur à prévoir), si valeur des 2 variables de recherche = Nothing, on porte la mention prévue.

Et cela devrait se dérouler un peu plus rapidement.

Cordialement.

Rechercher des sujets similaires à "supprimer ligne fichier suivant fichiers"