Supprimez des cellules à l’aide d’un « For Each... » Boucle Next » dans Excel

Résumé

Microsoft Excel 2002 et versions ultérieures d’Excel suppriment les cellules d’un élément « Pour chaque... Suivant » boucle d’une manière différente de Celle de Microsoft Excel 97 et des versions antérieures d’Excel.

Cet article décrit les différences et fournit un exemple de macro Visual Basic pour Applications qui montre comment supprimer des cellules dans une boucle.

Informations supplémentaires

Microsoft fournit des exemples de programmation à titre d’illustration uniquement, sans garantie expresse ou implicite. Cela inclut, sans y être limité, les garanties implicites de commercialisation et d’adaptation à un but en particulier. Cet article considère que vous connaissez le langage de programmation présenté et les outils utilisés pour créer et déboguer des procédures. Les ingénieurs du support Microsoft peuvent expliquer la fonctionnalité d’une procédure en particulier. Toutefois, ils ne modifieront pas ces exemples pour fournir des fonctionnalités supplémentaires ou créer des procédures répondant à vos besoins spécifiques.

Exemple de données

Pour utiliser la macro de cet article, tapez les exemples de données suivants dans une feuille de calcul :

A1: a B1: 1
A2: b B2: 2
A3: x B3: 3
A4: x B4: 4
A5: c B5: 5
A6: x B6: 6
A7: d B7: 7
A8: x B8: 8
A9: x B9: 9
A10: e B10: 10

Exemple de macro

Dans un nouveau module de macro, tapez la macro suivante.

Sub DeleteCells()

     'Loop through cells A1:A10 and delete cells that contain an "x."
     For Each c in Range("A1:A10")
        If c = "x" Then c.EntireRow.Delete
    Next

End Sub

Comportement de l’exemple de macro dans Excel 2002 et dans les versions ultérieures d’Excel

Lorsque vous exécutez la macro DeleteCells dans Excel 2002 et dans les versions ultérieures d’Excel, seules les lignes 3, 6 et 8 sont supprimées. Bien que les lignes 4 et 9 contiennent un « x » dans la colonne A, la macro ne supprime pas les lignes. Les résultats de la macro sont les suivants :

A1: a B1: 1
A2: b B2: 2
A3: x B3: 4
A4: c B4: 5
A5: d B5: 7
A6: x B6: 9
A7: e B7: 10

Lorsque Microsoft Excel supprime la ligne 3, toutes les cellules se déplacent d’une ligne vers le haut. Par exemple, la cellule A3 suppose le contenu de la cellule A4, la cellule A4 suppose le contenu de la cellule A5, et ainsi de suite. Après le for each... La boucle suivante évalue une cellule, elle évalue la cellule suivante ; par conséquent, lorsque les cellules sont décalées, elles peuvent être ignorées par la boucle.

Comportement de l’exemple de macro dans Microsoft Excel 5.0 et Microsoft Excel 7.0

Lorsque vous exécutez la macro DeleteCells dans Excel 5.0 et dans Excel 7.0, la macro supprime toutes les lignes qui contiennent un « x ». Les résultats de la macro sont les suivants :

A1: a B1: 1
A2: b B2: 2
A3: c B3: 5
A4: d B4: 7
A5: e B5: 10

Lorsque la ligne 3 est supprimée, toutes les cellules se déplacent d’une ligne vers le haut. Ensuite, la cellule A3 suppose le contenu de la cellule A4, la cellule A4 suppose le contenu de la cellule A5, et ainsi de suite.

Toutefois, contrairement au comportement de la boucle dans Excel 2002 et dans les versions ultérieures d’Excel, lorsque le « For Each... Suivant » boucle évalue une cellule dans Excel 5.0 et dans Excel 7.0, la boucle réévalue la cellule si elle est supprimée dans la boucle. Par conséquent, les cellules ne sont pas ignorées.

Utilisez la macro suivante lorsque vous souhaitez utiliser une boucle pour supprimer des cellules :

Sub DeleteCells2()

     Dim rng As Range
     Dim i As Integer, counter As Integer
    
     'Set the range to evaluate to rng.
     Set rng = Range("A1:A10")
    
     'initialize i to 1
     i = 1
    
     'Loop for a count of 1 to the number of rows
     'in the range that you want to evaluate.
     For counter = 1 To rng.Rows.Count
    
          'If cell i in the range contains an "x",
           'delete the row.
           'Else increment i
            If rng.Cells(i) = "x" Then
                rng.Cells(i).EntireRow.Delete
            Else
                i = i + 1
            End If
    
     Next

End Sub

Les résultats de cette macro dans toutes les versions d’Excel sont les suivants :

A1: a B1: 1
A2: b B2: 2
A3: c B3: 5
A4: d B4: 7
A5: e B5: 10

Méthode supplémentaire pour l’utilisation d’une boucle pour supprimer des cellules

Il s’agit d’une autre méthode que la méthode présentée ci-dessus. Cette méthode produit les mêmes résultats.

 Sub DeleteCells3()

     Dim rng As Range, i As Integer

     'Set the range to evaluate to rng.
     Set rng = Range("A1:A10")

     'Loop backwards through the rows
     'in the range that you want to evaluate.
     For i = rng.Rows.Count To 1 Step -1
    
             'If cell i in the range contains an "x", delete the entire row.
             If rng.Cells(i).Value = "x" Then rng.Cells(i).EntireRow.Delete
     Next

End Sub