[RESUELTO] Macro para copiar solo celdas visibles

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...

[RESUELTO] Macro para copiar solo celdas visibles

Notapor mauricio » Sab Ago 08, 2009 5:47 am

Hola a todos:

En el foro de Calc, hay un hilo http://user.services.openoffice.org/es/forum/viewtopic.php?f=21&t=1292 donde se discute la posibilidad de seleccionar celdas visibles, por supuesto con OOo Basic es posible de una forma sencilla, se complica un poco al querer copiar pero sigue siendo posible. Cuando haces uso de filtros o subtotales, e intentas copiar, Calc te copia efectivamente las celdas visibles, pero intenta hacer un filtro y después oculta una columna manualmente, veras que el copiado ya no es correcto, de hecho, siempre que ocultas filas o columnas manualmente, Calc no te permite copiar, aquí es donde entra OOo Basic.

Solicito a todos los compañeros interesados, copiar y probar la siguiente macro, por favor, oculten filas y columnas y hagan varias pruebas para verificar su funcionamiento, por favor, si ven algún error y se les ocurre alguna mejor, usen este hilo para que la terminemos entre todos.

Gracias y un abrazo a todos.

Mauricio

Código: Seleccionar todo   Expandir vistaContraer vista
Sub CopiarSoloVisibles2()
Dim oSel As Object
Dim oCursor As Object
Dim oVisibles As Object
Dim oHojaOrigen As Object
Dim oHojaDestino As Object
Dim oRangoOrigen As Object
Dim oRangoAnterior As Object
Dim oCeldaDestino As New com.sun.star.table.CellAddress
Dim co1 As Long, Fil As Long, Col As Long
Dim mDir

   oHojaOrigen = ThisComponent.getCurrentController.getActiveSheet()
   oSel = ThisComponent.getcurrentSelection()
   Select Case oSel.getImplementationName
      Case "ScCellObj"
         oCursor = oSel.getSpreadSheet.createCursorByRange( oSel )
         oCursor.collapseToCurrentRegion()
         oVisibles = oCursor.queryVisibleCells()
      Case "ScCellRangeObj", "ScCellRangesObj"
         oVisibles = oSel.queryVisibleCells()
   End Select
   
   If IsNull( oVisibles ) Then
      MsgBox "No hay celdas ocultas o no es un rango de celdas"
   Else
      Fil = 0
      Col = 0
      oHojaDestino = getNuevaHoja( ThisComponent, oHojaOrigen  )
      mDir = oVisibles.getRangeAddresses()
      'Copiamos el primer rango
      oRangoOrigen = mDir( 0 )
      oCeldaDestino.Sheet = oHojaDestino.getRangeAddress.Sheet
      'En la celda A1
      oCeldaDestino.Column = 0
      oCeldaDestino.Row = 0
      oHojaDestino.copyRange( oCeldaDestino, oRangoOrigen )
      'Si tenemos más rangos
      If oVisibles.getCount() > 1 then
         For co1 = 1 To UBound(mDir)
            oRangoOrigen = mDir( co1 )
            oRangoAnterior = mDir( co1-1 )
            'Vamos sumando cada ancho y alto de cada rango, solo cuando cambien
            If oRangoAnterior.StartColumn = oRangoOrigen.StartColumn Then
               oCeldaDestino.Row = oCeldaDestino.Row + oRangoAnterior.EndRow - oRangoAnterior.StartRow + 1
            Else
               oCeldaDestino.Column = Col + oRangoAnterior.EndColumn - oRangoAnterior.StartColumn + 1
               oCeldaDestino.Row = Fil
               Col = oCeldaDestino.Column
            End If
            oHojaDestino.copyRange( oCeldaDestino, oRangoOrigen )
         Next co1
      End If
      ThisComponent.getCurrentController.setActiveSheet( oHojaDestino )
   End If   
End Sub


'Devuelve una nueva hoja en Documento, a la derecha del argumento Hoja
Function getNuevaHoja( Documento As Object, Hoja As Object ) As Object
Dim oHojas As Object
Dim co1 As Integer
Dim sNombre As String

   oHojas = Documento.getSheets()
   sNombre = "Rangos Copiados"
   Do While oHojas.hasByName( sNombre )
      co1 = co1 + 1
      sNombre = sNombre & " " & Format(co1)
   Loop
   oHojas.insertNewByName( sNombre, Hoja.getRangeAddress.Sheet+1 )
   getNuevaHoja = Documento.getSheets.getByName( sNombre )
End Function
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
 
Mensajes: 5933
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX

Re: Macro para copiar solo celdas visibles

Notapor altamiranojo » Mar Mar 08, 2011 9:32 pm

Hola Mauricio, soy relativamente nuevo en el uso de Calc, como veo que tienes un ejemplo práctico para hacer macros, para copiar celdas visibles, pero yo no sé hacer macros en Calc, lo que hacia en Excel era grabar la macro y listo!, pero en calc, desconozco totalmente cómo hacerlas, me podrías orientar de como hacer cualquier macro porfa, Gracias!
open office 3.2 en ubuntu 10.10
altamiranojo
 
Mensajes: 2
Registrado: Mar Mar 08, 2011 9:25 pm

Re: Macro para copiar solo celdas visibles

Notapor mauricio » Mar Mar 08, 2011 11:33 pm

Hola...

En mi libro tienes toda la información para empezar a hacer tus macros: viewtopic.php?f=50&t=1545
Si no es de tu interés aprender, puedes jugar con la grabadora de macros, pero en lo personal no me gusta.
Si tienes dudas puntuales y concretas de algo en especial, usa este foro...

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
 
Mensajes: 5933
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX

Re: Macro para copiar solo celdas visibles

Notapor altamiranojo » Mié Mar 09, 2011 12:15 am

si ya lo bajé, y claro que utilizaré el foro para mis dudas.

PD:Acabo de descubrir este foro y estoy viendo que es super útil!
¡Gracias!
open office 3.2 en ubuntu 10.10
altamiranojo
 
Mensajes: 2
Registrado: Mar Mar 08, 2011 9:25 pm

Re: Macro para copiar solo celdas visibles

Notapor BrunoF » Mar Oct 07, 2014 6:40 pm

Justamente ahora me vi en la necesidad de "reutilizar" por no decir "robar" este código (?), funciona excelentemente bien. Hice un algoritmo para filtrar datos, ordenarlos y ocultar los que no me servían, son aproximadamente 50mil registros por lo que decidí pasar en limpio a una nueva hoja solo los visibles, probé de todo pero nada, hasta que llegué aquí.

La única modificación que le hice es definir un rango estático porque ya se hasta que columna van mis datos, y para las filas las recorro con un while y obtengo el último. Así armo mi rango ejemplo "A1:H"+iContadorFilas.

Gracias por el aporte. Arriba. Un abrazo :super:
LibreOffice 4.1 en Windows 7
BrunoF
 
Mensajes: 97
Registrado: Vie Jul 25, 2014 1:18 pm

Re: Macro para copiar solo celdas visibles

Notapor mauricio » Mar Oct 07, 2014 7:05 pm

Hola...

Cuando se tienen muchos datos, no es buen técnica usar un while, es mejor usar un cursor para encontrar la ultima fila, esto puedes encontrarlo en este foro que se ha respondido varias veces, o en mi libro...

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
 
Mensajes: 5933
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX

Re: [RESUELTO] Macro para copiar solo celdas visibles

Notapor mauricio » Jue Mar 30, 2017 3:39 pm

Ahora, con EasyDev, es mucho más fácil seleccionar las celdas visibles: http://easydev.readthedocs.io/en/latest ... ible-cells
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
 
Mensajes: 5933
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX

Re: [RESUELTO] Macro para copiar solo celdas visibles

Notapor mriosv » Jue Mar 30, 2017 10:18 pm

Existe una extensión para el tema: https://extensions.libreoffice.org/exte ... ible-cells
Aunque no se si es exactamente igual.
Puedes usar "Subir adjunto" en Respuesta rápida - Editor Completo - Pestaña Subir adjunto
Apache OpenOffice 4, LibreOffice 5 (Win10x64)
mriosv
 
Mensajes: 2185
Registrado: Sab Dic 27, 2008 1:12 am
Ubicación: Galiza (España)

Re: [RESUELTO] Macro para copiar solo celdas visibles

Notapor Chelo2 » Mié Abr 19, 2017 4:10 am

Hola amigos!!

He estado probando el código en Basic que colgó Mauricio para copiar celdas visibles y me funciona correctamente.
Pero cuando quiero copiar esas celdas a otro libro no he logrado el cometido. No se si porque no se puede o porque tengo algún error en el código.

Como les recuerdo siempre, no soy programador ni mucho menos. Solo incursiono en el mundo de las macros por placer, pero con las limitaciones que mi desconocimiento me impone. Por otra parte, también les comento que no puedo utilizar la extensión EasyDev, ya que en mi oficina donde trabajo no lo puedo aplicar por la limitación que me impone la organización.

Les envío el archivo de ejemplo por si alguien puede indicarme que estoy haciendo mal para que no se pueda utilizar en otro libro.

Desde ya les agradezco la atención.

Un saludo desde Buenos Aires, Argentina-
Adjuntos
Copiar_solo_visibles.ods
(13.4 KiB) 265 veces
OpenOffice 4.1.3 en Windows 7
Chelo2
 
Mensajes: 100
Registrado: Mié Ago 14, 2013 4:25 am
Ubicación: Lomas de Zamora, Buenos Aires, Argentina

Re: [RESUELTO] Macro para copiar solo celdas visibles

Notapor mauricio » Mié Abr 19, 2017 4:36 am

Hola...

Este tema es muy viejo, te recomiendo siempre abrir un nuevo tema y solo enlazar al que mencionas...

Por otra parte, trato, pero no entiendo por que no instalar una herramienta que les va a simplificar la vida a todos, que no requiere permisos de administrador y que se puede instalar en el espacio de usuario sin afectar nada... en fin...

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Avatar de Usuario
mauricio
 
Mensajes: 5933
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX


Volver a Macros y API UNO

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados