suppression d'une ligne sous conditions

O

olivierd

Guest
bonjour cher(e ) lecteur (rice),

J'ai un tableau qui comporte des comptes 4xx et des comptes 6xx
Est-il possible de faire une macro qui détecte que "si la ligne ( ou la cellule ) comporte un compte commencant par 4 alors supprimer la ligne" ?

merci d'avance pour vos infos

très cordialement

olivier
 
Y

yeahou

Guest
Bonjour Olivierd, le forum

tu trouveras sur ce fil une macro de suppression
<http://www.excel-downloads.com/html/French/forum/read.php?f=1&i=101568&t=98318>
pour le test à faire, il faudrait plus de précision mais normalement
If Left(Tab_Cells(Compteur2, 1) , 1)= "4"
devrait suffire

A+
 
R

Robert

Guest
Salut Olivier, Salut Yaehou, salut le forum,

Peut être cette macro te satisfera. Dans cet exemple on considère que les cellules où le compte est écrit sont la la colonne A et commencent sur la première ligne. À toi de l'adapter à ton cas.

Public Sub test()
Dim cel As Range
Dim lig As Long
lig = 1
début:
For Each cel In Range("A" & lig & ":A" & Range("A65536").End(xlUp).Row)
If Mid(cel, 1, 1) = 4 Then
lig = cel.Row
cel.EntireRow.Delete
GoTo début
End If
Next cel
End Sub

À plus,

Robert
 
O

olivierd

Guest
Bonsoir et MERCI à tous
<débutant un peu pingouin>

je viens de tester la macro de Robert et elle fonctionne jusqu'à
If Mid(cel, 1, 1) = 4 Then

("Erreur d'execution de type 13 Type incomptabible" )

A quoi sert cette ligne est peut-on trouver une alternative VBA ...

Nota: et oui, sous mac le VBA d'Excel à quelques différences ( hélas )

cordialement

olivierd
 
R

Robert

Guest
Re à tous,

Désolé Olivier mais je ne pourrais pas t'aider plus car je n'ai pas de Mac et sur mon PC (version Excel 2000) ça fonctionne. Essaie peut-être la formule de Yeahou :
If Left(Tab_Cells(Compteur2, 1) , 1)= "4"

à la place de :
If Mid(cel, 1, 1) = 4 Then

À plus,

Robert
 
O

olivierd

Guest
merci... j'ai un peu de mal à suivre
Tu m'indique de faire:

Sub test()
Dim cel As Range
Dim lig As Long
lig = 1
début:
For Each cel In Range("A" & lig & ":A" & Range("A65536").End(xlUp).Row)

If Left(Tab_Cells(Compteur2, 1), 1) = "4" Then

lig = cel.Row
cel.EntireRow.Delete
GoTo début
End If
Next cel
End Sub

C'est bien ca ?
A quoi correspond Tab_Cells ?

cordialement
 
Y

yeahou

Guest
Re bonjour

Ouh la ! si c'est sur mac, voici un code pas trés rapide mais extra simple qui tourne sur ton fichier

Sub Sup_Lignes()
Dim Compteur As Long
Application.ScreenUpdating = False
For Compteur = Range("A1").SpecialCells(xlCellTypeLastCell).Row To 1 Step -1
If Left(Range("A" & Compteur).FormulaR1C1 , 1 )= "4" Then
Rows(Compteur & ":" & Compteur).Delete
End If
Next Compteur
End Sub

sinon code beaucoup plus rapide mais plus compliqué, tourne également sur ton fichier

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("A" & 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
Compteur3 = 65536
'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 Left(Tab_Cells(Compteur2, 1), 1) = "4" Then
If Compteur3 < 65536 Then
'indiquer ici les colonnes à supprimer, laisser de A à IV pour lignes entières
Tab_Row(Compteur) = "A" & (Compteur3 + Mem_Row) & ":" & "IV" & (Compteur2 + Mem_Row)
Else
'si première ligne en test ok ou ligne d'avant en test no ok, on incrémentre compteur
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
Compteur3 = Compteur2
End If
Else
Compteur3 = 65536
End If
Next Compteur2
'on efface les lignes détectées en partant de la fin
For Compteur2 = Compteur To 1 Step -1

'pour test
'Application.ScreenUpdating = True
'.Range(Tab_Row(Compteur2)).Select
'MsgBox Tab_Row(Compteur2)

.Range(Tab_Row(Compteur2)).Delete Shift:=xlUp
Next Compteur2
.Range("A1").Select
End With
MsgBox "fini"
End Sub

A+
 
O

olivierd

Guest
Fichtre !!!!! merci beaucoup Yeahou ( quel savoir )
les deux tournent à merveille, mais je n'ai hélas rien compris.

Tu as l'air de connaitre le VBA sous Mac, il y a t il de " grosses" différences à ta connaissance ?
 
Y

yeahou

Guest
Re tout le monde

Détrompe toi, je ne connais pas excel mac plus que ça, mais tout simplement, j'ai été échaudé par un code basique qui refuse de fonctionner correctement sur Mac.
<http://www.excel-downloads.com/html/French/forum/read.php?f=1&i=102763&t=102649>
Sans cela, pour mieux comprendre ces routines et les problèmes qu'on peut rencontrer lors de suppressions de lignes, lis ce fil:
<http://www.excel-downloads.com/html/French/forum/read.php?f=1&i=101568&t=98318

Cordialement, A+
 
Y

yeahou

Guest
Bonjour OlivierD, le forum

j'ai relevé un bug dans ma macro Supprimer_Lignes, donc voici un correctif.
Sans cela, Thierry a proposé une solution trés rapide utilisant les commentaires et que vous trouverez la !
<http://www.excel-downloads.com/html/French/forum/read.php?f=1&i=103479&t=101832>

A+

Sub Supprimer_Lignes2()
'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 Compteur As Long, Compteur2 As Long

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

With ActiveSheet
'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 A avec possibilité de valeur
Set Cellule_Fin = Range("A" & 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
If Left(Tab_Cells(Compteur2, 1), 1) = "4" 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)
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

Statistiques des forums

Discussions
312 331
Messages
2 087 353
Membres
103 528
dernier inscrit
hplus