Macro supprime ligne selon la valeur d'une cellule

Résolu/Fermé
Harry Baux Messages postés 17 Date d'inscription samedi 14 décembre 2013 Statut Membre Dernière intervention 30 décembre 2013 - 14 déc. 2013 à 21:52
Harry Baux Messages postés 17 Date d'inscription samedi 14 décembre 2013 Statut Membre Dernière intervention 30 décembre 2013 - 30 déc. 2013 à 21:41
Bonjour à tous,
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:

5 réponses

gbinforme Messages postés 14935 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 629
14 déc. 2013 à 22:26
Bonjour,

si j'utilise les signe > et < la macro ne fonctionne pas

If .Cells(ligne, Code) > 32 
devrait 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.
0
via55 Messages postés 13881 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 27 septembre 2022 2 490
14 déc. 2013 à 22:32
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
0
Harry Baux Messages postés 17 Date d'inscription samedi 14 décembre 2013 Statut Membre Dernière intervention 30 décembre 2013
14 déc. 2013 à 23:39
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.

 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
0
via55 Messages postés 13881 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 27 septembre 2022 2 490
15 déc. 2013 à 01:36
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
0
Harry Baux Messages postés 17 Date d'inscription samedi 14 décembre 2013 Statut Membre Dernière intervention 30 décembre 2013
15 déc. 2013 à 22:44
merci beaucoup
0
Harry Baux Messages postés 17 Date d'inscription samedi 14 décembre 2013 Statut Membre Dernière intervention 30 décembre 2013
27 déc. 2013 à 20:29
Re bonjour,
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

If UCase(.Cells(ligne, Montant)) < Range(" 'Montant sup'!D5") Then .Rows(ligne).Delete
Quelqu'un aurait une idée ?
Merci
0
via55 Messages postés 13881 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 27 septembre 2022 2 490
27 déc. 2013 à 23:59
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
0
Harry Baux Messages postés 17 Date d'inscription samedi 14 décembre 2013 Statut Membre Dernière intervention 30 décembre 2013
28 déc. 2013 à 22:46
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....
0
Harry Baux Messages postés 17 Date d'inscription samedi 14 décembre 2013 Statut Membre Dernière intervention 30 décembre 2013
29 déc. 2013 à 21:13
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
0
via55 Messages postés 13881 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 27 septembre 2022 2 490
29 déc. 2013 à 23:17
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
0
Le Pingou Messages postés 11232 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 27 septembre 2022 1 308
Modifié par Le Pingou le 30/12/2013 à 18:04
Bonjour via55,
Tout petit détail au passage, il faut avoir le point (.) devant [Cells] car on est dans la boucle With Worksheets("paiements")...donc :
If .Cells(ligne, Montant) < (Sheets .......
De plus merci à eriiic pour son apparté ......
Sallutations
Le Pingou
0
via55 Messages postés 13881 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 27 septembre 2022 2 490
30 déc. 2013 à 18:21
Bonjour Le Pingou

Merci de la rectification, comme d'habitude j'ai tapé trop vite et le point n'a pas suivi !

Cdlmnt
0
Le Pingou Messages postés 11232 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 27 septembre 2022 1 308
30 déc. 2013 à 21:12
Merci à vous et n'oubliez pas le petit apparté d'eriiic (lien 10) qui est très intéressent...!
Sallutations
Le Pingou
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Harry Baux Messages postés 17 Date d'inscription samedi 14 décembre 2013 Statut Membre Dernière intervention 30 décembre 2013
30 déc. 2013 à 21:41
Bonsoir à tous,
Effectivement ça fonctionne comme quoi le moindre détail compte.
Merci à tous pour votre aide ça m'a été très instructif.
Bonne soirée
0