Estadísticas de Google Analytics

    generado por GADWP 

    Material registrado:

    Safe Creative #1709190281730

Todo lo que yo sé sobre eliminar filas por condiciones en Excel

Eliminar filas por condiciones en bases de datos

Una tarea frecuente en Excel es la de eliminar ciertas filas (registros en terminología de bases de datos) de una tabla, de acuerdo a que en alguna columna (campo) de esa fila se cumpla determinada condición. Por ejemplo, tenemos esta tabla en una hoja de Excel llamada “HojaControl”:

CargosCifraMaterialesFecha
Capitán50Papel14/05/2019
Jefe62Cartón12/05/2019
Comandante100Metal14/04/2019
Controlador93Papel08/05/2019
Director67Piedra06/05/2019
Empleador15Vidrio04/05/2019
Gobernador37Papel02/05/2019
Gestor43Agua24/04/2019
Señor84Aire28/04/2019

Y queremos eliminar las filas en cuya columina “Materiales” ponga “Papel”  para obtener el siguiente resultado:

CargosCifraMaterialesFecha
Jefe62Cartón12/05/2019
Comandante100Metal14/04/2019
Director67Piedra06/05/2019
Empleador15Vidrio04/05/2019
Gestor43Agua24/04/2019
Señor84Aire28/04/2019

Esta tarea, así en general, se puede enfocar de muchas maneras en Excel. Pero antes de pasar a describirlas, será bueno imaginarnos que la tabla inicial es una base de datos con todas las de la ley que se va a llamar “BASECONTROL”. Digamos que la hemos creado como tal con el software apropiado y una simple sentencia de SQL que tendría este aspecto:

CREATE DATABASE IF NOT EXISTS BASECONTROL;

Dentro de esa base de datos hemos creado una tabla llamada como la hoja de Excel, es decir “HojaControl”, y lo hemos hecho así:

CREATE TABLE IF NOT EXISTS HojaControl

(

id INT,

Cargos TEXT,

Cifra INT,

Materiales TEXT,

Fecha DATE,

) ;

Hemos añadido el campo id, que sería el destinado a alojar la clave primaria y que podría representarse en Excel por el número de fila. En nuestro gestor de bases de datos teclearíamos:

ALTER TABLE HojaControl

ADD PRIMARY KEY (id);

Y una vez preparada la estructura de la base de datos, con su tabla, introduciríamos los datos que contiene. Y lo haríamos más o menos así:

INSERT INTO HojaControl VALUES

(

1, “Capitán”, 50, “Papel”, #14/05/2019#

);
INSERT INTO HojaControl VALUES

(

2, “Jefe”, 62, “Cartón”, #12/05/2019#

);

… Y así hasta completar todos los registros.

Una vez hecho esto, la tarea de conseguir una sub-tabla en la cual no estuvieran incluidos los registros en cuyo campo “Materiales” diga “Papel”, es tremendamente sencilla en SQL. Bastaría con efectuar la siguiente consulta filtrada a la base de datos:

SELECT * FROM HojaControl WHERE Materiales != “Papel”

Eliminar filas por condiciones en Excel

Hay varias posibilidades para realizar esta tarea en una tabla de Excel. En el video que acompaña a este artículo, yo las he analizado según dos grandes capítulos: sin macros y con macros.

Si trabajamos sin macros tenemos dos opciones:

  1. Usar la búsqueda (CTRL+B en español, CTRL+F en inglés) del valor del criterio “Papel” en el rango preseleccionado de la columna “Materiales”, hacer click en la opción “Buscar todas”, seguida de la selección en el cuadro inferior, y luego en las herramientas de celdas elegimos “Eliminar” y después “Eliminar filas de hoja”.
  2. Usar el autofiltro o el filtro avanzado para obtener una lista reducida adaptada a nuestras condiciones.

Si trabajamos con macros las opciones son todas las que la imaginación permita. En el video yo analizo tres de ellas, pero hay que tener en cuenta que son en realidad dos formas de trabajar:

  1. Recorrer la columna del criterio buscando “Papel” y donde lo encontremos, seleccionar la fila y eliminarla. Esto significa que tenemos que trabajar desde la última fila volviento hasta la primera, pues de lo contrario se nos quedarán filas sin eliminar donde haya dos seguidas que digan “Papel”. Este trabajo lo haría la primera de las siguientes macros, la que se llama EliminarFilas1. La segunda de las macros cuyo código adjunto aquí, EliminarFilas2, trabaja con la colección de filas de un rango, y por tanto es también sensible a este error. Cuando aparezcan dos filas seguidas que cumplan el criterio, se saltará la segunda.
  2. Hacer lo mismo pero en lugar de ir eliminando cada correspondencia que encontremos, lo que hacemos es irla añadiendo a un rango creciente que eliminamos al final de todo. Esto evita el problema anterior. Esto lo hacemos con EliminarFilas3.

Estas son las tres macros:

Sub EliminaFilas1()
'Seleccionamos la región de trabajo
Dim i As Integer, nfilas As Integer, qCol As Integer, qCrit As String
nfilas = ActiveSheet.Cells(1, 1).CurrentRegion.Rows.Count
'Introducimos los datos de decisión
qCol = CInt(InputBox("Columna del criterio"))
qCrit = InputBox("Criterio")
'Ejecutamos bucle y acción de borrado
For i = nfilas To 2 Step -1 '¡ Pero tiene que ser hacia atrás !
Cells(i, qCol).Select
If Cells(i, qCol) = qCrit Then
ActiveCell.EntireRow.Select
Selection.Delete
End If
Next i
End Sub
'---------------------------------------------------------------------------------------------
Sub EliminaFilas2()
' Si lo dejamos en Cells(1,1).CurrentRegion.Select da errores
Dim queRango As Range, nFilas As Long
nFilas = Cells(1, 1).CurrentRegion.Rows.Count
'Evito actuar accidentalmente sobre la fila de títulos
' Si lo dejamos en Cells(1,1).CurrentRegion.Select da errores
Set queRango = Cells(1, 1).CurrentRegion.Resize(nFilas - 1, 7).Offset(1, 0)
'queRango.Select
For Each Row In queRango.Rows
'Cambiar las columnas 6 y 7 por las que correspondan
If Row.Cells(6) = 0 Then
'Cambiar la condición del valor 0 por la que corresponda
If Row.Cells(7) = 0 Then
Row.EntireRow.Select
Selection.Delete
'ERROR: Si hay dos filas seguidas, se saltará la segunda al hacer Next Row
End If
End If
Next Row
End Sub
'---------------------------------------------------------------------------------------------
Sub EliminaFilas3()
'Construimos un rango acumulativo basado en que se cumpla la condición en fila
'Seleccionamos la región de trabajo
Dim i As Integer, nfilas As Integer, qCol As Integer, qCrit As String
nfilas = ActiveSheet.Cells(1, 1).CurrentRegion.Rows.Count
'Introducimos los datos de decisión
qCol = CInt(InputBox("Columna del criterio"))
qCrit = InputBox("Criterio")

'Construcción del rango acumulativo
Dim queRangoBorrar As Range
'Inicialización forzada del rango
Set queRangoBorrar = Cells(nfilas + 1, qCol).Rows.EntireRow
For i = 1 To nfilas
If Cells(i, qCol) = qCrit Then
Set queRangoBorrar = Union(queRangoBorrar, Cells(i, qCol).EntireRow
End If
Next i
queRangoBorrar.Select
Selection.Delete
End Sub
'---------------------------------------------------------------------------------------------

Y finalmente aquí les adjunto un videotutorial sobre el tema.

 

Comments

So empty here ... leave a comment!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Sidebar



Si continuas utilizando este sitio, significa que aceptas el uso de cookies. más información

Los ajustes de cookies de esta web están configurados para "permitir cookies" y así ofrecerte la mejor experiencia de navegación posible. Si sigues utilizando esta web sin cambiar tus ajustes de cookies o haces clic en "Aceptar" estarás dando tu consentimiento a esto.

Cerrar