Traitement valeur cellule selon plage de données

Bonjour,

J'ai une liste de de données en dans la plage A4:A de ma feuille "Table" que j'ai mis sous variable "PlgImmat".

Je scrute toutes les feuilles qui commencent par "DEP" et je vérifie si leurs cellules contiennent les valeurs définies dans ma variable "PlgImmat".

Si c'est le cas je conserve, sinon je supprime la ligne. J'aimerais ne pas supprimer la ligne qui contient la valeur "NOM" sans pour autant ajouter ce terme dans ma plage de données "PlgImmat". Comment procéder ?

Voici mon code:

Sub Filtre_DEP()

    Dim PlgImmat As Range
    Dim PlgRecherche As Range
    Dim CelImmat As Range
    Dim I As Long

    'défini la plage en colonne A de la feuille "Table" à partir de A4
    '(Sur ma feuille Table, j'ai plusieurs lignes d'infos en colonne A.)
    With Worksheets("Table"): Set PlgImmat = .Range(.Cells(4, 1), .Cells(.Rows.Count, 1).End(xlUp)): End With

    'défini la plage en colonne A des feilles qui commencent par DEP en à partir de A1
    '(Sur ma feuille DEP, j'ai des milliers de lignes dont des données qui correspondent à celles de la plage PlgImmat)
    For n = 1 To Sheets.Count
   If Left(Sheets(n).Name, 3) = "DEP" Then

    With Worksheets(n): Set PlgRecherche = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp)): End With

    'pour la suppression, commencer par le bas de la plage
    For I = PlgRecherche.Count To 1 Step -1

        'effectue la recherche exacte...
        Set CelImmat = PlgImmat.Find(PlgRecherche(I, 1).Value, , xlValues, xlWhole)

        'si pas trouvée, suppression
        If CelImmat Is Nothing Then PlgRecherche(I, 1).EntireRow.Delete

    Next I
    End If
    Next n

End Sub

C'est sur cette ligne qu'il faudrait ajouter la valeur "MOT" mais à quel endroit ?:

 'effectue la recherche exacte...
        Set CelImmat = PlgImmat.Find(PlgRecherche(I, 1).Value, , xlValues, xlWhole)

Merci à vous tous

JB

Bonjour JeanBaptisteP,

Il faut une double condition pour traiter cela.

La première condition c'est ta plage Immat

Set CelImmat = PlgImmat.Find(PlgRecherche(I, 1).Value, , xlValues, xlWhole)

La deuxième condition sera ton mot particulier.

Set CelIPart = PlgRecherche(I,1).Find("NOM" , ,xlValues, xlWhole)

Donc ensuite

If CelImmat Is Nothing and CellPart is Nothing Then PlgRecherche(I, 1).EntireRow.Delete

Bonjour XCellus,

Merci pour votre retour, j'ai essayé votre code mais cela ne fonctionne pas. Je pote un fichier en exemple.

Je n'arrive pas à conserver la cellule qui contient la valeur "NOM" même si elle n'est pas présente dans la feuille "Table"

Merci beaucoup en tout cas

JB

8classeur-jb.xlsm (25.57 Ko)

A nouveau,

Correction selon fichier joint. Modifier selon ci-dessous.

'effectue la recherche exacte...
        Set CelImmat = PlgImmat.Find(PlgRecherche(I, 1).Value, , xlValues, xlWhole)
        If CelImmat Is Nothing And Range("A" & I) <> "NOM" Then PlgRecherche(I, 1).EntireRow.Delete

A nouveau,

J'ai refait une bonne partie de ta macro Filtre_DP afin qu'elle soit appliquée sur chacune des feuilles concernées.

Sub Filtre_DEP()

    Dim PlgImmat As Range
    Dim PlgRecherche As Range
    Dim CelImmat As Range
    Dim CellPart As Range
    Dim I, Z As Long

    'défini la plage en colonne A de la feuille "Table" à partir de A4
    '(Sur ma feuille Table, j'ai plusieurs lignes d'infos en colonne A.)
With Worksheets("Table"): Set PlgImmat = .Range(.Cells(4, 1), .Cells(.Rows.Count, 1).End(xlUp)): End With
Application.ScreenUpdating = False
    'défini la plage en colonne A des feilles qui commencent par DEP en à partir de A1
    '(Sur ma feuille DEP, j'ai des milliers de lignes dont des données qui correspondent à celles de la plage PlgImmat)
For N = 1 To Sheets.Count
If Left(Sheets(N).Name, 3) = "DEP" Then

Worksheets(N).Select
    Set PlgRecherche = Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp))
    Z = PlgRecherche.Count
    'Marqueur de fin, il sera supprimé lors du traitement final
    Range("A" & Z + 1) = "Fin": Range("B" & Z + 1) = ""
    'Ici c'est la colonne B mais choisir une colonne sans données
    Range("B1:B" & Z).ClearContents
    'pour le marquage ou non, commencer par le bas de la plage
    For I = PlgRecherche.Count To 1 Step -1
        'effectue la recherche exacte...
        Set CelImmat = PlgImmat.Find(PlgRecherche(I, 1).Value, , xlValues, xlWhole)
        If Range("A" & I) = "NOM" Then Range("B" & I) = "x": GoTo Suite
        If Not CelImmat Is Nothing Then Range("B" & I) = "x"
Suite:
    Next I
'Sélection des lignes à supprimer puis leur effacement
    Range("B1:B" & Z + 1).Cells.SpecialCells(xlCellTypeBlanks).Select
    Selection.EntireRow.Delete
Fin:
    'Ici c'est la colonne B mais choisir une colonne sans données
    Range("B1:B" & Z + 1).ClearContents
    Range("A1").Select
    Set PlgRecherche = Nothing
End If
Next N
Application.ScreenUpdating = True
End Sub

Il n'y a pas de suppression (lors de la boucle) ligne par ligne, mais un marquage des lignes à conserver (correspondantes aux critères).

Puis au final les lignes non marquées sont effacées.

Cela apporte plus de sûreté.

Bonsoir XCellus,

Merci pour ce retour. J'avais utilisé votre 1ère proposition en ajoutant Worksheet(n) devant Range sur la ligne suivante:

 If CelImmat Is Nothing And Range("A" & I) <> "NOM" Then PlgRecherche(I, 1).EntireRow.Delete

Tout fonctionne mais je vais quand même tester votre 2ème proposition, pour plus de sûreté comme vous dites.

J'en profite pour vous poser une autre question. Si vous préférez que j'ouvre un nouveau post pas de souci :)

A partir d'un bouton j'ouvre une boite de dialogue qui va me permettre de connaitre le chemin du fichier que j'ai sélectionné.

J'aurais aimé filtrer tous les fichiers .txt et uniquement ceux qui commencent par "Loc", ce qui pourrait donner dans le code

Sub BDD()
    With Application.FileDialog(msoFileDialogOpen)
        .Title = "Sélectionnez le fichier texte."
        With .Filters
        .Clear
        .Add "Fichiers Loc", "Loc*.txt", 1
        End With
        .AllowMultiSelect = False
        .ButtonName = "Sélectionner"
        If .Show = -1 Then
            'récuperation du chemin complet et extraction du nom avec son extention
            chemin = .SelectedItems(1)    'recupere le chemin complet
            MsgBox chemin

        End If
    End With
End Sub
jb

Auriez-vous une piste svp?

Bonne soirée et merci encore !

JB

A nouveau,

Pour cela il faut que le dossier comporte des fichiers avec extension txt. Et qu'ils débutent par Loc.

Mais dans ton code seule, l'extension est précisée. Par le textbox de droite. Il faut que le textbox de gauche est le terme Loc*

Or à gauche c'est vide,.

Suite,

Rajouter après la ligne. Add

Le chemin du fichier comme cela

. Initial Filename = "C:\Users\Untel\dossier\Loc*"

En changeant Untel et dossier par les bonnes références.

Bonsoir XCellus,

Ok je vais essayer cela, merci pour l'info !

Bonne soirée

JB

Rechercher des sujets similaires à "traitement valeur plage donnees"