Macro supprime ligne selon la valeur d'une cellule
Résolu
Harry Baux
Messages postés
18
Statut
Membre
-
Harry Baux Messages postés 18 Statut Membre -
Harry Baux Messages postés 18 Statut Membre -
Bonjour à tous,
J'ai cette macro VBA qui me permet de supprimer des ligne si une cellule contient une certaine valeur.
Cependant, lorsque j'essaie de modifier le = par <> afin que la macro ne me supprime plus la ligne qui contient la valeur, mais supprime les lignes qui ne contiennent pas cette valeur elle me supprime toutes les lignes du tableau
exemple
Egalement si j'utilise les signe > et < la macro ne fonctionne pas
exemple
J'ai remplacé le = par like et cela fonctionne
Par contre is not like ne fonctionne pas.
Quelqu'un aurait une explication ?
Je ne comprends pas.
(il y a bien d'autre macros qui font cela mais je souhaiterai comprendre la logique de celle ci)
Merci
J'ai cette macro VBA qui me permet de supprimer des ligne si une cellule contient une certaine valeur.
Sub supression_Codes_Oper()
Dim DerLig As Long, ligne As Long
Const Code = 11 'constante (code = intitulé colonne) (11 = numéro de colonne)
Application.ScreenUpdating = False
With Worksheets("test") 'avec le classeur "test"
DerLig = .Range("c" & Rows.Count).End(xlUp).Row
For ligne = DerLig To 2 Step -1
If UCase(.Cells(ligne, Code)) = "86" _
Or UCase(.Cells(ligne, Code)) = "32" _
Then .Rows(ligne).Delete
Next ligne
End With
Application.ScreenUpdating = True
End Sub
Cependant, lorsque j'essaie de modifier le = par <> afin que la macro ne me supprime plus la ligne qui contient la valeur, mais supprime les lignes qui ne contiennent pas cette valeur elle me supprime toutes les lignes du tableau
exemple
Or UCase(.Cells(ligne, Code)) <> "32" 'si la valeur de la cellule ne contient pas 32
Then .Rows(ligne).Delete ' alors supprime la ligne
Egalement si j'utilise les signe > et < la macro ne fonctionne pas
exemple
Or UCase(.Cells(ligne, Code)) > "32" 'si la valeur de la cellule est supèrieur à 32
Then .Rows(ligne).Delete ' alors supprime la ligne
J'ai remplacé le = par like et cela fonctionne
Par contre is not like ne fonctionne pas.
Quelqu'un aurait une explication ?
Je ne comprends pas.
(il y a bien d'autre macros qui font cela mais je souhaiterai comprendre la logique de celle ci)
Merci
A voir également:
- Vba supprimer ligne si cellule contient
- Supprimer rond bleu whatsapp - Guide
- Excel cellule couleur si condition texte - Guide
- Partager photos en ligne - Guide
- Supprimer page word - Guide
- Aller à la ligne dans une cellule excel - Guide
5 réponses
Bonjour,
si j'utilise les signe > et < la macro ne fonctionne pas
If UCase(.Cells(ligne, Code)) <> "86" _
Or UCase(.Cells(ligne, Code)) <> "32" _
Then .Rows(ligne).Delete
Si tu l'as écrit ainsi, toutes tes lignes sont obligatoirement supprimées car elles ne peuvent pas être égales à 32 et 86 simultanément donc elles sont toutes différentes soit de 32 soit de 86.
si j'utilise les signe > et < la macro ne fonctionne pas
If .Cells(ligne, Code) > 32devrait mieux fonctionner car si tu mets "32", la macro compare en texte et tu n'as pas besoin de ucase avec des nombres.
If UCase(.Cells(ligne, Code)) <> "86" _
Or UCase(.Cells(ligne, Code)) <> "32" _
Then .Rows(ligne).Delete
Si tu l'as écrit ainsi, toutes tes lignes sont obligatoirement supprimées car elles ne peuvent pas être égales à 32 et 86 simultanément donc elles sont toutes différentes soit de 32 soit de 86.
Bonsoir
Si tu inverses la la macro il faut mettre AND au lieu de OR
En effet la condition si différent de 32 OU 86 est valable tout le temps puisque 32 est égale à 32 mais est différent de 86 et vice versa
Cdlmnt
Si tu inverses la la macro il faut mettre AND au lieu de OR
En effet la condition si différent de 32 OU 86 est valable tout le temps puisque 32 est égale à 32 mais est différent de 86 et vice versa
Cdlmnt
Bonsoir tous les deux,
Merci pour vos explications logiques.
Une autre question dans la ligne ci dessous le "c" semble correspondre à la colonne qui contient mes cellules.
Mais la macro fonctionne quand même avec la colonne V alors que je laisse le "c" et que je ne met pas "v" comme le voudrait la logique
Une explication ?
Merci
Merci pour vos explications logiques.
Une autre question dans la ligne ci dessous le "c" semble correspondre à la colonne qui contient mes cellules.
DerLig = .Range("c" & Rows.Count).End(xlUp).Row
Mais la macro fonctionne quand même avec la colonne V alors que je laisse le "c" et que je ne met pas "v" comme le voudrait la logique
Une explication ?
Merci
La macro repère la dernière ligne non vide de la colonne C et boucle depuis cette dernière ligne jusqu'à la ligne 2 en testant les valeurs contenues dans une autre colonne ( If UCase(.Cells(ligne, Code)) = "86") la colonne 11 en l' occurrence puisque c'est la valeur attribuée à Code en début de macro; ce sont donc les valeurs de la colonne K (et non V) qui sont testées
Re bonjour,
J'ai une autre question concernant cette macro.
si je met
cela fonctionne
Mais si je met 100 dans la cellule qui est renvoyée par la macro cela ne fonctionne pas (pourtant je met bien au format nombre dans la cellule
Merci
J'ai une autre question concernant cette macro.
si je met
If UCase(.Cells(ligne, Montant)) < 100 Then .Rows(ligne).Delete
cela fonctionne
Mais si je met 100 dans la cellule qui est renvoyée par la macro cela ne fonctionne pas (pourtant je met bien au format nombre dans la cellule
Quelqu'un aurait une idée ?
If UCase(.Cells(ligne, Montant)) < Range(" 'Montant sup'!D5") Then .Rows(ligne).Delete
Merci
Bonsoir,
Range(" 'Montant sup'!D5") n'est pas une référence valide,
si je comprends bien Montant sup est le nom de l'onglet dont tu veux la valeur de la cellule D5
alors tu dois écrire : Sheets("Montant sup").Range("D5")
ou encore Sheets("Montant sup").cells(5,4)
D'autre part je ne comprends pas la logique d'une variable appelée Montant pour renvoyer un n° de colonne dans Cells(ligne, Montant) mais bon !
Cdlmnt
Range(" 'Montant sup'!D5") n'est pas une référence valide,
si je comprends bien Montant sup est le nom de l'onglet dont tu veux la valeur de la cellule D5
alors tu dois écrire : Sheets("Montant sup").Range("D5")
ou encore Sheets("Montant sup").cells(5,4)
D'autre part je ne comprends pas la logique d'une variable appelée Montant pour renvoyer un n° de colonne dans Cells(ligne, Montant) mais bon !
Cdlmnt
Bonsoir, via55
J'ai essayé avec ce que tu m'as dis mais ça ne fonctionne pas.
J'ai également essayé avec (Range("Montant sup'!D5").Value) ça ne fonctionne pas.
En fait la variable appelée montant renvoie a une feuille dans laquelle se trouve la colonne montant et la macro surprime les lignes en fonction d'une valeur.
ça fonctionne quand je met directement la valeur dans la macro mais lorsque je met la valeur dans une cellule (ce qui permet de modifier la valeur sans aller dans la macro) ça ne fonctionne plus....
J'ai essayé avec ce que tu m'as dis mais ça ne fonctionne pas.
J'ai également essayé avec (Range("Montant sup'!D5").Value) ça ne fonctionne pas.
En fait la variable appelée montant renvoie a une feuille dans laquelle se trouve la colonne montant et la macro surprime les lignes en fonction d'une valeur.
ça fonctionne quand je met directement la valeur dans la macro mais lorsque je met la valeur dans une cellule (ce qui permet de modifier la valeur sans aller dans la macro) ça ne fonctionne plus....
Bonjour à tous,
Malgré votre aide ça ne fonctionne toujours pas. (avec n'importe quel code pour renvoyer la valeur cellule).
J'ai mis un exemple en pièce jointe.
https://www.cjoint.com/c/CLDvigFbR8z
- le premier onglet "paiement" contient les montant ou les lignes sont supprimées en fonction de la valeur choisie
- le second onglet controle est là ou la valeur est saisie
- le troisième est l'échantillon des paiement à coller dans l'onglet paiement si la macro supprime toutes les lignes
Merci
Malgré votre aide ça ne fonctionne toujours pas. (avec n'importe quel code pour renvoyer la valeur cellule).
J'ai mis un exemple en pièce jointe.
https://www.cjoint.com/c/CLDvigFbR8z
- le premier onglet "paiement" contient les montant ou les lignes sont supprimées en fonction de la valeur choisie
- le second onglet controle est là ou la valeur est saisie
- le troisième est l'échantillon des paiement à coller dans l'onglet paiement si la macro supprime toutes les lignes
Merci
Bonsoir Harry
Comme disait déjà gbinforme dans sa réponse du 14, Ucase est inutile avec des nombres !
et ici cela empêche la macro de fonctionner correctement
Remplace la ligne avec Ucase par celle ci :
If Cells(ligne, Montant).Value < Sheets("controle").Range("A2").Value Then .Rows(ligne).Delete
et tu verras que cela fonctionne parfaitement !
Cdlmnt
Comme disait déjà gbinforme dans sa réponse du 14, Ucase est inutile avec des nombres !
et ici cela empêche la macro de fonctionner correctement
Remplace la ligne avec Ucase par celle ci :
If Cells(ligne, Montant).Value < Sheets("controle").Range("A2").Value Then .Rows(ligne).Delete
et tu verras que cela fonctionne parfaitement !
Cdlmnt
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question