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

6classeur2.xlsm (634.85 Ko)

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 :

Spoiler

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.

Rechercher des sujets similaires à "code corriger"