[RESUELTO] Macro para copiar solo celdas visibles

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...
Responder
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

[RESUELTO] Macro para copiar solo celdas visibles

Mensaje por mauricio »

Hola a todos:

En el foro de Calc, hay un hilo http://user.services.openoffice.org/es/ ... =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

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
altamiranojo
Mensajes: 2
Registrado: Mar Mar 08, 2011 9:25 pm

Re: Macro para copiar solo celdas visibles

Mensaje por altamiranojo »

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
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Macro para copiar solo celdas visibles

Mensaje por mauricio »

Hola...

En mi libro tienes toda la información para empezar a hacer tus macros: http://user.services.openoffice.org/es/ ... =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
altamiranojo
Mensajes: 2
Registrado: Mar Mar 08, 2011 9:25 pm

Re: Macro para copiar solo celdas visibles

Mensaje por altamiranojo »

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
BrunoF
Mensajes: 97
Registrado: Vie Jul 25, 2014 1:18 pm

Re: Macro para copiar solo celdas visibles

Mensaje por BrunoF »

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
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Macro para copiar solo celdas visibles

Mensaje por mauricio »

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: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: [RESUELTO] Macro para copiar solo celdas visibles

Mensaje por mauricio »

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
mriosv
Mensajes: 2334
Registrado: Sab Dic 27, 2008 1:12 am
Ubicación: Galiza (España)

Re: [RESUELTO] Macro para copiar solo celdas visibles

Mensaje por mriosv »

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 (Win10x64)
Chelo2
Mensajes: 103
Registrado: Mié Ago 14, 2013 4:25 am
Ubicación: Lomas de Zamora, Buenos Aires, Argentina

Re: [RESUELTO] Macro para copiar solo celdas visibles

Mensaje por Chelo2 »

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) Descargado 434 veces
OpenOffice 4.1.3 en Windows 7
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: [RESUELTO] Macro para copiar solo celdas visibles

Mensaje por mauricio »

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
Responder