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 SubIci, 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 SubA 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 '=> VraiLe caractère # peut remplacer un caractère numérique de 0 à 9 :
maVariable = "Exemple 12345"
If maVariable Like "Exemple 12###" Then '=> VraiLe caractère ? peut remplacer un caractère quelconque :
maVariable = "Exemple 12345"
If maVariable Like "?xemple?1234?" Then '=> VraiPour 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 '=> VraiDans 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 !!