[RESUELTO] Copiar y Pegar Datos de una hoja a otra (filtro)

Discute sobre la aplicación de hojas de cálculo
Responder
mikalis
Mensajes: 18
Registrado: Jue Dic 01, 2016 12:34 pm

[RESUELTO] Copiar y Pegar Datos de una hoja a otra (filtro)

Mensaje por mikalis »

Estimados compañeros:

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:
.CurrentController.Select(.CurrentController.ActiveSheet.getCellbyPosition( _
oResultados.RangeAddress.StartColumn,oResultados.RangeAddress.StartRow+0)
, poniendo 0 en lugar del "6".

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
El problema es que al ejecutar la macro el resultado se pega sobre la primera pestaña "Informe" en lugar de sobre la hoja "Formulario" y creo que por este motivo no está aplicando el filtro como debe. Cabe destacar que en lugar de dos condiciones/criterio, como incluye el fichero de SLV-es, pretendo usar un único criterio, pero entiendo que debería funcionar igual. Perdonadme la "torpeza" y os agradezco vuestras aportaciones de antemano.

Saludos
Adjuntos
FormatofiltroVcto.ods
(41.33 KiB) Descargado 188 veces
Última edición por mikalis el Vie Mar 09, 2018 11:50 am, editado 1 vez en total.
OOo 4.1.4 en Windows 10
mikalis
Mensajes: 18
Registrado: Jue Dic 01, 2016 12:34 pm

Re: Copiar y Pegar Datos de una hoja a otra mismo libro (fil

Mensaje por mikalis »

¡Hola a todos!

No sé si tenéis alguna aportación al respecto, si bien ya sé por dónde puede ir encaminada la solución, o más bien, dónde está focalizado el problema.

He analizado el código, y de SLV-es y el problema está no ya tanto en el filtro, que he conseguido que lo ejecute correctamente, sino en que aplique la copia del resultado del filtro en otra hoja de cálculo

Es decir, sobre el mismo archivo he "depurado" la parte que corresponde a la copia de la base de datos filtrada que me estaba copiando sobre el rango de datos (A1:G"X").

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+3)
  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 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
  
  
  ' Refrescar los datos
  oDatos.refresh()
End Sub
El filtro que necesito, como indicaba, lo realiza correctamente, pero no sé cómo conseguir que la parte que realiza la copia y pega los resultados en otro rango de celdas u hoja de cálculo se lleve a cabo

Código: Seleccionar todo

' hay que copiar los datos a algun otro sitio?
  bCopiarDatos = not isMissing(oResultados)

' Si hay que copiar a otro rango
  if bCopiarDatos then 
      oFiltroActual.OutputPosition = oResultados
  endif
¿Alguna idea al respecto? Muchas gracias por anticipado por vuestra ayuda.
OOo 4.1.4 en Windows 10
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Copiar y Pegar Datos de una hoja a otra mismo libro (fil

Mensaje por fornelasa »

¿Te refieres a que en un filtro avanzado los resultados de la consulta se pongan en otra hoja diferente?
sí si, mira este ejemplo:
Adjuntos
FiltrarAvanzado.ods
Filtro avanzado.
(13.24 KiB) Descargado 283 veces
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
mikalis
Mensajes: 18
Registrado: Jue Dic 01, 2016 12:34 pm

Re: Copiar y Pegar Datos de una hoja a otra mismo libro (fil

Mensaje por mikalis »

Muchas gracias, Federico, por tu respuesta.

Esta solución me funciona para lo que buscaba pero (y perdona una vez más mi poca habilidad) lo que sucede es que la hoja de cálculo sobre la que estaría ejecutando el filtro para luego copiar los valores a otra se trata de una hoja vinculada con fórmulas. ¿Existiría la posibilidad de copiar y pegar los valores en lugar del contenido de la celda (fórmula)?

Doy por resuelto el tema y únicamente quedaría ver la opción de pegar el valor de la celda
OOo 4.1.4 en Windows 10
mikalis
Mensajes: 18
Registrado: Jue Dic 01, 2016 12:34 pm

Re: [RESUELTO] Copiar y Pegar Datos de una hoja a otra (filt

Mensaje por mikalis »

OK. No worries, ya lo he solucionado vía alternativa copiando directamente de la hoja de origen de los datos en lugar de la hoja referenciada.

Muchas gracias por la aportación

Saludos
OOo 4.1.4 en Windows 10
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: [RESUELTO] Copiar y Pegar Datos de una hoja a otra (filt

Mensaje por fornelasa »

ok bien ¡excelente!, saludos. :super:
lo 6.2.0 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Responder