Eliminar filas que no contengan el texto de la celda ah1
Les comento la macro que preciso:
Quisiera eliminar todas las filas que no contengan el texto de la celda ah1, pero a partir de la fila 4 inclusive.
¿Se puede hacer eso con una macro?
2 respuestas
¿Pero en cuál columna se debe verificar si existe el texto de la celda AH1?
¿O qué verifique en todas las columnas de la fila?
Te anexo las 2 opciones, la primera busca en toda la fila, si no encuentra el dato borra la fila:
Sub Eliminar_Diferentes() 'Por.Dante Amor dato = Range("AH1") If dato = "" Then MsgBox "Ingresa un dato en AH1" Exit Sub End If ' For i = ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row To 4 Step -1 Set b = Rows(i).Find(dato, LookAt:=xlWhole) If b Is Nothing Then Rows(i).Delete Next MsgBox "Fin" End Sub
La siguiente opción solamente busca en la columna "D", de igual manera, si no encuentra el dato, entonces borra la fila. Cambia la "D" por la columna que desees.
Sub Eliminar_Diferentes2() 'Por.Dante Amor dato = Range("AH1") If dato = "" Then MsgBox "Ingresa un dato en AH1" Exit Sub End If ' For i = ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row To 4 Step -1 If Cells(i, "D") <> dato Then Rows(i).Delete Next MsgBox "Fin" End Sub
Sigue las Instrucciones para un botón y ejecutar la macro
- Abre tu libro de Excel
- Para abrir Vba-macros y poder pegar la macro, Presiona Alt + F11
- En el menú elige Insertar / Módulo
- En el panel del lado derecho copia la macro
- Ahora para crear un botón, puedes hacer lo siguiente:
- Inserta una imagen en tu libro, elige del menú Insertar / Imagen / Autoformas
- Elige una imagen y con el Mouse, dentro de tu hoja, presiona click y arrastra el Mouse para hacer grande la imagen.
- Una vez que insertaste la imagen en tu hoja, dale click derecho dentro de la imagen y selecciona: Tamaño y Propiedades. En la ventana que se abre selecciona la pestaña: Propiedades. Desmarca la opción “Imprimir Objeto”. Presiona “Cerrar”
- Vuelve a presionar click derecho dentro de la imagen y ahora selecciona: Asignar macro. Selecciona: Eliminar_Diferentes
- Aceptar.
- Para ejecutarla dale click a la imagen.
.
'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias
.
Avísame cualquier duda
.
Gracias Dante, tus macros funcionan bien .
La primera tarde 7 minutos en ejecutarse y la segunda 5 minutos.
Perdón, ¿pero habría una forma de que sea más rápido el proceso..?
(Sera que revisa todas las filas del libro por eso se demora, con que revise hasta la fila 2000, para mi estaría bien.)
Utiliza la siguiente:
Sub Eliminar_Diferentes2() 'Por.Dante Amor dato = Range("AH1") If dato = "" Then MsgBox "Ingresa un dato en AH1" Exit Sub End If ' For i = 2000 To 4 Step -1 If Cells(i, "AH") <> dato Then Rows(i).Delete Next MsgBox "Fin" End Sub
El tiempo de proceso depende de la capacidad de tu equipo, procesador, versiones, memoria, etc. Te sugiero que cierres las demás aplicaciones y solamente utilices excel para realizar la ejecución.
.
'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias
.
Perdón no quiero parecer molesto, ¿pero sigue tardando 5 minutos . sera porque me muestra cuando va eliminando fila por fila?
Lo probé dejando solo en uso el excel ( tengo windows 7- 64bit - intel core i5 - 3,50 hz - 8 gb ram)
No es ninguna molestia, me faltó agregar la instrucción Screenupdating, prueba con la siguiente
Sub Eliminar_Diferentes2() 'Por.Dante Amor Application.ScreenUpdating = False dato = Range("AH1") If dato = "" Then MsgBox "Ingresa un dato en AH1" Exit Sub End If ' For i = 2000 To 4 Step -1 If Cells(i, "AH") <> dato Then Rows(i).Delete Next Application.ScreenUpdating = True MsgBox "Fin" End Sub
.
'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias
.
Dante, gracias de nuevo, pero lo probé y sigue tardando más de 5 minutos...
Y también le agregue
(Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False)
e igualmente tarda los mismo
Sub Eliminar_Diferentes2() 'Por.Dante Amor Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.EnableEvents = False ActiveSheet.DisplayPageBreaks = False dato = Range("AH1") If dato = "" Then MsgBox "Ingresa un dato en AH1" Exit Sub End If ' For i = 2000 To 4 Step -1 If Cells(i, "AH") <> dato Then Rows(i).Delete Next MsgBox "Fin" Application.EnableEvents = True Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic ActiveSheet.DisplayPageBreaks = True Application.CutCopyMode = False End Sub
Dante, Elsa matilde me dice si vos podes;
Desarrollar una macro para filtrar por la col AH y luego eliminar las filas ...
Porque ella no tiene tiempo porque se va y vuelve el jueves..
Pero la macro funciona, el tema del tiempo lo podemos revisar con todo gusto, pero igual deberías valorar la respuesta.
Hice una prueba con mi macro para 6,000 registros y la respuesta es inmediata (2 segundos)
El problema está en tu hoja o en tu archivo.
Con mucho gusto te ayudo a revisar tu archivo, valora esta respuesta y crea una nueva pregunta en el tema de microsoft Excel. En el desarrollo de la pregunta escribe: "para Dante Amor". Ahí me describes la ayuda que requieres para revisar tu archivo.
Sal u dos
- Compartir respuesta
Te dejo una macro para esto. Debes entrar al Editor, insertar un módulo y allí la copiarás.
Sub quitaFilas() 'x Elsamatilde 'recorre la col A hasta encontrar celda vacía = fin de rango [A4].Select While ActiveCell <> "" 'se busca el dato de AH1 en toda la fila activa Set busco = Range("A" & ActiveCell.Row).EntireRow.Find(What:=[AH1], After:=ActiveCell, LookIn:=xlFormulas, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False) 'si el dato no se encuentra en la fila se la elimina, sino se pasa a la fila siguiente If busco Is Nothing Then ActiveCell.EntireRow.Delete Else ActiveCell.Offset(1, 0).Select End If Wend End Sub
Se busca en la fila completa.... si solo debe buscar en un rango avisame para ajustarla.
Para ejecutarla podés dibujar un botón, un atajo de teclado o directamente desde el menú Macros. Este tema lo tengo explicado en la sección Macros de mi sitio.
Sdos.
Elsa
Gracias elsa tu macro funciona bien, pero tarda mucho el proceso, ¿si simplificamos la busque a una sola columna( AH) seria más rápido?
Si claro. Ahora se busca en toda la fila por no contar con más información de tu parte... aquí va ahora controlando solo la col AH.
El fin de rango lo sigue marcando la col A... pero esto también podés cambiarlo por la col que tenga celdas con datos hasta el final de la tabla.
Sub quitaFilas() 'x Elsamatilde 'recorre la col A hasta encontrar celda vacía = fin de rango [AH4].Select While Range("A" & ActiveCell.Row) <> "" 'se busca el dato de AH1 en la col AH de la fila activa Set busco = Range("AH" & ActiveCell.Row).Find(What:=[AH1], After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= _ False, SearchFormat:=False) 'si el dato no se encuentra en la fila se la elimina, sino se pasa a la fila siguiente If busco Is Nothing Then ActiveCell.EntireRow.Delete Else ActiveCell.Offset(1, 0).Select End If Wend End Sub
Sdos y no olvides valorar esta respuesta si el tema queda resuelto, sino comenta y lo seguimos tratando.
Elsa
OK ELSA ; ahora lo hizo más rápido tardo 5 minuto.
Pero la pregunta sería hay posibilidad que sea más rápido.( Las filas que recorre son 2000.)
Desde ya muchas gracias por tu colaboración
Oh qué pena Pablo, todas las aclaraciones vienen con cuentagotas, jajaja.
¿Podrías enviarle las aclaraciones a Dante que también ingresó a responderte?
Que te desarrolle la macro para filtrar x la col AH y luego eliminar las filas ... no tengo nada de tiempo para ocuparme hoy de esto... disculpa ! ! Regreso el jueves... y si aún no la tenés resuelta te la envío con mucho gusto.
Sdos!
- Compartir respuesta