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

Discute sobre la aplicación de hojas de cálculo

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

Notapor mikalis » Lun Mar 05, 2018 12:52 pm

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/viewtopic.php?f=21&t=7009, que me llevó a la maravillosa solución de SLV-es http://blog.open-office.es/basic/automatizar-tareas-con-macros-y-filtros-avanzados-en-openoffice-calc-ejemplo-paso-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   Expandir vistaContraer vista
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) 19 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

Notapor mikalis » Mié Mar 07, 2018 10:23 am

¡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   Expandir vistaContraer vista
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   Expandir vistaContraer vista
' 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
mikalis
 
Mensajes: 18
Registrado: Jue Dic 01, 2016 12:34 pm

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

Notapor fornelasa » Jue Mar 08, 2018 11:55 pm

¿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) 44 veces
lo 6.1.2 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
fornelasa
 
Mensajes: 3109
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

Notapor mikalis » Vie Mar 09, 2018 11:48 am

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

Notapor mikalis » Vie Mar 09, 2018 6:29 pm

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
mikalis
 
Mensajes: 18
Registrado: Jue Dic 01, 2016 12:34 pm

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

Notapor fornelasa » Vie Mar 09, 2018 7:41 pm

ok bien ¡excelente!, saludos. :super:
lo 6.1.2 | aoo 4.1.6 | win 7/10
¡Un aplauso para todos los que luchan por proteger y promover la Web abierta!
Avatar de Usuario
fornelasa
 
Mensajes: 3109
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.


Volver a Calc

¿Quién está conectado?

Usuarios navegando por este Foro: tate76 y 29 invitados