Una vez más acudo en vuestra inestimable ayuda para resolver un problema con una macro. Partiendo de la base de que mis conocimientos en lenguaje OOo Basic son de lo más rudimentarios, he acudido a al foro para encontrar soluciones que se pudieran adaptar a la problemática que pretendo resolver.
En este sentido, encontré este tema, https://forum.openoffice.org/es/forum/v ... =21&t=7009, que me llevó a la maravillosa solución de SLV-es http://blog.open-office.es/basic/automa ... aso-a-paso.
Lo que prentendo hacer es copiar en la pestaña "Formulario" en B14:G64, los valores de la Hoja "Espejo_aprobado" (crear un subapartado en función del dato FechaVencimiento). He definido:
- el rango de datos: $Espejo_aprobado.$C$3:$I$11
- Condiciones: $Formulario.$G$10:$G$11
- y los Resultados $Formulario.$B$13:$G$64
y después he "fusilado" el código de SLV-es, con la única diferencia respecto al rango donde se activa la primera celda de resultado:
, poniendo 0 en lugar del "6"..CurrentController.Select(.CurrentController.ActiveSheet.getCellbyPosition( _
oResultados.RangeAddress.StartColumn,oResultados.RangeAddress.StartRow+0)
Código: Seleccionar todo
Sub Aplicar_Filtros
Dim oDatos as object, oCondiciones as object, oResultados as object
with ThisComponent
' Definir las áreas de datos, condiciones y resultados
oDatos = .DatabaseRanges.getByName("Datos")
oCondiciones = .NamedRanges.getByName("Condiciones").getReferredCells
oResultados = .NamedRanges.getByName("Resultados" ).getReferredCells
' Vacíar el rango de celdas destino
oResultados.clearContents(1023)
' Aplicar el filtro avanzado
AplicaFiltroAvanzado oDatos, oCondiciones, oResultados
' Mostrar el resultado
.CurrentController.ActiveSheet = .Sheets.getByIndex( _
oResultados.RangeAddress.Sheet())
' Activar la primera celda del resultado
.CurrentController.Select(.CurrentController.ActiveSheet.getCellbyPosition( _
oResultados.RangeAddress.StartColumn,oResultados.RangeAddress.StartRow+0)
end with
End sub
Sub AplicaFiltroAvanzado(oDatos as object, _
optional oCondiciones as object, _
optional oResultados as object)
Dim oFiltroActual as object, oFiltroNuevo as object
Dim bCopiarDatos as Boolean, bUsarCondiciones as Boolean
' actual definición del filtro, por si no hay nuevas condiciones
oFiltroActual = oDatos.getFilterDescriptor
' hay que copiar los datos a algun otro sitio?
bCopiarDatos = not isMissing(oResultados)
' hay que usar condiciones?
bUsarCondiciones = not isMissing(oCondiciones)
' si hay que usar condiciones cargamos en oFiltroActual las nuevas condiciones
if bUsarCondiciones then
oDatos.FilterCriteriaSource = oCondiciones.getRangeAddress
oFiltroNuevo = oCondiciones.createFilterDescriptorByObject( _
oDatos.getReferredCells)
oFiltroActual.setFilterFields(oFiltroNuevo.getFilterFields)
endif
' Aplicamos el filtro
oDatos.useFilterCriteriaSource = bUsarCondiciones
oFiltroActual.CopyOutputData = bCopiarDatos
' Si hay que copiar a otro rango
if bCopiarDatos then
oFiltroActual.OutputPosition = oResultados
endif
' Refrescar los datos
oDatos.refresh()
End Sub
Saludos