Suppresion lignes dans feuille excel
Résolu/Fermé
A voir également:
- Suppresion lignes dans feuille excel
- Aller à la ligne excel - Guide
- Liste déroulante excel - Guide
- Feuille de pointage excel - Télécharger - Tableur
- Si et excel - Guide
- Excel trier par ordre alphabétique en gardant les lignes - Guide
1 réponse
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 751
Modifié par pijaku le 19/08/2011 à 10:43
Modifié par pijaku le 19/08/2011 à 10:43
Bonjour,
1- consulte tes messages privés,
2- Une boucle qui supprime des lignes doit toujours commencer par la dernière ligne et finir à la première, sinon la macro risque d'omettre certaines de ces lignes.
3- Pour obtenir le numéro de la dernière ligne non vide d'une colonne, Voyez cette merveilleuse astuce............
Donc, ton code devient :
OK???
Cordialement,
Franck P
1- consulte tes messages privés,
2- Une boucle qui supprime des lignes doit toujours commencer par la dernière ligne et finir à la première, sinon la macro risque d'omettre certaines de ces lignes.
3- Pour obtenir le numéro de la dernière ligne non vide d'une colonne, Voyez cette merveilleuse astuce............
Donc, ton code devient :
Private Sub ListBox1_Change() Dim Lign As Long, DerniereLigne As Long DerniereLigne = Range("E" & Rows.Count).End(xlUp).Row For Lign = DerniereLigne To 14 Step - 1 'ici on ne mets que les numéros de ligne If Cells(Lign, 5) = "Total CDI 2011" Then Rows(Lign).Delete Next Lign 'Cellule liée à la sélection ds boîte de dialogue Range("$A$2").Value = ListBox1.Value End Sub
OK???
Cordialement,
Franck P
19 août 2011 à 10:45
19 août 2011 à 11:25
C'est fou, j'ai réussi à faire tourner une macro pendant une dizaine de minutes puis sans rien changer depuis, une erreur s'affiche : Incompatibilité de type avec la macro suivante :
Private Sub ListBox1_Change()
Dim i As Long
For i = Range("E65536").End(xlUp).Row To 2 Step -1
If Cells(i, 5) = "Total CDI 2011" Then Rows(i).Delete
Next i
Dim j As Long
For j = Range("E65536").End(xlUp).Row To 2 Step -1
If Cells(j, 5) = "Total CDD 2011" Then Rows(j).Delete
Next j
Dim k As Long
For k = Range("E65536").End(xlUp).Row To 2 Step -1
If Cells(k, 5) = "Total INT 2011" Then Rows(k).Delete
Next k
Dim l As Long
For l = Range("E65536").End(xlUp).Row To 2 Step -1
If Cells(l, 5) = "Total MO 2011" Then Rows(l).Delete
Next l
Dim m As Long
For m = Range("L65536").End(xlUp).Row To 2 Step -1
If Cells(m, 12) = "+ Prov manuelles SAP" Then Rows(m).Delete
Next m
Dim n As Long
For n = Range("E65536").End(xlUp).Row To 2 Step -1
If Cells(n, 5) = "R 2011 SAP" Then Rows(n).Delete
Next n
Dim o As Long
For o = Range("L65536").End(xlUp).Row To 2 Step -1
If Cells(o, 12) = "Taxes fiscales" Then Rows(o).Delete
Next o
'Cellule liée à la sélection ds boîte de dialogue
Range("$A$2").Value = ListBox1.Value
End Sub
Du coup, je vais essayer la tienne sans plus attendre mais aimerais tout de même comprendre pourquoi la macro ne marche plus...
Modifié par pijaku le 19/08/2011 à 11:41
2- pourquoi boucler sur les mêmes lignes autant de fois???
Tu peux le faire en 1 seule boucle :
Si la cellule est égale à ceci ET si la cellule est égale à cela etc... Alors
Par exemple :
Tu y gagnes en temps d'exécution, la boucle ne se fait qu'une seule fois...
3- N'utilises plus des variables à un seul caractère. Une variable doit être explicite. On doit vior au premier coup d'oeil que tu boucles sur des lignes (et non pas des colonnes ou des artichauds)
Dans cette boucle, je remplacerais, perso, les i par des Lign. Tu avoueras que c'est beaucoup plus parlant.
En règle générale, une variable est composée d'au moins 3 caractères et commence par une majuscule. Il est préférable également d'indiquer, dans son nom, le type de variable.
Exemple d'une variable de type String censée représenter des noms de feuilles :
4- Lorsque l'on créé du code en VBA il est également d'usage de l'indenter (mettre des retraits en débuts de lignes pour les boucles, les If End If, less With End With Etc...).
Ainsi :
S'écrit :
OK?
19 août 2011 à 11:50
Private Sub ListBox1_Change()
Dim Lign As Long
For Lign = Range("E65536").End(xlUp).Row To 2 Step -1
If Cells(Lign, 5) = "Total CDI 2011" Then Rows(Lign).Delete
If Cells(Lign, 5) = "Total CDD 2011" Then Rows(Lign).Delete
If Cells(Lign, 5) = "Total INT 2011" Then Rows(Lign).Delete
If Cells(Lign, 5) = "Total MO 2011" Then Rows(Lign).Delete
If Cells(Lign, 12) = "+ Prov manuelles SAP" Then Rows(Lign).Delete
Next Lign
'Cellule liée à la sélection ds boîte de dialogue
Range("$A$2").Value = ListBox1.Value
Il me surligne If Cells(Lign, 5) = "Total CDI 2011" Then
Effectivement, la démarche que tu m'as donné est de loin plus claire !! Les compétences m'ont manqué pour la raccourcir comme tu me l'as proposé.
19 août 2011 à 11:52