Aide - Recherche - Membres - Calendrier
Version complète : Suppression en fonction du caractère de droite par Macro
Trucs et astuces Express > Discussions Informatique > Microsoft Office 2003 / 2007 > Excel
wildpegase
Bonjour à tous,

Je cherche, à l'aide d'une macro, à supprimer les lignes d'un tableau Excel pour lesquelles il y a dans la cellule (colonne A) un "8" en dernière position, exemple 108.

J'ai pour l'instant le code ci-dessous, mais il ne fonctionne pas.


Sub sup_les_8()

Dim derlig As Long, cellule As Range


derlig = Range("A65536").End(xlUp).Row

Range("A2:I" & derlig).Select
Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom


Range("A2").Select
For Each cellule In Range("a:a")
If Right(cellule, 1) = "8" Then


Rows(Cells).EntireRow.Delete
'ActiveCell.Rows(Cells).EntireRow.Select
'Selection.Delete shift:=xlUp
'ActiveCell.Offset(-1, 0).Select
End If
Next

End Sub


Le trie fonctionne tant qu'il n'y a pas de nombre qui fini par 8. Mais dès que cette occurence est traitée la macro s'arrête avec
un panneau qui m'indique : " Incompatibilité de type "

Y-a-t-il une âme généreuse qui pourrait m'aider et surtout m'expliquer pourquoi mon code ne fonctionne pas.


En vous remerciant par avance.

Webmicalement.

Laurent.
michel_m
Bonsoir,

a essayer ( maxi récurrences chez moi: env 1150 données avec 8 à droite
CODE
Sub supprimer_les_huitadroite()

Application.ScreenUpdating = False

On Error Resume Next
lig = Columns(1).Find("*8", Range("A65536"), , xlWhole).Row
Rows(lig).Delete
If Err.Number > 0 Then: End

supprimer_les_huitadroite

End Sub


edit: valable que si tu rends la main à l'utilisateur (utilisation du "end")

Bonne soirée
wildpegase
Bonjour Michel,

Tout d'abord merci pour ta macro. Elle fonctionne parfaitement, et ce quelque soit le nombre d'occurence.

Je ne comprend pas ta remarque concernant "edit".

edit: valable que si tu rends la main à l'utilisateur (utilisation du "end")

Es-tu en mesure de m'aider à modifier MA macro et m'expliquer ce qui ne va pas dans


For Each cellule In Range("a:a")
If Right(cellule, 1) = "8" Then
Rows(Cells).EntireRow.Delete
End If



Bonne journée à toi.

Laurent.
wildpegase
A tous ( et à Michel ),

J'ai essayé comme code :

Range("A1").Select
For Each cellule In Range("A1:I" & derlig)
If Right(cellule, 1) = "8" Then

cellule.EntireRow.Select
cellule.EntireRow.Delete

End If
Next


Le problème est que si j'ai successivement 2 cellules avec un 8 en dernière position. La 2ème cellule n'est pas traitée.

Je pense que le suppression d'une ligne décale les données, mais que le "compteur" For each cellule ne fait pas "un pas en arrière" et ne prend donc pas en compte la valeur de la cellule suivante.

Pas facile la manipulation des données avec une boucle.


Laurent.
michel_m
Bonjour Laurent

------
Range("A1").Select

inutile car tu détermines en dessous ta zone de travail;
select-selection est à éviter au maximum: ralentit tout, bouffe de la mémoire, fait scintiller l'écran (l'enregistreur de macro est un assistant: donc, quand tu sélectionne une cellule, il marque "select
")
-----
For Each cellule In Range("A1:I" & derlig)
If Right(cellule, 1) = "8" Then

pourquoi I ? tu parlais au départ de la colonne A
-----
cellule.EntireRow.Select
cellule.EntireRow.Delete

à remplacer par
rows(cellule.row).delete

End If
Next

END: cette instruction ferme toutes les macros en cours: si "sup les 8" est une sous- macro, le retour à la macro principale ne se fera pas

Cordialement
wildpegase
Michel,

Merci de ta réponse. Ton code est évidemment plus "propre" que le mien !


Je bute toujours sur le cas de figure où 2 cellules contigues ont un 8 en dernier caractère.

Avec la macro, le 2ème 8 n'est pas supprimé et la macro passe en revu les lignes suivantes.


As-tu une idée pour contourner ce problème ?



Cordialement.

Laurent.
Ceci une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquez ici.
Invision Power Board © 2001-2008 Invision Power Services, Inc.