commment rechercher et supprimer des lignes

  • Initiateur de la discussion laurent
  • Date de début
L

laurent

Guest
Bonjour à tous,

Je débute dans les macros et je me trouve coincé.

J'ai un fichier excel avec 200 lignes qui me servent à rien.
Dans la colonne A de ces lignes, il y a "PCI Dump".

J'aimerai faire une macro qui cherche les cellules contenant "PCI Dump" et supprime ces lignes.

Voici ma macro.

Dim cel As Object
Do
For Each cel In Range("A:A")
If cel.value = "PCI Dump" Then
cel.EntireRow.Delete
End If
Next cel
Loop Until cel.Value = ""
MsgBox "fini"

ça marche mais ça ne me supprime pas la totalité des lignes (obliger de relancer la macro pour supprimer le reste). je lance la macro ça me supprime une 100ène de lignes, la seconde fois une 50ène, puis 30, 10,...jusqu'à 0.
Au total, je doit lancer au moins 5 fois la macro pour ne plus avoir de ligne.

Qu'est ce qui ne va pas dans ma macro??

Merci d'avance

Laurent
 
Y

Yeahou

Guest
Re Bonjour à tous

Pour Pgcp
donc tu ne veux pas supprimer les lignes mais simplement effacer les valeurs sans effacer les formules.

remplaces

.Range(Tab_Row(Compteur2)).Delete Shift:=xlUp

par

.Range(Tab_Row(Compteur2)).SpecialCells(xlCellTypeConstants, 23).ClearContents

et cela devrait te convenir

A+
 
M

Michel_M

Guest
Bonjour tout le monde,

Excusez moi de m'insérer dans ce fil intéressabt
Ci dessous proposition de macro pour PGPC (efface ligne entière) mais vu les macros précédentes je me dis que je dois certainement me planter(ça, je sais faire). Enfin, à titre de contribution ou de question, je l'envoie quand m^me "au cas où"
--------------
Option Explicit

Sub supprimer()
Dim nbre As Integer, lig As Integer

nbre = Application.CountIf(Range("G3:G150"), 0)
While nbre > 0
lig = Columns(7).Find(0, Range("G2"), , , xlByRows).Row
Rows(lig).Delete
nbre = nbre - 1
Wend
End Sub

A+
Michel
 
J

JCA06

Guest
Re bonjour à tous,

Merci à Yeahou pour ces précisions, voici ce que je pense avoir compris :
1. Après avoir défini ta plage de test, tu alimentes un tableau dans lequel tu stocke les numéros de lignes qui remplissent la ou les conditions ;
2 Tu élimines les lignes référencées dans ton tableau en partant de la dernière pour ne pas modifier les références.

Allez Yeahou, dis-moi que c'est ça !

A+
 
P

PGPC

Guest
Hello le forum ,Michel

Cà ne va pas non plus ,

le code de YEAHOU va très bien pour supprimer ...

MOi comme il le dit dans son fil je veux la même chose en conservant le même nombre de lignes C'est à dire pas supprimer mais effacer les valeurs sans supprimer les formules

Merci
 
Y

Yeahou

Guest
Re tout le monde

Bonjour Michel

tu as eu raison, ton code est interressant. Par contre nbre et lig seraient mieux en long parce qu'un entier à 32768 ne peut traiter toutes les lignes d'un feuille. Les premiers codes de ce fil étaient également assez simples jusqu'à ce que l'on essaye d'optimiser pour améliorer la vitesse de traitement. Ton code effectuant pour chaque valeur une recherche + une suppression, il est assez lent mais reste parfaitement adapté aux tableaux de petite taille et constitue une alternative interressante.


A+
 
Y

Yeahou

Guest
Re tout le monde

Tout bon Jca06

Pour Pgcp

chez moi
.Range(Tab_Row(Compteur2)).SpecialCells(xlCellTypeConstants, 23).ClearContents
fonctionne parfaitement, cela efface les valeurs pas les formules
tu as une feuille exemple? parce que la on tourne en rond

A+
 
J

JCA06

Guest
Merci Yeahou,

J'ai encore apris quelques choses sur ce forum aujourd'hui !

Je sens bien que les tableaux sont puissants mais qu'il me faudra revenir de nombreuses fois sur ce forum avant de prétendre les connaître !

Bonne après-midi.
 
Y

yeahou

Guest
Bonjour à tous

j'ai trouvé un bug dans ma dernière version alors voila un correctif. Pour info, Thierry a proposé une solution trés rapide que vous trouverez la.
<http://www.excel-downloads.com/html/French/forum/read.php?f=1&i=103479&t=101832>

Cordialement, A+

Sub Supprimer_Lignes()
'définition des variables
Dim Tab_Cells As Variant, Tab_Row() As String, Mem_Row As Long
Dim Cellule_Debut As Range, Cellule_Fin
Dim Deb_Tab As Long, Compteur As Long, Compteur2 As Long, Compteur3 As Long

'désactivation de l'affichage écran pour gagner en rapidité
Application.ScreenUpdating = False

With ActiveSheet
'indiquer ici la plage de test
'si je désire tester les cellules colonnes A et D sur 6000 lignes la plage sera range("A1:D6000")
'la ligne suivante définit le début du tableau de valeurs pour test
Set Cellule_Debut = .Range("A1")
'la ligne suivante définit la fin du tableau de valeurs pour test
'la valeur actuelle correspond à la dernière cellule de la colonne D avec possibilité de valeur
Set Cellule_Fin = Range("D" & Range("A1").SpecialCells(xlCellTypeLastCell).Row)
'mémorise la ligne de début du tableau de valeurs
Mem_Row = Cellule_Debut.Row - 1
'passe les valeurs de cellules au tableau de valeurs
Tab_Cells = .Range(Cellule_Debut.Address & ":" & Cellule_Fin.Address).Value
'initialise les compteurs
Compteur = 0
'boucle sur la longueur du tableau
For Compteur2 = LBound(Tab_Cells) To UBound(Tab_Cells)
'indiquer ici la valeur du test et les ou la colonne du tableau, ici 2 car colonnes de test sur A et D
If Tab_Cells(Compteur2, 1) = "PCI Dump" Or Tab_Cells(Compteur2, 4) = "519" Then
Compteur = Compteur + 1
'on redimensionne en conservant les valeurs
ReDim Preserve Tab_Row(1 To Compteur) As String
'indiquer ici la plage à supprimer, laisser de A à IV pour lignes entières
Tab_Row(Compteur) = "A" & (Compteur2 + Mem_Row) & ":" & "IV" & (Compteur2 + Mem_Row)
'on enregistre le numéro de première ligne test ok
End If
Next Compteur2
'on efface les lignes détectées en partant de la fin
For Compteur2 = Compteur To 1 Step -1
.Range(Tab_Row(Compteur2)).Delete Shift:=xlUp
Next Compteur2
End With
End Sub
 

Discussions similaires

Réponses
6
Affichages
173

Statistiques des forums

Discussions
312 559
Messages
2 089 604
Membres
104 225
dernier inscrit
Misterpat63