Supprimer lignes qui n'ont pas la bonne chaine de caractère

Bonjour,

Je souhaite supprimer des lignes dans un tableau si, dans une colonne que je parcours à l'aide d'une boucle for, je ne retrouve pas une certaine chaine de caractère.

Exemple : si dans la colonne H je ne retrouve pas la chaine "grand code" dans certaines des cellules, alors je supprime la ligne en question.

Pourriez vous m'aider svp, car toutes mes tentatives de codages ont échoué.

Merci par avance pour votre aide

Hello,

If Cells(i,8).Value like "*grand code*" Then Rows(i).Delete

En considérant que ta boucle est faite avec i et que ta colonne de vérification est H

Salut,

Un code tel que celui ci-dessous devrait faire l'affaire

Option Explicit
Sub dd()
Dim i As Integer
For i = Range("A" & Rows.Count).End(xlUp).Row To 2 Step -1
    If Range("E" & i) = "grand code" Then Rows(i).Delete
Next i
End Sub

Cordialement.

40razlor.zip (8.90 Ko)

Merci pour la réponse funky.

Par contre d'après ce que je comprends de ta ligne de code, j'ai l'impression qu'elle supprime les lignes ou l'on trouve la chaine de caractère "grand code" et non pas celles qui sont différentes. Est ce que je me trompe ?

Pour être bien sûr, le reste du code est bien de cette forme :

sub supprime()

Dim i As Integer

For i = 1 to "un certains nombre"

"ta ligne de code"

Next i

end sub

???

De plus sais tu si cela fonctionne si la chaine de caractère se trouve en majuscule ou minuscule ? Car dans mon fichier il y a des chaines avec le même texte que je recherche, mais certaines sont en majuscules et d'autres en minuscules.

Salut,

Sur la base de mon fichier, tu peux modifier cette ligne de la manière suivante et tu résouds tes deux problèmes à la fois

If LCase(Range("E" & i)) <> "grand code" Then Rows(i).Delete

Amicalement.

29razlor-v1.zip (9.53 Ko)

Le code d'Yvouille est celui qu'il faut utiliser si tu veux supprimer toutes les lignes des cellules ne contenant pas uniquement les caractères "grand code"

Si tu veux supprimer les lignes des cellules qui ne contiennent pas "grand code" dans la cellule il faut just l'adapter avec le like:

If Not Lcase(Cells(i,8).Value) like "*grand code*" Then Rows(i).Delete

Yvouille ton code ne fonctionne pas. Il me supprime des lignes certes, mais sans respecter la contrainte de garder les lignes ou la chaine de caractères "grand code" apparait dans la colonne "H".

De plus il y a 3 choses que je ne comprend pas dans ton code :

  • d'ou vient le Lcase que tu as incorporé dans ton If de correction, et pourquoi l'avoir mis puisque tu n'y fait référence nul par dans les lignes précédentes (code complet)?
  • de plus pourquoi mets tu cells ( i, 8) ? à quoi correspond ce 8 qui pour moi fait référence à une ligne plutôt qu'à une colonne
  • Dans ton code complet avec le for, tu mets Range ("A" & rows.count) et dans le if de la ligne suivante tu mets Range ("E" & i), pourquoi ce changement de colonne ?

Merci pour ta réponse

Salut Razlor,

Je crois qu’il y a une grande confusion sur ton fil car nous avons été deux à répondre.

Si Funkyfoenky est d’accord, je prends à ma charge de t’expliquer d’ici quelques longues minutes la différence entre nos deux approches ; celle de Funkyfoenky étant plus correcte (à une petite exception proche en faveur de la mienne).

A tout à l’heure.

Alors voici quelques mots d’explication :

Dans son exemple, Funkyfoenky a pris comme supposition que tes données à traiter étaient dans la colonne H alors que sur mon fichier je les avais placées dans la colonne E.

Si tu travailles avec la dénomination Range, la colonne est mentionnée avant la ligne - par exemple Range("H1") – alors qu’avec la dénomination Cells, c’est le contraire : Cells(1, 8 ) correspondant par exemple la cellule H1, H étant la huitième colonne.

Je n’avais pas vu personnellement que tu avais indiqué que tu cherchais une chaine précise de caractères à l’intérieur d’une autre chaine. Si Funkyfoenky n’était pas intervenu sur ton fil et que tu m’avais fait remarquer mon erreur, je t’aurais proposé une solution avec l’instruction ‘’WorksheetFunction.Search’’.

Ayant découvert la solution de Funkyfoenky à ce propos, je remarque que l’instruction ‘’LIKE’’ qu’il utilise est bien plus simple dans ce cas et je suis très content d’avoir encore appris quelque chose de plus

Ce qui plaide en ma faveur, c’est que l’instruction de Funkyfoenky mal utilisée – je veux dire dans une boucle à l’endroit – pourrait créer des problèmes alors que dans ma solution j’incluais une boucle à l’envers. Pour te démontrer ce que je veux dire, j’ai créé le fichier ci-joint avec deux feuilles différentes reliées à deux macros différentes incluant le meilleur de nos deux approches ; l’une fonctionne bien, l’autre pas.

Pour ta question concernant le LCase, je présume que la confusion vient à nouveau du mélange de nos deux solutions. Si ce n’est toujours pas clair pour toi, repose ta question en fonction du nouveau fichier ci-joint.

razlor a écrit :

-Dans ton code complet avec le for, tu mets Range ("A" & rows.count) et dans le if de la ligne suivante tu mets Range ("E" & i), pourquoi ce changement de colonne ?

Avec la première instruction, je recherche le nombre de lignes maximum et je pensais que la colonne A était la mieux, au cas où il pourrait y avoir des cellules vides dans la colonne E ; ceci étant bien entendu qu’une supposition puisque je n’ai pas ton fichier à disposition. Dans la deuxième instruction, c’est bien les données de la colonne E – dans cet ancien fichier – qui devaient être traitée.

Chaleureusement.

20razlor-v3.zip (9.52 Ko)

Yvouille merci pour ces explications et pour ton temps.

Cependant vos codes ne fonctionnent pas dans mon fichier, quand je lance vos modèles de macros j'obtient une "erreur 13" et le message "incompatibilité de type". Pourtant ton code yvouille marche en effet parfaitement dans le fichier que tu m'as envoyé.

Quand je vais dans le debuggueur, le problème réside dans les lignes du If.

j'ai lancé les macros avec les codes suivants :

Option Explicit

Sub sup_les_lignes()

Dim i As Integer

For i = Range("A" & Rows.Count).End(xlUp).Row To 2 Step -1

If (Range("H" & i)) <> "grand code" Then Rows(i).Delete

Next i

End Sub

et

Option Explicit

Sub sup_les_lignes()

Dim i As Integer

For i = 3000 To 1 Step -1

If Not LCase(Cells(i, 8).Value) Like "*grand code*" Then Rows(i).Delete

Next i

End Sub

Merci de me dire ce qui ne conviens pas dedans.

Si tu veux utiliser des codes quelconques sur un autre fichier et que ça ne fonctionne pas, tu dois nous le fournir afin que l’on puisse voir d’où vient réellement le problème, en cessant de tâtonner à l’aide de suppositions successives.

Remplace les données sensibles de ton fichier par des données-bidon et arrête de jouer à cache-cache

Si sur un fichier de 10'000 lignes, tu en laisses 20 représentatives, ça suffit amplement.

Amicalement.

EDIT : A tout Hasard, tu n'as quand même pas plus de 32.768 lignes ? Mais bon, dans un tel cas, c'est l'erreur 6 que tu devrais avoir !

Placée sur mon fichier, ta macro ci-dessous fonctionne bien ; le problème doit venir d'ailleurs.

Sub sup_les_lignes()
Dim i As Integer
 For i = Range("A" & Rows.Count).End(xlUp).Row To 2 Step -1
 If (Range("H" & i)) <> "grand code" Then Rows(i).Delete
 Next i
End Sub

bonjour Yvouille,

Je comprend, je t'envoie une version de mon tableau de données ou la structure a été conservée, mais ou j'ai changé des informations car je n'ai bien entendu pas le droit de divulguer les infos originelles contenues dedans.

Dans ce fichier je souhaite conserver uniquement les lignes ou on a la chaine de caractères "far mai" qu'elle que soit sa forme (avec ou sans majuscules).

J'espère que cela t'aidera.

Merci

Ah, on peut enfin voir la bête

J’ai modifié ton code en fonction de ton fichier et ça semble bien fonctionner.

La recherche de la dernière ligne à traiter se fait maintenant sur la colonne H, puisque tu peux avoir des vides sur la colonne A utilisée précédemment.

Comme ta première ligne à traiter depuis le haut est la 18 et non pas la 2, il a également fallu modifier cette donnée.

Tu as des lignes spéciales qu’il ne faut probablement pas effacer (la 26 par exemple). J’ai donc modifié le code de manière à ignorer les lignes dont la cellule H est vide.

Sinon seules les lignes comportant la chaine ‘far mai’ sont maintenant gardées.

Si chaque mois tu dois chercher d’autres textes, il serait éventuellement plus simple de placer ce texte à rechercher directement sur la feuille et faire référence à cette cellule dans la macro, plutôt que de devoir aller modifier chaque mois la macro.

A te relire.

Merci Yvouille tu me sauves la vie ^^, c'est exactement ce que je voulais.

Pour ce qui est de l'automatisation chaque mois, faut-il modifier ton code de cette manière en faisant référence à une cellule, ou y a t'il une subtilité supplémentaire à ajouter? :

Option Explicit

Sub sup_les_lignes()

Dim i As Integer

Application.ScreenUpdating = False

For i = Range("H" & Rows.Count).End(xlUp).Row To 18 Step -1

If LCase((Range("H" & i))) = "A1" And Range("H" & i) <> "" Then Rows(i).Delete

Next i

End Sub

En considérant la cellule A1 de manière arbitraire. Et en mettant dedans le texte recherché pour chaque mois.

Re,

As-tu tenté de tester ta tentative titanesque ?

Et pourquoi as-tu remplacé les signes <> par le signe = ????

Je pense que ce serait mieux :

If LCase((Range("H" & i))) <> Range("A1") And Range("H" & i) <> "" Then Rows(i).Delete

Le texte dans la cellule A1 devrait alors être écrit en minuscule, sinon, si tu veux pouvoir écrire ton texte qu’une manière quelconque également dans la cellule A1, tu peux utiliser le passage ci-dessous :

If LCase((Range("H" & i))) <> LCase(Range("A1")) And Range("H" & i) <> "" Then Rows(i).Delete

En annexe, un exeple avec un texte dans la cellule A10.

Chaleureusement.

Merci Yvouille c'est parfait. Le signe = à la place du <> est une simple erreur de ma part.

Un grand merci pour ton temps et toutes tes explications.

Rechercher des sujets similaires à "supprimer lignes qui ont pas bonne chaine caractere"