Code à corriger
bonjour le forum,
j'ai écrit ce code en m'inspirant de contributions sur le site mais ça ne rapporte pas les résultats attendus.
je sollicite donc votre expertise pour le corriger et me dire ou j'ai péché.
ThisWorkbook.Worksheets("Données").Cells.Copy ThisWorkbook.Worksheets("Feuil1").Cells
Range("U1").Value = "=93/100"
Dim i As Integer
For i = 4 To Range("D65536").End(xlUp).Row
If Cells(i, 4) <> 5 Then Rows(i).Delete
Next i
il s'agit de copier la feuille 'données' sur la 'feuil1' et supprimer les lignes entières, toujours sur 'feuil1', à partir de la ligne 4, si le chiffre en colonne D est différend de 5.
merci d'avance pour votre aide.
Moutchec
Bonjour,
Essaye le code suivant à la place :
Private Sub Worksheet_Activate()
ThisWorkbook.Worksheets("Données").Cells.Copy ThisWorkbook.Worksheets("Feuil1").Cells
Range("U1").Value = "=93/100"
Dim derlig, i As Integer
derlig = Range("D65536").End(xlUp).Row
For i = derlig To 4 Step -1
If Cells(i, 4).Value <> 5 Then
Cells(i, 4).EntireRow.Delete
End If
Next i
End Sub
Étant donné que tu supprimes des lignes, il faut parcourir la plage de bas en haut. Sinon la macro saute des lignes
Exemple : la valeur de D10 est différente de 5 => la macro supprime la ligne 10 et passe à la ligne 11 => OR la ligne 11 est remontée en postion 10... et ne sera donc pas controlée. Je ne sais pas si je suis suffisamment clair
EDIT :
Ca devrait aussi marcher sans définir derlig et en indiquant simplement
For i = Range("D65536").End(xlUp).Row to 4 Step - 1
comme tu l'avais fais
bonjour et merci pour votre réponse et les explications.
sincères salutations.
Moutchec.
Bonjour,
Je n'ai pas ouvert ton fichier (au bureau j'ai Excel 2003).
Cela étant, je pense que le problème vient de la boucle For Next.
En effet, en supposant que la boucle tourne de la ligne 4 à la ligne 14.
Au premier tour i vaut 4: Si la valeur de la cellule D4=5 alors rien ne se passe
et alors i est incrémenté de 1 et vaut 5.
Si D5<>5 alors tu supprimes la ligne. Le problème de la suppression c'est que ce qui est en dessous remonte.
La ligne 6 devient la 5, mais comme ta boucle incrément à nouveau de 1, alors I vaut 6
La ligne qui était auparavant 6 est devenue 5 et du coup elle est "oubliée" puisque nous sommes maintenant en ligne 6.
Je suggère une autre structure itérative comme Do until ...Loop qui tourne jusqu'à arriver sur une cellule vide.
Exemple:
Sub Test()
Sheets("Données").Select
Cells.Select
Selection.Copy
Sheets("Feuil1").Select
Derligne = Range("D65536").End(xlUp).Row
Cells.Select
ActiveSheet.Paste
Range("U1").Value = "=93/100"
Range("D4").Select
Do Until IsEmpty(ActiveCell)
If ActiveCell.Value <> 5 Then
Rows(ActiveCell.Row).Delete 'reste sur la ligne courante
Else
ActiveCell.Offset(1, 0).Select 'passe à la ligne suivante
End If
Loop
End Sub
Bon courage !
bonjour @GNIN,
merci bcp.