Macro, suppression ligne

  • Initiateur de la discussion Fredrennes
  • Date de début
F

Fredrennes

Guest
Re-Hello,

Je voudrais créer une macro telle que :

Si il y a par ex "X" en H2, H3.....alors suppression de toutes ces lignes.

Je ne souhaite pas que vous me donniez la macro toute faite mais seult une petite aide...

Pour le moment j'en suis à :

Sub suppression_ligne ()
IF (H2="X",delete.......

Je débute en vba vous l'aurez compris....

Je suppose qu'il faut que j'utilise une fonction du style delete row 2 ou qq chose dans ce style....

Si vous pouvez me dire si je commence à peu près bien ou si j'ai tout faut, cela m'arrangerait.

Merci pour votre aide.

Cdlt

Fred
 
F

Fredrennes

Guest
ActiveCell.Offset(1, 0).Range("A1").Select
Loop
Range("A1").Select


Je ne pige pas cette partie......c'est pour recoller les lignes en comblant les espaces vides créés par la suppression ?

Merci

Fred
 
D

Dan

Guest
Exact

"loop" pour refaire ta procédure jusqu'à ce qu'il n'y ai plus de X ou Y

"Range ...." : pour replacer le curseur dans la cellule A1

Si tu veux voir ce qui se passe :
- ouvres VBA (Alt + F11) et arranges-toi pour voir en arrière plan la sheet dans laquelle tu dois supprimer tes valeurs.
Ensuite tu cliques une fois sur le début de ta macro ("Sub ....()") et puis tu peux suivre pas à pas en activant la touche F8 sur ton clavier.

@+ dan
 
F

Fredrennes

Guest
Oki, je comprends ce que tu veux dire Dan....

Si j'ai bien compris, nous pouvons mettre n'importe quoi en face du "range" dans la dernière ligne puisqu'après exécution de la macro, nous pourrons cliquer en A1 pour que le curseur y apparaisse.......donc j'imagine qu'il s'agit juste de mise en forme et que nous pouvons nous en passer....

Par contre la partie juste au-dessus :

ActiveCell.Offset(1, 0).Range("A1").Select

Pourquoi part-on de A1 ? et non pas de H2 1ère cellule et 1ère ligne dans laquelle nous pouvons trouver l'enregistrement "X" ou "Y" ?

Dernière question, pour débuter la macro j'ai mis datas.select (datas étant le nom de mon onglet)....qd je presse F8 comme tu me l'as conseillé, ça ne fonctionne pas, il me met :

run time error 9
subscript out of range

Désolé pour toutes ces questions....merci pour ta disponibilité

Amicalement
Fred
 
D

Dan

Guest
Fred,

Non, tu ne dois pas mettre H2, enlève "Range("A1")" et laisse uniquement "Select" comme je te l'avais dit avant.
tu dois avoir ceci :

"ActiveCell.Offset(1, 0).Select"

Pour démarrer ta macro ajoute ceci à la place de "datas.select" :

Sheets("nom de ton onglet").Select

Cela devrait être OK

@+

Dan
 
@

@+Thierry

Guest
Salut le Fil (suis ultra à la bourre)


Vite pour éclaircir une de tes dernières Q Fred...

ActiveCell.Offset(1, 0).Select

Suffit amplement !!

Dans => ActiveCell.Offset(1, 0).Range("A1").Select "Range("A1") NE SERT A RIEN, c'est un résudi de l'enregistrement de Macro que Dan a dû utiliser.

Sinon je conseille aussi ce fil :
Lien supprimé

Qui devrait aussi t'éclirer sur la méthode EntireRow.Delete et qui oblige Zon à reboucler en permance avec un "GoTo 1"...


@+Thierry
 
F

Fredrennes

Guest
Sub suppression_lignes()
Sheets("Datas").Select
Range("H2").Offset(1, 0).Select
Do Until activcell = " "
If ActiveCell = "X" or Activcell="Y" Then
Selection.EntireRow.Delete
End If
ActiveCell.Offset(1, 0).Select
Loop
End Sub


Je pense qu'il faut que je lui mette une limite plutôt que " " car ça a l'air de planter à ce niveau....
 
D

Dan

Guest
Bonsori Fred,

Ben oui là je suis chez moi.

je vois que thierry t'as également aidé sur ce fil et a raison de dire que ""Range("A1") NE SERT A RIEN". C'est en effet un résidu de la macro. Bref à enlever comme je te l'avais dit précédement.

Par contre je ne suis pas sur que ton instruction "If ActiveCell = "X" or Activcell="Y" Then" va fonctionner.

1. Corrige suivant le commentaire d'Alain
2. compare ta macro avec la réponse que je t'ai envoyée à 15H04 et qui évite le plantage.

et @+++

dan
 
Z

zon

Guest
Re,

Pour répondre à Dan, as-tu tester au moins mon code ou essayer de le comprendre, si match ne trouve pas de "X" il y a erreur éviter pars goto sortie, je sors de la sub donc rapide.


J'ai fait un essai stupide sur 32000 lignes dans lesquelles il y avait 8 X et 8 Y, mon code est immédiat, le tien comme tu balaies toutes les cellules plus de 2 min sur ma bécane....
Si dans l'absolu il n'ya pas de X ou de Y, toi tu balaies quand même toute la plage quand il y a quelques lignes ca va mais à partir de 1000 le temps commence à être long.

Par contre à partir de 3 criteres de recherche il vaudra mieux ton code...

Il y a quelques temps j'aurais fait un code ressemblant au tien, mais j'ai découvert par hasard EQUIV donc MATCH en Anglais, je me suis dit que cela pouvait être une bonne idée pour faire avancer le schmilblik dans le cas présent....



A+++
 
F

Fredrennes

Guest
Hello à tous,

Un peu dans le flou aujourd'hui....je vais continuer tout cela ds l'après-midi......j'ai plus de 3 critères zon (une dizaine environ)

Je vous tiens au courant

Merci encore

Amicalement
Fred
 
F

Fredrennes

Guest
Hello,

Avt de commencer à regarder les autres propositions, je voudrais savoir pourquoi cette macro ne supprime pas tous les enregistrements dont on a parlé :

Sub suppression_OWR()
Sheets("Datas").Select
Range("H2").Offset(1, 0).Select
Do Until ActiveCell = ""
If ActiveCell = "X" Or ActiveCell = "Y" Or ActiveCell = "Z" Or ActiveCell = "M" Or ActiveCell = "N" Or ActiveCell = "O" Or ActiveCell = "P" Or ActiveCell = "Q" Or ActiveCell = "R" Or ActiveCell = "S" Or ActiveCell = "T" Or ActiveCell = "U" Or ActiveCell = "V" Then
Selection.EntireRow.Delete
End If
ActiveCell.Offset(1, 0).Select
Loop
End Sub


J'ai bien suppression de lignes mais pas la totalité.....help me please.

Merci pour tout

Amicalement
Fred
 
J

Jacques

Guest
Bonsoir à tous,
effectivement les lignes situées sous une ligne supprimées ne sont pas traitées donc pas supprimées si elles doivent l'être.
j'explique:
Quand la ligne est supprimée, la cellule active est celle qui est juste en desoous de celle qui l'était et qui fait partie de la ligne supprimée. et comme l'instruction suivante est de sélectionner la cellule de la ligne suivante, il y a une ligne qui n'est pas traitée.
donc il faudrait modifier la macro comme suit :
Sub suppression_OWR()
Sheets("Datas").Select
Range("H2").Offset(1, 0).Select
Do Until ActiveCell = ""
If ActiveCell = "X" Or ActiveCell = "Y" Or ActiveCell = "Z" Or ActiveCell = "M" Or ActiveCell = "N" Or ActiveCell = "O" Or ActiveCell = "P" Or ActiveCell = "Q" Or ActiveCell = "R" Or ActiveCell = "S" Or ActiveCell = "T" Or ActiveCell = "U" Or ActiveCell = "V" Then
Selection.EntireRow.Delete
Else
ActiveCell.Offset(1, 0).Select
End If
Loop
End Sub

Quant à la question de savoir si RANGE("A1") sert ou pas eh bien ça dépend!
un objet Range désigne en fait une plage. Si on ne précise rien la plage est limitée à une seule cellule.
en revanche si on veut sélectionner une plage de cellule par exemple de H2 à J7, il faudra écrire :
Range("H2").Offset(1, 0).Range("A1:C5").Select
ce qui signifiera que l'on veut sélectionner une plage de cellules identique à la plage A1:C5 à partir de H2 c'est à dire 3 colonnes sur 5 lignes à partir de H2.
J'espère avoir été clair et je vous souhaite une bonne soirée
 
A

alain

Guest
Bonsoir,


Juste une ligne de code qui pourrait remplacer la ligne ci-dessous :

If ActiveCell = "X" Or ActiveCell = "Y" Or ActiveCell = "Z" Or ActiveCell = "M" Or ActiveCell = "N" Or ActiveCell = "O" Or ActiveCell = "P" Or ActiveCell = "Q" Or ActiveCell = "R" Or ActiveCell = "S" Or ActiveCell = "T" Or ActiveCell = "U" Or ActiveCell = "V" Then

A remplacer par :

If InStr("XYZMNOPQRSTUV", ActiveCell) <> 0 Then

Je trouve çà plus joli !! Pas vous ?


Bonne soirée.


@+
 
D

Dan

Guest
Salut Fred,

J'avais également essayé ce que Alain proposait ("If ActiveCell = "X" Or ActiveCell = "Y" .... ")mais assez étrangement la macro s'arrêtait en me retrounant un message d'erreur. Je vais réessayer mais en tout cas très intéressant le code qu'il a donné.

Ce week end j'ai également retrouvé une instruction dans mes archives qui aurait pu te servir. Il s'agit de l'instruction "Select case...case is...". Très intéressante celle là.
Bref je vois que tu es servi et tout est OK.

Message à Zon, vrai que ma macro balaie la plage tant qu'il n'y a pas de cellule vide et que si on a plus de 1000 lignes cela va prendre du temps.
Tu le sais surement excel commence à s'alourdir lorsque tu dépasses 800 records, surtout si tu utilises en plus des couleurs dans les cellules.
Ce qui me genait c'était l'instruction "goto" que j'évite toujours d'employer tant il ya moyen de se perdre lorsque tu en as plusieurs imbriquées les unes dans les autres. Je préfère d'autres comme do...loop, etc.... .Vrai que l'instruction Match est vraiment intéressante. Par ailleurs dans sa 1ère question Fred ne nous parlait que d'une valeur X. J'ai donc essayé de parer au plus simple.


Bonne journée à tous

Dan
 

Discussions similaires