wildpegase
15-09-2008 - 10:52
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
15-09-2008 - 12:04
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
16-09-2008 - 3:03
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
16-09-2008 - 4:03
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
16-09-2008 - 4:38
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
24-09-2008 - 7:08
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.