Eliminar filas según su contenido

La tarea de hoy: eliminar filas según su contenido en Excel. A partir de un registro de entradas, tenemos que hacer copia de la hoja que lo contiene. Una vez realizada esta copia, hay que limpiar el registro de acuerdo al contenido de una de sus columnas y según el siguiente criterio: aquellas filas cuyo contenido en la columna de referencia sea nulo, serán eliminadas. Por ejemplo, si la columna que contiene los valores de referencia es la “G”, realizaremos la copia y luego eliminaremos todas las filas cuyo contenido en la columna “G” sea vacío o nulo. En primer lugar realizamos la tarea manualmente y después la automatizamos con una macro en VBA.

Este es el código de la macro en VBA que ejecuta el trabajo de la forma más general posible: nos pide la columna que contiene el criterio y la información exacta que se habrá de chequear, antes de proceder a la eliminación de la fila. Lo más importante de esta macro es la forma en la que funciona el bucle hacia atrás. Si borrásemos filas con un bucle hacia adelante, el resultado no sería el esperado.

Declaración explícita de variables en VBA

No hemos declarado las variables qCol y qCrit con su sentencia Dim. Esto es posible mientras no tengamos Option Explicit declarado en la cabecera del módulo. No es una práctica de programación recomendable, por razones de optimización de memoria y algunas más. Pero en casos tan sencillos como este y cuando el propósito es ilustrativo, es suficiente.

 

Comments

This post currently has 15 responses

  • Hola Eloy:
    Primero de todo felicitarte por tu blog y tus lecciones.
    He intentado implementar la macro de Eliminar Filas según su Contenido y me encuentro con lo siguiente:
    – El criterio para eliminar filas es que el valor sea =0 en la columna C. El valor es numérico con formato de dos decimales.
    – Introduzco 0 (cero) en el Inputbox de qCrit.
    – La macro se ejecuta pero no elimina ninguna fila.

    La he ejecutado en modo depuración, y veo que al comparar el valor de la celda con qCrit está evaluando 0=”0″. Es decir, deduzco que está comparando el valor 0 con la cadena 0, las cuales no son iguales y por tanto no realiza inguna eliminación.
    ¿me puedes indicar cómo resolverlo sin perder la generalización de la macro?

    Muchas gracias.
    Juan Carlos

    • Tienes razón. El inputbox va a tomar el valor como cadena de caracteres. Si estás operando con valores numéricos, deberás convertir la entrada a número: qCrit = CDbl(InputBox(“Criterio”))

  • a mi me aparece un error en Cells(i, G3).Select en este caso yo quiero eliminar de la columna G las celdas que contienen #N/A ya esta comvertido en texto

    Dim i As Integer, nfilas As Integer
    nfilas = ActiveSheet.Cells(1, 1).CurrentRegion.Rows.Count

    ‘qCol = InputBox(“Columna del criterio”)
    ‘qCrit = InputBox(“Criterio”)

    For i = nfilas To 2 Step -1

    Cells(i, G3).Select
    If Cells(i, “G”) = “*#N/A*” Then
    ActiveCell.EntireRow.Select
    Selection.Delete
    End If
    Next i

  • a mi tambien me aparece un error en la sentencia If Cells(i, qCol) = qCrit Then
    igual que Fernando, introduzco como critierio #N/A.

    Quiero que me elimine toda las filas que contienen #N/A

    • El valor #N/A dentro de una celda, se lee como mensaje de error desde VBA y va a devolver un error interno en tiempo de ejecución. Esta aproximación no sirve para celdas que contienen errores. Habría que transformar previamente los errores en valores que el entorno VBA pudiera leer. Por ejemplo, la función =TIPO.DE.ERROR() devuelve 7 para el error #N/A, cosa que VBA ya si que puede leer.

  • Hola Eloy; a mi me funciono correctamente sin embargo mi duda es que pasa si no quiero que la macro pregunte la columna ni el criterio ya que la quiero usar con las mismas condicionantes siempre.

    Es decir no quiero utilizar el InputBox y en su lugar dejar definida la columna y el criterio.

    Gracias Saludos.

    • Me parece que quedaría así:

      ‘Despues eliminamos las filas cuya columna G tenga contenido
      Dim i As Integer, nfilas As Integer
      nfilas = ActiveSheet.Cells(1, 1).CurrentRegion.Rows.Count

      qCrit = “MXREPARO-HGM”

      For i = nfilas To 2 Step -1
      Cells(i, “C”).Select
      If Cells(i, “C”) = qCrit Then
      ActiveCell.EntireRow.Select
      Selection.Delete
      End If
      Next i
      End Sub

          • No debería haber problema con un dato tipo fecha. Si quiere seleccionar las celdas cuya fecha sea mayor a la de hoy, tendría que cambiar la condición que impone el signo = por la de >. Esa linea de código quedaría algo así como:
            If Cells(i, qCol) > qCrit Then…
            Donde en qCrit se habría introducido la fecha correspondiente al día de hoy.

    • En ese caso elimine o comente (ponga un asterisco delante de) las dos sentencias que empiezan con inputbox y después, dentro del código, cambie qCol por el número de la columna y qCrit por el valor de tu criterio. Por ejemplo si su columna es la C, cambie qCol por 3, y si su criterio es Enviado, cambie qCrit por “Enviado”.

  • Un Favor tengo problemas con unos datos , donde no se el rango de celdas a usar (varian el rango aunque puedo determinarlo con el mouse), luego debo eliminar filas en las cuales mas de cuatro columnas son iguales (pueden ser de 1 hasta n las filas repetidas), por favor si me pueden ayudar, gracias ya que se me complico bastante, gracias

    • En mi opinión es un problema complejo. Requiere estudio cuidadoso con el archivo a la vista. Yo le recomiendo que busque un consultor en su zona y le pida presupuesto.

Deja tu comentario aquí:

Sidebar



A %d blogueros les gusta esto: