Suppression de lignes selon 1 critère X

Bonjour,

Je reviens vers vous pour un autre problème, sur une macro que je fais.

En clair, j'ai plusieurs fichier à traiter, ma macro, créée des onglets selon certains critères, met en forme mes tableau en ajoutant des données, supprime des lignes de dates inférieures à une Date donnée puis enregistré sur des serveurs et envoi un mail.

Pour l'ensemble de la macro, tout fonctionne parfaitement, le seul hic, cette macro doit aussi repérer en colonne N les cellules où se trouvent "X" pour supprimer ces lignes. Dans cette colonne, on retrouve divers données : I, D, N, X et des cellules vides.

J'ai essayé plusieurs code mais rien n'y fait, ça ne supprime pas correctement les lignes où se trouvent X en colonne N.

Sub VALEURS()

Set MaPlage = Sheets("Feuil1").Range("N2:N1000")

For Each Cel In MaPlage

If Cel.Value = "X" Then (J'ai essayé aussi avec Cel.Text)

ActiveCell.EntireRow.Delete

End If

End Sub

Ou

Sub VALEURS()

Dim i As Long

For i = Range("N1000").End(xlUp).Row To 1 Step -1

Sheets("Feuil1").Select

If Not UCase(Cells(i,1).Value) Like UCase("X") Then Rows(i).Delete

Next i

End Sub

J'ai essayé d'autres méthode aussi, trouvé sur ce forum ou d'autres, mais je sèche et je ne vois pas comment faire pour résoudre mon problème.

Qu'est ce que je fais mal? Ou ne comprends pas...

Merci d'avance pour vos aides et votre temps.

Bonjour,

Pour la première, c'est relativement simple ! Tu testes une cellule Cel et si le test est positif, tu supprimes (sauf éventuellement une fois par hasard) une autre ligne, celle de la cellule active ! Tu vas supprimer autant de lignes que de "X" mais...

Pour la seconde, un joyeux mélange !

Note déjà que i pouvait être de type Integer, 1000 est bien inférieur à 32767...

Dans la boucle tu sélectionnes Feuil1 à chaque tour de boucle ! Une fois était déjà de trop, mais alors là... On ne sélectionne pas, on qualifie ses expressions ! C'est plus sûr et plus rapide ! Tu aurais donc dû faire (efficacement pour cet aspect) :

With Sheets("Feuil1")
    (boucle)
End With

et à l'intérieur de cette instruction, faire précéder d'un point (pour les faire référer à la feuille) tes .Cells et .Rows

Ensuite je m'interroge parce que tu inverses ton test avec Not. Tu supprimes donc les lignes qui ne contiennent pas "X" ! Il faut savoir !

A noter aussi que UCase("X") n'a pas lieu d'être : "X" est déjà majuscule et ne changera pas. Et l'utilisation de l'opérateur Like est aussi superflue, une chaîne d'un seul caractère étant en cause.

Après rectifications, les 2 procédures devraient fonctionner. Mets tout de même un :

Application.ScreenUpdating = False

au démarrage de l'opération, pour la raccourcir un petit peu...

Cordialement.

Bonjour MFerrand,

Tout d'abord merci d'avoir pris le temps de répondre et de m'expliquer ces différents points.

Je suis désolé si mes codes sont chaotique, mais je travail sur les macros que depuis quelques semaines et c'est encore bien complexe pour moi... mes codes sont tirés de quelques forum et je me doute que je ne l'ai est pas adapté correctement...

Je vais me pencher sur vos explications, qui s'avère un peu complexe pour moi, mais avec vos informations et quelques recherches je devrais trouver et comprendre ce code.

Encore merci pour votre temps, dés que j'aurais compris et testé, je clôturerais ce thème.

Cordialement,

Bonjour à tous,

Pour MFerrand,

Bon, je suis aussi peut-être un peu long à la détente, mais j'ai un peu de mal à m'y retrouver...

J'ai déjà mis de côté le 1er code, au vue de l'aspect négatif de ce dernier sur mon fichier.

Pour le second, j'ai essayé de comprendre au mieux vos explications et modifié comme je le comprenais :

Sub VALEURS ()

Application.ScreenUpdating = False

Dim i As Integer

With Sheets("Feuil1")

For i = Range("N1000").End(xlUp).Row To 1 Step -1

If .Cells(i, 1).Value = "X" Then .Rows(i).Delete

Next i

End With

End Sub

Mais rien ne marche, et aucune erreur programme n'apparaît...

Si je peux bénéficier encore un peu de votre temps.

Encore merci,

Un novice

Bonjour,

Essaie ainsi :

Sub VALEURS()
Dim I As Integer

    Application.ScreenUpdating = False

    With Sheets("Feuil1")
        For I = .Range("N1000").End(xlUp).Row To 1 Step -1
            If .Cells(I, "N").Value = "X" Then .Rows(I).Delete
        Next I
    End With

End Sub

Bonjour Jean Éric,

Merci pour votre temps et votre réponse, et effectivement, en remplaçant la valeur 1 par "N" cela a l'air de bien fonctionner.

Merci encore et bonne journée,

Un novice soulagé!

Rechercher des sujets similaires à "suppression lignes critere"