Supprimer des références si elles ne sont pas dans le tableau

Bonjour à tous,

Je me permets de vous contacter car je suis débutante en VBA et je cherche à supprimer toutes les lignes du tableau de la feuille "extraction TAT" qui contiennent un "Part Number" qui n'est pas présent dans la liste de capacités (colonne D feuille "Liste de capacités").

Vous remerciant par avance de vos réponses, je vous souhaite une bonne journée!

15tat.xlsm (65.82 Ko)

Un essai.

11tat.xlsm (64.58 Ko)

Bonjour,

Je suis désolée mais je ne comprend pas du tout le code... :/

Car enfait mes deux tableaux comptent beaucoup plus de lignes et de colonnes que dans le fichier joint à ma question. J'aurais donc besoin de comprendre la logique dans les lignes :

nL = ws1.Cells(Rows.Count, 4).End(xlUp).Row

ReDim tablo(nL - 7)

tablo(i - 7) = ws1.Cells(i, 4)

Je vous remercie pour votre aide!

Il n'est pas si compliqué, alors je t'explique.

Sub Macro1()
1    Dim nL As Integer, tablo() As String
2    Dim ws1 As Worksheet, ws2 As Worksheet
3    Dim i As Integer, j As Integer, refExists As Boolean
4
5    Set ws1 = Sheets("Liste de capacités")
6    Set ws2 = Sheets("Extraction TAT")
7
8    nL = ws1.Cells(Rows.Count, 4).End(xlUp).Row
9    ReDim tablo(nL - 7)
10
11   For i = 8 To nL
12        tablo(i - 7) = ws1.Cells(i, 4)
13    Next i
14
15    ' Scan
16    nL = ws2.Cells(Rows.Count, 4).End(xlUp).Row
17
18    For i = nL To 2 Step -1
19        refExists = False
20        For j = 1 To UBound(tablo)
21            If tablo(j) = ws2.Cells(i, 4) Then
22                refExists = True
23                Exit For
24            End If
25        Next j
26        If Not refExists Then
27            Rows(i & ":" & i).Select
28            Selection.Delete Shift:=xlUp
29        End If
30    Next i
End Sub

Option Explicit : on force la déclaration de toutes les variables ; c'est une habitude à prendre (paramétrage de l'éditeur) dès le début.

1 à 3 Déclaration des variables : nL permet de connaître la dernière cellule utilisée d'une colonne. tablo() est un tableau qui contiendra les Part Numbers de la feuille "Liste de capacités". ws1 et ws2 permettent de condenser le code : ws1 = 3 caractères alors que Sheets("Liste de capacités") en contient 28.
Enfin refExists est une variabble booléenne qui peut prendre la valeur "True" (toute valeur autre que 0) ou "False" (= 0).

5 à 6 affectation des noms de feuille aux variables ws1 et ws2 qui sont du type Worksheet.

8 - On affecte à la variable nL le n° de la dernière ligne de la colonne 4 de la feuille "Liste de capacités" ayant un contenu. C'est dans cette colonne que se trouvent les Part Numbers, mais on aurait pu aussi bien prendre la colonne 1, 2 ou 3.

9 - On dimensionne le tableau en fonction du nombre de Part Numbers, soit nL - 7 puisque les valeurs commencent à la ligne 8.

11 à 13 - on remplit le tableau avec les différents Part Numbers

16 - On affecte à la variable nL le n° de la dernière ligne de la colonne 4 de la feuille "Extraction TAT" ayant un contenu. C'est dans cette colonne que se trouvent les Part Numbers, mais on aurait pu aussi bien prendre la colonne 1, 2, 3 ou 5.

18 - Boucle d'élimination des lignes comportant un Part Number ne figurant pas dans le tableau tablo(). On scanne la feuille "Extraction TAT" de la dernière ligne occupée (nL) à la 2 en remontant ligne à ligne (d'où le step -1).

20 à 25 - On prend la 1ère valeur ("RA2M330" en ligne 700) et on la recherche dans le tableau. Si on la trouve, on met le flag refExists à "True" et on quitte la 2e boucle.

26 à 28 - Si on arrive à la fin de la 2e boucle sans avoir trouvé cette valeur dans le tableau, le flag refExists est toujours à "False" (Part Number inconnu), donc on supprime la ligne.

30 - et on remonte ainsi les lignes une à une jusqu'à la 2e.

Merci pour votre réponse! J'ai compris le code. Cependant, ma base de données contient 90 000 lignes et je tombe donc sur l'erreur suivante :

Erreur d'exécution "6" : Dépassement de capacité

Cela veut-il dire que le worksheet contient trop de lignes?

Non, 90000 ce n'est pas beaucoup. Remplacez les 4 variables Integer par des Long dans la déclaration.

PS : mettez la version d'Excel que vous utilisez dans votre profil.

J'ai remplacé les variables Integer par des Long. Je n'ai plus le message d'erreur mais le calcul est très long, si bien que je dois forcer à quitter Excel au bout d'un moment...

Est-ce que cette purge est à faire une seule fois ou bien devra être faite régulièrement ?

La question de fond est de savoir pourquoi il y a des enregistrements contenant des Part Numbers ne figurant pas dans votre liste des capacités. Pour 745 références, il y a en gros 33.000.000 de tests à effectuer. Ca ne peut être que long.

Cette purge est à faire une fois tous les 2/3 mois donc ce n'est effectivement pas si grave si le calcul est long.

Je vous remercie grandement pour votre précieuse aide!

Il y a probablement mieux à faire, mais en amont. Bonne continuation.

Rechercher des sujets similaires à "supprimer references pas tableau"