Página 1 de 1

[Resuelto] macro auto filtro de fechas en dos columnas

NotaPublicado: Dom Nov 18, 2018 2:37 am
por physic
saludos

                       estoy a días tratando de construir una macro para Auto Filtro automático de intervalo de fechas en dos columnas diferentes en la misma hoja de cálculo

                       por ejemplo:

                       la hoja de cálculo1 tiene 5000 líneas, la columna A y la columna F contiene Fechas

                       es necesario filtrar en la columna A el intervalo de fechas entre 15/01/2008 hasta 20/12/2015 y en la columna F preciso filtrar el intervalo de fechas entre 10/03/2008 hasta 25/12/2010

                       es necesario ser a través de macro y necesita hacer los dos filtros juntos en la misma macro

                       he intentado varios ejemplos de los foros, pero ningún ejemplo es parecido a mi problema.



                    abrazos

Re: macro auto filtro de fechas en dos columnas

NotaPublicado: Dom Nov 18, 2018 7:43 pm
por Longi
Buenas!
Vuelvo a contestar algo en lo que no controlo nada, y eso es indicativo de que si yo he sido capaz, seguramente tú con alguna búsqueda y un poco de empeño, también eres capaz de conseguirlo (todo ello contando con que funcione en tu hoja de trabajo. En mi hoja de ejemplo me parece que sí que funciona, pero mis resultados son para congerlos con pinzas)

Código: Seleccionar todo   Expandir vistaContraer vista
sub filtra_Fechas()

Dim xRange as object
Dim FilterDesc as Object
Dim FilterFields(3) as new com.sun.star.sheet.TableFilterField

xRange = thiscomponent.getcurrentcontroller.activesheet.getCellRangeByName("A2:F100")
FilterDesc = xRange.createFilterDescriptor(true)

FilterDesc.ContainsHeader = false
FilterFields(0).Field = 0
FilterFields(0).IsNumeric = true
FilterFields(0).Operator = com.sun.star.sheet.FilterOperator.GREATER_EQUAL
FilterFields(0).NumericValue = CLng(CDate("15/01/2008")) 

FilterDesc.ContainsHeader = false
FilterFields(1).Field = 0
FilterFields(1).IsNumeric = true
FilterFields(1).Connection = com.sun.star.sheet.FilterConnection.AND
FilterFields(1).Operator = com.sun.star.sheet.FilterOperator.LESS_EQUAL
FilterFields(1).NumericValue = CLng(CDate("20/12/2015"))

FilterFields(2).Field = 5
FilterFields(2).Connection = com.sun.star.sheet.FilterConnection.OR
FilterFields(2).Operator = com.sun.star.sheet.FilterOperator.GREATER_EQUAL
FilterFields(2).IsNumeric = True
FilterFields(2).NumericValue = CLng(CDate("10/03/2008"))

FilterDesc.ContainsHeader = false
FilterFields(3).Field = 5
FilterFields(3).IsNumeric = true
FilterFields(3).Connection = com.sun.star.sheet.FilterConnection.AND
FilterFields(3).Operator = com.sun.star.sheet.FilterOperator.LESS_EQUAL
FilterFields(3).NumericValue = CLng(CDate("25/12/2010"))

FilterDesc.SetFilterFields(FilterFields)

xRange.Filter(FilterDesc)

End Sub



Supongo que está bien para funcionar, sólo falta hacer las pruebas correspondientes y cruzar los dedos, no vaya a ser que todo reviente.

Un saludo! ;)

Re: macro auto filtro de fechas en dos columnas

NotaPublicado: Lun Nov 19, 2018 12:45 pm
por physic
sr. Longi

            hice un modelo para probar su código, pero parace que no funcionó correctamente como necesitaba funcionar

sigue el modelo adjunto para análisis


abrazos

Re: macro auto filtro de fechas en dos columnas

NotaPublicado: Lun Nov 19, 2018 2:00 pm
por Longi
Buenas!

Creo que el problema está en las referencias (yo hice la búsqueda para la primera columna, empezando por la letra A, y además puse solo 50 filas).
Mira a ver con estas modificaciones si se adaptan a lo que se necesita:

Código: Seleccionar todo   Expandir vistaContraer vista
sub filtra_Fechas()

Dim xRange as object
Dim FilterDesc as Object
Dim FilterFields(3) as new com.sun.star.sheet.TableFilterField

xRange = thiscomponent.getcurrentcontroller.activesheet.getCellRangeByName("B2:B5000")
FilterDesc = xRange.createFilterDescriptor(true)

FilterDesc.ContainsHeader = false
FilterFields(0).Field = 0
FilterFields(0).IsNumeric = true
FilterFields(0).Operator = com.sun.star.sheet.FilterOperator.GREATER_EQUAL
FilterFields(0).NumericValue = CLng(CDate("15/01/2008")) 

FilterDesc.ContainsHeader = false
FilterFields(1).Field = 0
FilterFields(1).IsNumeric = true
FilterFields(1).Connection = com.sun.star.sheet.FilterConnection.AND
FilterFields(1).Operator = com.sun.star.sheet.FilterOperator.LESS_EQUAL
FilterFields(1).NumericValue = CLng(CDate("20/12/2015"))

FilterFields(2).Field = 4
FilterFields(2).Connection = com.sun.star.sheet.FilterConnection.OR
FilterFields(2).Operator = com.sun.star.sheet.FilterOperator.GREATER_EQUAL
FilterFields(2).IsNumeric = True
FilterFields(2).NumericValue = CLng(CDate("10/03/2008"))

FilterDesc.ContainsHeader = false
FilterFields(3).Field = 4
FilterFields(3).IsNumeric = true
FilterFields(3).Connection = com.sun.star.sheet.FilterConnection.AND
FilterFields(3).Operator = com.sun.star.sheet.FilterOperator.LESS_EQUAL
FilterFields(3).NumericValue = CLng(CDate("25/12/2010"))

FilterDesc.SetFilterFields(FilterFields)

xRange.Filter(FilterDesc)

End Sub


Ya nos cuentas.

Un saludo! ;)

Re: macro auto filtro de fechas en dos columnas

NotaPublicado: Lun Nov 19, 2018 3:10 pm
por physic
En la columna B funcionó perfecto

Pero en la columna F no funcionó


abrazos

Re: macro auto filtro de fechas en dos columnas

NotaPublicado: Lun Nov 19, 2018 4:32 pm
por physic
sr. Longi

      comando OR por el comando AND y funcionó correcto

      gracias por su ayuda


abrazos

Re: [Resuelto] macro auto filtro de fechas en dos columnas

NotaPublicado: Lun Nov 19, 2018 5:54 pm
por Longi
Buenas de nuevo!
Pudiera ser que todo esté mal, pero quisiera pensar que no es así, que simplemente es una mala lectura del primer mensaje por mi parte.
En la estructura de la macro hay cuatro bloques de filtro, y en los tres últimos aparecen los operadores lógicos 'AND' y 'OR'.
En función de cómo los pongas tendrás una cantidad de registros u otra.
Lo que yo intenté era que quedasen todos los registros filtrados entre los dos primeros bloques de filtro de la macro (primera columna), y después, si del segundo grupo (dos bloques del final de la macro) que afectan a la segunda columna tuviese algún registro que originalmente no fuese filtrado en la primera columna, también aparecería en el resultado final.
Jugando con los 'AND' y 'OR' he tenido estos totales de registros para el ejemplo propuesto:

AND+AND+AND= 142 registros
AND+AND+OR= 271 registros
AND+OR+AND= 239 registros
OR+AND+AND= 468 registros

Haz pruebas a ver cual es lo que quieres que te salga.
Si no te termina de funcionar apórtanos el conjunto de resultados que querrías que saliese con los datos del ejemplo que ya tenemos (o con otro diferente), a ver si arreglamos algo.

Otro saludo! ;)