Eliminar filas según su contenido

Entrada núm: 5 of 6 de la serie Editor de programacion

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.

Eliminar filas segun su contenido

 

Series Navigation<< Eliminar filas según criterios múltiplesRecuperar funcionalidad en controles ActiveX por actualización de Office >>

Comments

This post currently has 22 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.

  • Hola Eloy, me podrías ayudar con un problema? al correr la macro, me dice que tengo error “1004”, sabes que podría ser?

    • Es el código de error inespecífico o general. En el caso de esta macro, comprueba que estás siguiendo bien los pasos del video. Con esta información, no puedo afinar más.

  • Perfecto !!

    Y si tuviera que eliminar una columna según un criterio de búsqueda es decir… Si busco la palabra “hola” y si está en la columna A que hago para que me borre toda la columna A.

    De antemano muchas gracias muy útil.

    • La sentencia que hace la selección de la fila previa al borrado es:
      ActiveCell.EntireRow.Select
      que se debería transformar en
      ActiveCell.EntireColumn.Select
      Luego habría que adaptar también el resto de la macro para ese caso particular.
      Por ejemplo, habría que recorrer la selección desde la columna más a la derecha hacia atrás
      En definitiva, hay que cambiar la orientación de la macro y todo lo que yo hago por filas en mi ejemplo, habría que hacerlo por columnas.
      Espero que con estas pistas le sirva para adaptarla. Si le dedica una o dos horas y entiende un poco el lenguaje VBA es cosa hecha.

  • Eloy Caballero
    Muchas gracias por compartir tu ejercicio… tengo uno parecido.
    Sub eliminar()
    Dim f As New Collection
    Sheets(“Hoja1”).Select
    For i = 1 To Range(“A” & Rows.Count).End(xlUp).Row
    If UCase(Cells(i, “M”)) = “BAJA” Then
    f.Add i
    End If
    Next
    For i = f.Count To 1 Step -1
    Rows(f(i)).Delete
    Next
    End Sub

    pero.. ¿Cómo hago para que me elimine únicamente la celda y no toda la fila? y que elimine hacia la izquierda? (celda.Delete Shift:=xlToLeft)

    • Este código lleva varias cosas que nunca he manejado. Es más avanzado que el mío. Si usted no sabe solucionarlo, a mí aún me queda un poco más lejos. Siga probando hasta que dé con la manera.

Deja tu comentario aquí:

Sidebar



A %d blogueros les gusta esto: