Eliminar celdas mediante un "Para cada... Siguiente" bucle en Excel
Artigo
Aplícase a:
Microsoft Office Excel 2007, Microsoft Office Excel 2003, Microsoft Office Excel 2002, Excel 97
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:
asciidoc
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.
VB
Sub DeleteCells()
'Loop through cells A1:A10 and delete cells that contain an "x."ForEach c in Range("A1:A10")
If c = "x"Then c.EntireRow.Delete
NextEndSub
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:
asciidoc
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:
asciidoc
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.
Método recomendado para usar un bucle para eliminar celdas
Use la siguiente macro cuando desee usar un bucle para eliminar celdas:
VB
Sub DeleteCells2()
Dim rng As Range
Dim i AsInteger, counter AsInteger'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 = 1To rng.Rows.Count
'If cell i in the range contains an "x",'delete the row.'Else increment iIf rng.Cells(i) = "x"Then
rng.Cells(i).EntireRow.Delete
Else
i = i + 1EndIfNextEndSub
Los resultados de esta macro en todas las versiones de Excel son los siguientes:
asciidoc
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.
VB
Sub DeleteCells3()
Dim rng As Range, i AsInteger'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 To1Step-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
NextEndSub
Obtenga una certificación de Microsoft Office Specialist (MOS) para demostrar que tiene las habilidades necesarias para sacar el máximo partido de Excel 2016.