Macro supprime ligne selon la valeur d'une cellule [Résolu/Fermé]

Signaler
Messages postés
17
Date d'inscription
samedi 14 décembre 2013
Statut
Membre
Dernière intervention
30 décembre 2013
-
Messages postés
17
Date d'inscription
samedi 14 décembre 2013
Statut
Membre
Dernière intervention
30 décembre 2013
-
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

5 réponses

Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 108
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.
Messages postés
12480
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
10 août 2020
1 962
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
Messages postés
17
Date d'inscription
samedi 14 décembre 2013
Statut
Membre
Dernière intervention
30 décembre 2013

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
Messages postés
17
Date d'inscription
samedi 14 décembre 2013
Statut
Membre
Dernière intervention
30 décembre 2013

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
Messages postés
12480
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
10 août 2020
1 962
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
Messages postés
17
Date d'inscription
samedi 14 décembre 2013
Statut
Membre
Dernière intervention
30 décembre 2013

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....
Messages postés
12480
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
10 août 2020
1 962
Bonsoir Harry

(Range("Montant sup'!D5").Value) n'est pas non plus une écriture valide

Range requiert seulement la plage de cellule
Pour indiquer la feuille dans laquelle trouver la cellule c'est Sheets
Pour obtenir la valeur d'une cellule d'une feuille donnée il faut bien combiner:

Sheets("nomdelafeuille").Range("adressecellule").value

par ex: a=Sheets("Planning").Range("B5").value (équivalent en VBA de Planning!B5 dans une formule d'une feuille)
en ce cas a prendra la valeur indiquée dans B5 de la feuille Planning

SI tu mets 100 dans ta cellule et que ton code VBA est correctement construit comme ci-dessus ça doit fonctionner comme lorsque tu mets 100 directement dans le code VBA

Si tu n'y arrives pas tu peux poster un exemple allégé et anonymé de ton fichier sur cjoint.com et indiquer ici ensuite le lien fourni

Cdlmnt
Messages postés
23420
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
8 août 2020
6 284
Bonjour à tous,

petit apparté :
a = Range("Montant!D5").Value
est valide, mais on s'adresse au CodeName de la feuille et non à son nom.

eric
Messages postés
17
Date d'inscription
samedi 14 décembre 2013
Statut
Membre
Dernière intervention
30 décembre 2013

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
Messages postés
12480
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
10 août 2020
1 962
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
Messages postés
9745
Date d'inscription
mercredi 11 août 2004
Statut
Contributeur
Dernière intervention
24 juillet 2020
1 061
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
Messages postés
12480
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
10 août 2020
1 962
Bonjour Le Pingou

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

Cdlmnt
Messages postés
9745
Date d'inscription
mercredi 11 août 2004
Statut
Contributeur
Dernière intervention
24 juillet 2020
1 061
Merci à vous et n'oubliez pas le petit apparté d'eriiic (lien 10) qui est très intéressent...!
Sallutations
Le Pingou
Messages postés
17
Date d'inscription
samedi 14 décembre 2013
Statut
Membre
Dernière intervention
30 décembre 2013

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