Saltar al contenido

Macro para filtrar via textbox no funciona con nº y fechas


Recommended Posts

publicado

Hola a todos.

Estoy creando una tabla que me permita filtrar su contenido utilizando una lista desplegable para seleccionar la columna a filtrar y una caja de texto para el criterio. Hh logrado que funcione para todo menos para fechas y números. Lo de las fechas entiendo que puede deberse a la forma que excel las almacena, pero lo de los números me tiene confundido. He intentado definir la variable para el criterio (crit) como variant o sencillamente no definirla, pero el problema persiste.

Este es el código que tengo para filtrar (Corre cuando se le da a enter en la caja de texto)

Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then

Crit = TextBox1.Value
Application.ScreenUpdating = False
ActiveSheet.Unprotect
ActiveSheet.ListObjects("Tabla2").Range.AutoFilter Field:=Range("B2"), Criteria1:= _
"*" & Crit & "*", Operator:=xlAnd
Application.ScreenUpdating = True
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowFiltering:=True
End If
End Sub[/CODE]

Gracias de antemano.

Saludos.

Adjunto el archivo de la tabla

Tabla General (Nueva) (Combobox).rar

publicado

Hola prueba así:

Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then
Dim Crit As Variant
Crit = TextBox1.Value
If IsNumeric(Crit) Then Crit = Format(Crit, "##,###,###")
Application.ScreenUpdating = False
ActiveSheet.Unprotect
ActiveSheet.ListObjects("Tabla2").Range.AutoFilter Field:=Range("B2"), Criteria1:= _
"=" & Crit, Operator:=xlAnd
Application.ScreenUpdating = True
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowFiltering:=True
End If
End Sub[/CODE]

Salu2

publicado

Hola, Riddle.

Gracias por tu pronta respuesta.

Sigue sin funcionar. Además, con el código que propones, no funciona ni siquiera con el texto. Con el código que tenía originalmente funcionaba perfecto con texto. Me interesa tener comodines al principio y al final del criterio para poder buscar coincidencias entre el texto contenido en las celdas.

Saludos.

publicado

A mi si me funciona, bueno intenta con este:

Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then
Dim Crit As String
Crit = TextBox1.Value
If IsDate(Crit) Then Crit = Format(Crit, "dd/mm/yyyy"): Crit = "=" & Crit: a = 1
If IsNumeric(Crit) Then Crit = Format(Crit, "##,###,###"): Crit = "=" & Crit: a = 1
If Not a = 1 Then Crit = "=*" & Crit & "*"
Application.ScreenUpdating = False
ActiveSheet.Unprotect
ActiveSheet.ListObjects("Tabla2").Range.AutoFilter Field:=Range("B2"), Criteria1:= _
Crit, Operator:=xlAnd
Application.ScreenUpdating = True
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowFiltering:=True
End If
End Sub[/CODE]

Salu2

Tabla General (Nueva) (Combobox).zip

publicado

Tampoco, Riddle. Con ese código filtra texto, pero no números ni fechas. Funciona igual que el que tenía. ¿Será un problema de configuración del libro? Aunque no le he cambiado nada.

publicado

Como te comente a mi me funciona sin problemas, te dejo un GIF para que compruebes lo que digo.

Recuerda que primero debes seleccionar la columna a filtrar y después colocar los datos.

Salu2

post-143023-145877009542_thumb.gif

publicado

Me parece bien raro. Cuando filtro texto funciona bien, pero con los números o las fechas esconde todas las filas, como si no existiese el valor que busco. ¡Ni siquiera dándole formato de texto lo encuentra!

Gracias de todas maneras, Riddle. Veré qué puedo hacer.

publicado
Me parece bien raro. Cuando filtro texto funciona bien, pero con los números o las fechas esconde todas las filas, como si no existiese el valor que busco. ¡Ni siquiera dándole formato de texto lo encuentra!.

Si conviertes los números o fechas a texto no te filtrara nada, es por eso que no te funcionaba desde un principio, como puedes ver en el código pongo la condición de que si es una fecha lo que esta en el textbox1 se aplicara el formato de "dd/mm/yyyy" y ademas se aplicara el formato de filtro adecuado para la fecha, lo mismo si detecta que es un valor numérico, el formato de texto lo debes usar solo para buscar texto no fechas ni números.

Como viste en el Gif que te deje funciona sin problemas, introduzco las fechas como 04/09/13 y los números como un entero "22833256". Ademas debes limpiar todo el textbox antes de introducir otro valor ya que de lo contrario estarías filtrando un rango ya filtrado y no te mostraría ningún valor.

Salu2

publicado

Tengo todo eso claro, Riddle. Yo mismo programé el textbox para que eliminara los filtros al limpiarlo. El formato de texto se lo di esta vez solo para probar si cambiaba algo. Entiendo lo que hace el código que propones, pero algo pasa en el computador o en la configuración de Excel que no encuentra los valores cuando son números o fechas. De hecho, tengo el mismo código que tenía originalmente en otro formato que ya tengo en uso que sí encuentra cualquier valor, independientemente de su formato y sin preformatear los valores del textbox1 como lo hace tu código.

Me surgió una duda. Me doy cuenta que si cambio el formato de los valores, los cambios no son visibles a menos que edite la celda y salga. Traté haciendo Application.EnableEvents = True y Application.ScreenUpdating = true para ver si es que en alguna parte del resto de los códigos lo dejaba en false, pero nada.

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

  • 109 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      187
    • Comentarios
      97
    • Revisiones
      29

    Más información sobre "Un juego del Rabino en Excel"
    Última descarga
    Por pegones1

    2    1

  • Crear macros Excel

  • Mensajes

    • Que tal nuevamente,  adjunto una solución alternativa: =MAX(A:.A)-BYROW(F4:.AK20,LAMBDA(r,BUSCAR(2,1/(r=0),F3:.AK3))) Cabe mencionar que esta solución requiere funciones nuevas como RECORTAR.RANGO. CONTADOR FINAL (Solucion).xlsb
    • Buenos días,  espero se encuentren bien de salud compañeros, Favor me podrían ayuda con lo siguientes como se podría hacer cuando tengo una tabla dinámica que  amedida que se aumente las columnas fechas con data un formula que se coloco al final busque o analice siempre la ultima fila y columna de la fecha. Coloco un ejemplo
    • @JSDJSD Excelentes, GRACIAS POR TU SOPORTE , me ayudo demasiado es exactamente lo que quería. 5 ESTRELLAS
    • 'Opción 1 Sub FiltrarSKUPorFecha(): Application.ScreenUpdating = False Dim ultimaFila As Long, fila As Long Dim diccionarioSKU As Object Dim listaEliminar As Object Dim fechaActual As String, fechaSiguiente As String Dim f As Variant With Sheets("Consolidado") ultimaFila = .Cells(.Rows.Count, 1).End(xlUp).Row ' Crear diccionarios para comparar SKU y almacenar filas a eliminar Set diccionarioSKU = CreateObject("Scripting.Dictionary") Set listaEliminar = CreateObject("Scripting.Dictionary") ' Recorrer desde la primera fila hasta la penúltima For fila = 2 To ultimaFila - 1 fechaActual = .Cells(fila, 1).Value fechaSiguiente = .Cells(fila + 1, 1).Value ' Solo comparar la fecha actual con la siguiente (inmediatamente superior) If fechaActual <> fechaSiguiente Then diccionarioSKU.RemoveAll ' Limpiar el diccionario antes de llenarlo ' Guardar los SKU de la fecha siguiente (solo de la siguiente) For f = fila + 1 To ultimaFila If .Cells(f, 1).Value <> fechaSiguiente Then Exit For diccionarioSKU(.Cells(f, 2).Value) = 1 Next f ' Revisar los SKU de la fecha actual y marcar los que deben eliminarse For f = fila To 2 Step -1 If .Cells(f, 1).Value <> fechaActual Then Exit For ' Solo eliminar si el SKU no está en la fecha siguiente If Not diccionarioSKU.exists(.Cells(f, 2).Value) Then listaEliminar(f) = 1 ' Marcar fila para eliminar después End If Next f ' Ya no es necesario seguir buscando después de comparar la primera y la siguiente fecha Exit For End If Next fila ' Eliminar las filas marcadas sin afectar el bucle principal For Each f In listaEliminar.keys .Rows(f).Delete Next End With MsgBox "Completado correctamente.", vbInformation End Sub 'Opción 2 Sub FiltrarSKUPorFecha1(): Application.ScreenUpdating = False Dim ultimaFila As Long, fila As Long Dim listaEliminar As Collection Dim fechaActual As String, fechaSiguiente As String Dim f As Variant, i As Long Dim SKUExiste As Boolean With Sheets("Consolidado") ultimaFila = .Cells(.Rows.Count, 1).End(xlUp).Row ' Inicializar la colección para marcar las filas a eliminar Set listaEliminar = New Collection ' Recorrer desde la primera fila hasta la penúltima For fila = 2 To ultimaFila - 1 fechaActual = .Cells(fila, 1).Value fechaSiguiente = .Cells(fila + 1, 1).Value ' Solo comparar la fecha actual con la siguiente (inmediatamente superior) If fechaActual <> fechaSiguiente Then ' Revisar los SKU de la fecha actual y marcar los que deben eliminarse For f = fila To 2 Step -1 If .Cells(f, 1).Value <> fechaActual Then Exit For ' Comprobar si el SKU está en la fecha siguiente SKUExiste = False For i = fila + 1 To ultimaFila If .Cells(i, 1).Value <> fechaSiguiente Then Exit For If .Cells(i, 2).Value = .Cells(f, 2).Value Then SKUExiste = True Exit For End If Next i ' Si el SKU no se encuentra en la fecha siguiente, marcar para eliminar If Not SKUExiste Then listaEliminar.Add f ' Marcar fila para eliminar después End If Next f ' Ya no es necesario seguir buscando después de comparar la primera y la siguiente fecha Exit For End If Next fila ' Eliminar las filas marcadas sin afectar el bucle principal For Each f In listaEliminar .Rows(f).Delete Next f End With MsgBox "Completado correctamente.", vbInformation End Sub   TABLA ELIMINAR.xlsm
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.