Eliminar celdas mediante un "Para cada... Siguiente" bucle en Excel

Resumen

Microsoft Excel 2002 y versiones posteriores de Excel eliminan celdas en un elemento "For Each... Siguiente" bucle de una manera diferente de Microsoft Excel 97 y versiones anteriores de Excel.

En este artículo se describen las diferencias y se proporciona un ejemplo de macro de Visual Basic para Aplicaciones que muestra cómo eliminar celdas en un bucle.

Más información

Microsoft proporciona ejemplos de programación con fines ilustrativos únicamente, sin ninguna garantía, ya sea expresa o implícita. Esto incluye, entre otras, las garantías implícitas de comerciabilidad e idoneidad para un fin determinado. Se considera que está familiarizado con el lenguaje de programación que se muestra y con las herramientas para crear y depurar procedimientos. Los ingenieros de soporte técnico de Microsoft pueden explicarle la funcionalidad de un determinado procedimiento. Sin embargo, no modificarán estos ejemplos para proporcionar una funcionalidad adicional o procesos de construcción para que se cumplan sus requisitos específicos.

Datos de ejemplo

Para usar la macro de este artículo, escriba los siguientes datos de ejemplo en una hoja de cálculo:

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

Macro de ejemplo

En un nuevo módulo de macro, escriba la siguiente macro.

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

Comportamiento de la macro de ejemplo en Excel 2002 y en versiones posteriores de Excel

Al ejecutar la macro DeleteCells en Excel 2002 y en versiones posteriores de Excel, solo se eliminan las filas 3, 6 y 8. Aunque las filas 4 y 9 contienen una "x" en la columna A, la macro no elimina las filas. Los resultados de la macro son los siguientes:

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

Cuando Microsoft Excel elimina la fila 3, todas las celdas se mueven hacia arriba una fila. Por ejemplo, la celda A3 asume el contenido de la celda A4, la celda A4 asume el contenido de la celda A5, etc. Después de para cada... El siguiente bucle evalúa una celda, evalúa la celda siguiente; por lo tanto, cuando se desplazan las celdas, el bucle puede omitirlas.

Comportamiento de la macro de ejemplo en Microsoft Excel 5.0 y Microsoft Excel 7.0

Al ejecutar la macro DeleteCells en Excel 5.0 y en Excel 7.0, la macro elimina todas las filas que contienen una "x". Los resultados de la macro son los siguientes:

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

Cuando se elimina la fila 3, todas las celdas se mueven hacia arriba una fila. A continuación, la celda A3 asume el contenido de la celda A4, la celda A4 asume el contenido de la celda A5, etc.

Sin embargo, a diferencia del comportamiento del bucle en Excel 2002 y en versiones posteriores de Excel, cuando "For Each... El bucle Siguiente" evalúa una celda en Excel 5.0 y, en Excel 7.0, el bucle vuelve a evaluar la celda si se elimina en el bucle. Por lo tanto, las celdas no se omiten.

Use la siguiente macro cuando desee usar un bucle para eliminar celdas:

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

Los resultados de esta macro en todas las versiones de Excel son los siguientes:

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

Método adicional para usar un bucle para eliminar celdas

Se trata de un método alternativo al método que se muestra anteriormente. Este método genera los mismos resultados.

 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