OVH Cloud OVH Cloud

Suppression de lignes

7 réponses
Avatar
Bulgroz
Bonjour à Toutes et Tous,

Je charge mensuellement un fichier conséquent via NetOffice.
J'ai écrit une macro qui me permet de "retravailler" ce fichier.
Elle fonctionne bien. Cependant, afin de supprimer des lignes contenant un
code spécifique en colonne "m", j'ai écrit :

Dim i As Long
For i = Range("m65536").End(xlUp).Row To 7 Step -1
If Range("m" & i) = 64 Then Rows(i).Rows.Delete
Next i

For i = Range("m65536").End(xlUp).Row To 7 Step -1
If Range("m" & i) = 47 Then Rows(i).Rows.Delete
Next i

For i = Range("m65536").End(xlUp).Row To 7 Step -1
If Range("m" & i) = 48 Then Rows(i).Rows.Delete
Next i

For i = Range("m65536").End(xlUp).Row To 7 Step -1
If Range("m" & i) = 58 Then Rows(i).Rows.Delete
Next i

For i = Range("m65536").End(xlUp).Row To 7 Step -1
If Range("m" & i) = 88 Then Rows(i).Rows.Delete
Next i

où : 47,48,58,64 et 88 sont les codes dont la ligne entière doit être
supprimée.

Cela me semble un peu lourd.

Ma demande d'aide est à double détente :

1°) Il y a certainement un moyen qui devrait me permettre de n'effectuer
qu'une seule boucle.
Je ne trouve pas la bonne syntaxe.
Merci de me mettre sur la voie.

2°) La liste de ces codes est appelée à évoluer.
Y a-t-il un moyen "externe" de gérer la liste de ces variables, sachant que
je crée un fichier différent à chaque réception mensuelle.
Merci de vos avis

Matériel : Windows XP - Office XP

Bien amicalement

Michel Péroche

7 réponses

Avatar
docmarti
Bsoir Bulgroz

Voici une façon simple de réaliser cette action.

Sub test()
'où : 47,48,58,64 et 88 sont les codes dont la ligne entière
'doit être supprimée.
'Entrez dans la variable Data les données en les séparant
'par un espace
Data = " 47 48 58 64 88 "
Data = " " & Trim(Data) & " "
For i = Range("m65536").End(xlUp).Row To 7 Step -1
a = " " & Trim(CStr(Range("m" & i).Value)) & " "
If InStr(Data, a) > 0 Then
Rows(i).Rows.Delete
End If
Next i

End Sub

"Bulgroz" wrote in message
news:btq5qe$gi9$
Bonjour à Toutes et Tous,

Je charge mensuellement un fichier conséquent via NetOffice.
J'ai écrit une macro qui me permet de "retravailler" ce fichier.
Elle fonctionne bien. Cependant, afin de supprimer des lignes contenant un

Dim i As Long
For i = Range("m65536").End(xlUp).Row To 7 Step -1
If Range("m" & i) = 64 Then Rows(i).Rows.Delete
Next i

For i = Range("m65536").End(xlUp).Row To 7 Step -1
If Range("m" & i) = 47 Then Rows(i).Rows.Delete
Next i

For i = Range("m65536").End(xlUp).Row To 7 Step -1
If Range("m" & i) = 48 Then Rows(i).Rows.Delete
Next i

For i = Range("m65536").End(xlUp).Row To 7 Step -1
If Range("m" & i) = 58 Then Rows(i).Rows.Delete
Next i

For i = Range("m65536").End(xlUp).Row To 7 Step -1
If Range("m" & i) = 88 Then Rows(i).Rows.Delete
Next i

où : 47,48,58,64 et 88 sont les codes dont la ligne entière doit être
supprimée.

Cela me semble un peu lourd.

Ma demande d'aide est à double détente :

1°) Il y a certainement un moyen qui devrait me permettre de n'effectuer
qu'une seule boucle.
Je ne trouve pas la bonne syntaxe.
Merci de me mettre sur la voie.

2°) La liste de ces codes est appelée à évoluer.
Y a-t-il un moyen "externe" de gérer la liste de ces variables, sachant
que

je crée un fichier différent à chaque réception mensuelle.
Merci de vos avis

Matériel : Windows XP - Office XP

Bien amicalement

Michel Péroche




Avatar
AV
Autre approche avec un filtre auto
(La cellule M6 contient une étiquette de colonne (nécessaire pour le filtre))

Sub zz_Sup_Lg()
Application.ScreenUpdating = False
tabloVal = Array(47, 48, 58, 64, 68)
derL = [M65536].End(3).Row
For i = 0 To 4
Range("M6:M" & derL).AutoFilter Field:=1, Criteria1:=tabloVal(i)
On Error Resume Next 'si valeur non trouvée
Range("M7:M" & derL).SpecialCells(xlCellTypeVisible).EntireRow.Delete
Next
[M6].AutoFilter
End Sub

ou encore, avec un filtre élaboré :

Sub zz_Sup_Lg2()
Application.ScreenUpdating = False
[IV7] = "=OR(M7G,M7H,M7X,M7d,M7h)"
derL = [M65536].End(3).Row
Range("M6:M" & derL).AdvancedFilter Action:=xlFilterInPlace,
CriteriaRange:=[IV6:IV7]
Range("M7:M" & derL).SpecialCells(xlCellTypeVisible).EntireRow.Delete
[IV6:IV7] = ""
ActiveSheet.ShowAllData
End Sub

NB : S'il n'ya pas d'inconvénient à trier croissant ou décroissant la plage
M7:Mx, les méthodes avec filtre(s) sont ultras-rapides

AV
Avatar
Bulgroz
Bonjour Docmarti

Mille mercis, cela fonctionne parfaitement bien.

Ne connaissant rien en maniement de chaîne, peux-tu m'expliquer ce qui se
passe par l'utilisation de cette syntaxe ?
Et surtout, une variable avec 2 noms, c'est pour moi hermétique à défaut
d'être ésotérique
;-))

Merci d'avance

Michel




"docmarti" a écrit dans le message de
news:O9T%236i%
Bsoir Bulgroz

Voici une façon simple de réaliser cette action.

Sub test()
'où : 47,48,58,64 et 88 sont les codes dont la ligne entière
'doit être supprimée.
'Entrez dans la variable Data les données en les séparant
'par un espace
Data = " 47 48 58 64 88 "
Data = " " & Trim(Data) & " "
For i = Range("m65536").End(xlUp).Row To 7 Step -1
a = " " & Trim(CStr(Range("m" & i).Value)) & " "
If InStr(Data, a) > 0 Then
Rows(i).Rows.Delete
End If
Next i

End Sub



Avatar
Bulgroz
Ave AV,

On n'a jamais du te la faire celle-là.
;-))

Mille mercis cela fonctionne parfaitement bien.
Clair, nickel, efficace...

Merci de ton aide.

Bien amicalement

MIchel



"AV" a écrit dans le message de
news:OOenxl$
Autre approche avec un filtre auto
(La cellule M6 contient une étiquette de colonne (nécessaire pour le
filtre))


Sub zz_Sup_Lg()
Application.ScreenUpdating = False
tabloVal = Array(47, 48, 58, 64, 68)
derL = [M65536].End(3).Row
For i = 0 To 4
Range("M6:M" & derL).AutoFilter Field:=1, Criteria1:=tabloVal(i)
On Error Resume Next 'si valeur non trouvée
Range("M7:M" & derL).SpecialCells(xlCellTypeVisible).EntireRow.Delete
Next
[M6].AutoFilter
End Sub

ou encore, avec un filtre élaboré :

Sub zz_Sup_Lg2()
Application.ScreenUpdating = False
[IV7] = "=OR(M7G,M7H,M7X,M7d,M7h)"
derL = [M65536].End(3).Row
Range("M6:M" & derL).AdvancedFilter Action:=xlFilterInPlace,
CriteriaRange:=[IV6:IV7]
Range("M7:M" & derL).SpecialCells(xlCellTypeVisible).EntireRow.Delete
[IV6:IV7] = ""
ActiveSheet.ShowAllData
End Sub

NB : S'il n'ya pas d'inconvénient à trier croissant ou décroissant la
plage

M7:Mx, les méthodes avec filtre(s) sont ultras-rapides

AV




Avatar
docmarti
Bonjour Bulgroz.

La fonction INSTR est l'équivalent en VBA de la fonction TROUVE de Excel.
Donc la fonction InStr(Data, a) indique la position de la chaîne "a" dans la
chaîne "Data".


"Bulgroz" wrote in message
news:btr86k$r74$
Bonjour Docmarti

Mille mercis, cela fonctionne parfaitement bien.

Ne connaissant rien en maniement de chaîne, peux-tu m'expliquer ce qui se
passe par l'utilisation de cette syntaxe ?
Et surtout, une variable avec 2 noms, c'est pour moi hermétique à défaut
d'être ésotérique
;-))

Merci d'avance

Michel




"docmarti" a écrit dans le message de
news:O9T%236i%
Bsoir Bulgroz

Voici une façon simple de réaliser cette action.

Sub test()
'où : 47,48,58,64 et 88 sont les codes dont la ligne entière
'doit être supprimée.
'Entrez dans la variable Data les données en les séparant
'par un espace
Data = " 47 48 58 64 88 "
Data = " " & Trim(Data) & " "
For i = Range("m65536").End(xlUp).Row To 7 Step -1
a = " " & Trim(CStr(Range("m" & i).Value)) & " "
If InStr(Data, a) > 0 Then
Rows(i).Rows.Delete
End If
Next i

End Sub







Avatar
Bulgroz
Merci beaucoup pour ces explications.

Michel


"docmarti" a écrit dans le message de
news:
Bonjour Bulgroz.

La fonction INSTR est l'équivalent en VBA de la fonction TROUVE de Excel.
Donc la fonction InStr(Data, a) indique la position de la chaîne "a" dans
la

chaîne "Data".


"Bulgroz" wrote in message
news:btr86k$r74$
Bonjour Docmarti

Mille mercis, cela fonctionne parfaitement bien.

Ne connaissant rien en maniement de chaîne, peux-tu m'expliquer ce qui
se


passe par l'utilisation de cette syntaxe ?
Et surtout, une variable avec 2 noms, c'est pour moi hermétique à défaut
d'être ésotérique
;-))

Merci d'avance

Michel




Avatar
docmarti
Bienvenue.

"Bulgroz" wrote in message
news:bup97u$6n9$
Merci beaucoup pour ces explications.

Michel


"docmarti" a écrit dans le message de
news:
Bonjour Bulgroz.

La fonction INSTR est l'équivalent en VBA de la fonction TROUVE de
Excel.


Donc la fonction InStr(Data, a) indique la position de la chaîne "a"
dans


la
chaîne "Data".


"Bulgroz" wrote in message
news:btr86k$r74$
Bonjour Docmarti

Mille mercis, cela fonctionne parfaitement bien.

Ne connaissant rien en maniement de chaîne, peux-tu m'expliquer ce
qui



se
passe par l'utilisation de cette syntaxe ?
Et surtout, une variable avec 2 noms, c'est pour moi hermétique à
défaut



d'être ésotérique
;-))

Merci d'avance

Michel