Suppression de ligne non effectuée malgré une condition remplie

Bonjour Programmeurs VBA,

Je travaille dans un fichier comportant une MACRO à plusieurs ramifications (ou plusieurs fonctions). J'en ai crée une nouvelle comme suit :

Sub Delete_IDM()
    NbRows = Sheets(1).UsedRange.Rows.Count

    For i = 2 To NbRows - 1 Step 1
        If Cells(i, 29).Value = "NE PAS METTRE" Then
            Rows(i).EntireRow.Delete
        End If
    Next
End Sub

Ici, je lui demande de supprimer toute ligne si et seulement si l'une de ces cellules contient la mention "NE PAS METTRE". J'ai donc crée cette partie du programme comme indiqué ci-avant. Mais cela ne marche pas. Il calcule bien le nombre de lignes d'une part, d'autre part il détermine bien le contenu de la cellule qui m'intéresse mais la suppression ne se fait pas. Mystère...

Merci de votre aide.

Bonjour,

Attention la ligne de code:

If Cells(i, 29).Value = "NE PAS METTRE"

ne signifie pas "contient", mais "la valeur de la cellule doit exactement être égale à NE PAS METTRE", et tout doit être en majuscule exactement comme dans la condition.

Egalement, quand on supprime des lignes on part généralement de la dernière ligne du fichier car chaque suppression de ligne va décaler toutes les lignes qui sont en dessous vers le haut ce qui pose des problèmes avec l'utilisation d'une boucle Next For.

Sub Delete_IDM()
    NbRows = Sheets(1).UsedRange.Rows.Count

    For i = NbRows - 1 to 2 Step -1 'on part de la dernière ligne avec step -1 pour aller du bas vers le haut du fichier
        If Cells(i, 29).Value Like "*NE PAS METTRE*" Then 'Like pour utiliser contient, puis ajout de * au début et fin de la chaîne recherchée pour dire "on peut avoir n'importe quoi avant et après"
            Rows(i).EntireRow.Delete
        End If
    Next
End Sub

A voir si ce code modifié fonctionne ou non.

Bonjour Ausecour,

Votre code fonctionne très bien. Le problème vient de la déclaration de la boucle FOR. Il fallait, comme vous le souleviez, inverser les bornes afin de commencer par le bas du tableau. Pour moi, je croyais que cela n'avait aucune importance mais non manifestement.

Par ailleurs, j'ai testé la comparaison entre les 2 opérateurs de de comparaison "=" signifiant "est égal à" et "Like" signifiant aussi "est égal à". Le résultat est le même. M'étant renseigné, "Like" est aussi un opérateur de comparaison, à la différence qu'il peut affiner la comparaison.

Ex:

Pour vérifier si la variable contient la valeur 12345 sans tenir compte des autres caractères, nous utiliserons l'opérateur Like ainsi que * devant et derrière la valeur à rechercher.

Le caractère * peut remplacer : aucun, un ou plusieurs caractères :

maVariable = "Exemple 12345"

If maVariable Like "*12345*" Then '=> Vrai

Le caractère # peut remplacer un caractère numérique de 0 à 9 :

maVariable = "Exemple 12345"

If maVariable Like "Exemple 12###" Then '=> Vrai

Le caractère ? peut remplacer un caractère quelconque :

maVariable = "Exemple 12345"

If maVariable Like "?xemple?1234?" Then '=> Vrai

Pour remplacer un caractère non compris dans les valeurs entre crochets, un ! doit être ajouté après [ :

maVariable = "Exemple 12345"

If maVariable Like "[!FAUX]xemple 1234[!6-9]" Then '=> Vrai

Dans https://www.excel-pratique.com/fr/vba/conditions_suite, on associe "Like"" plutôt à un travail de comparaison sur les chaînes de caractères bien que cela marche pour d'autres types de données comme les nombres réels.

Merci.

Bonjour,

Oui n'ayant pas pu tester le code moi même sur le fichier j'ai sorti des hypothèses.

En effet For Next quand on veut supprimer des lignes se fait plutôt du bas vers le haut, la raison c'est que si on est à la ligne 4, qu'on la supprime, la ligne 4 devient la ligne 5 qui a été décalée vers le haut, la boucle passe à i = 5 qui va passer en réalité à la ligne 6, et donc sauter la ligne 5.

dans l'autre sens on peut supprimer la ligne 4 puis passer à la ligne suivante qui sera toujours la 3 (pas de changement sur les lignes du haut quand on supprime).

Une alternative serait d'utiliser une boucle While Wend avec une variable représentant la ligne traitée, qu'on incrémente uniquement quand la ligne n'est pas supprimée pour passer à la suite, et par exemple vérifier que la colonne A contienne quelque chose pour continuer à traiter les lignes.

Je garde précieusement cet échange !!

Rechercher des sujets similaires à "suppression ligne effectuee condition remplie"