Suppresion lignes dans feuille excel

Résolu/Fermé
Mag55 - 19 août 2011 à 10:29
 Mag55 - 19 août 2011 à 11:59
Bonjour,

Je rencontre un petit soucis avec une macro que j'essaie inlassablement de faire tourner. Elle est la suivante :

Private Sub ListBox1_Change()

Dim i As Long
For i = Range("E14") To Range("E1000")
If Cells(i, 5) = "Total CDI 2011" Then Rows(i).Delete
Next i

'Cellule liée à la sélection ds boîte de dialogue
Range("$A$2").Value = ListBox1.Value

End Sub

En fait, j'aimerais qu'à chaque changement de sélection dans ma boîte de dialogue, VBA me supprime la ligne contenant "Total CDI 2011" qui ne peut se trouver qu'en colonne 5.

J'ai réduit la plage de données pour ne pas la faire tourner trop longtemps.

Mais il doit y avoir un soucis quelque part car elle ne fonctionne pas.

J'appelle donc comme d'habitude à vos talents pour me venir en aide!

Merci

A voir également:

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
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 :
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
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
19 août 2011 à 10:45
De plus, ton code étant lancé depuis un UserForm, il vaut mieux, dans tous les cas, préciser le nom de la feuille. Par l'intermédiaire de With End With. Comme ceci :
Private Sub ListBox1_Change()   
Dim Lign As Long, DerniereLigne As Long  
With Sheets("NomDeTaFeuilleEntreGuillemets")
    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 With   
End Sub 
0
Merci Pikaju, j'irai consulter à ma pause.

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...
0
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 à 11:41
1- incompatibilité de type, ça doit être du au contenu ou au format d'une de tes cellules...
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 :
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 
If Cells(i, 5) = "Total CDD 2011" Then Rows(i).Delete  
If Cells(i, 5) = "Total INT 2011" Then Rows(i).Delete 
If Cells(i, 5) = "Total MO 2011" Then Rows(i).Delete  
If Cells(i, 12) = "+ Prov manuelles SAP" Then Rows(i).Delete  
'etc.... 
'tu peux même utiliser l'opérateur OR comme ceci : 
If Cells(i, 5) = "R 2011 SAP" Or Cells(o, 12) = "Taxes fiscales" Then Rows(n).Delete  
Next i 

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 :
Dim StrNomFeuil As String

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 :
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
End If 
Next i 

S'écrit :
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
    End If 
Next i 

OK?
0
J'ai encore droit à des incompabilités de type avec la macro suivante :

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é.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
19 août 2011 à 11:52
Losque la macro buggue, elle te propsoe un "débogage". Clic donc un peu voir sur "débogage" et dis nous qu'elle ligne est surlignée de jaune.
0