Página 1 de 1

Pegado especial con macro AOO <> LibO

Publicado: Mié Nov 02, 2016 12:10 pm
por xiseme
Con objeto de hacer pegado especial desde macros uso esto basado en la grabadora de macros

Código: Seleccionar todo

Sub CopiaRango(RangOrx As String, RangoDestino As String, Optional TipoDatos As String )
'Copia de RangOrx a RangoDestino solo los tipos de datos indicados en TipoDatos (ausente → todos)
'SVDFNT  S=texto V=valores D=fecha F=formulas N=comentarios T=formatos ex.: DF= fechas + formulas
	If IsMissing(TipoDatos) Then TipoDatos = "SVDFN"	'Por defecto pega todo menos formatos
	Dim Document As Object
	Dim Dispatcher As Object

	Document = ThisComponent.CurrentController.Frame
	Dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
	
	rem ----------------------------------------------------------------------
	Dim args1(0) as new com.sun.star.beans.PropertyValue
	args1(0).Name = "ToPoint"
	args1(0).Value = RangOrx	'"$D$8:$J$8"
	
	Dispatcher.executeDispatch(Document, ".uno:GoToCell", "", 0, args1())
	Dispatcher.executeDispatch(Document, ".uno:Copy", "", 0, Array())
	
	rem ----------------------------------------------------------------------
	Dim args3(0) as new com.sun.star.beans.PropertyValue
	args3(0).Name = "ToPoint"
	args3(0).Value = RangoDestino
	
	Dispatcher.executeDispatch(Document, ".uno:GoToCell", "", 0, args3())

	rem ----------------------------------------------------------------------
	Dim args5(5) as new com.sun.star.beans.PropertyValue
	args5(0).Name = "Flags"
	args5(0).Value = TipoDatos		'"F"
	args5(1).Name = "FormulaCommand"
	args5(1).Value = 0
	args5(2).Name = "SkipEmptyCells"
	args5(2).Value = false
	args5(3).Name = "Transpose"
	args5(3).Value = false
	args5(4).Name = "AsLink"
	args5(4).Value = false
	args5(5).Name = "MoveMode"
	args5(5).Value = 4	'4→ApacheOpenOffice 6-LibreOffice??INSERTA COL  NO ME VA BIEN EN LibO
	
	Dispatcher.executeDispatch(Document, ".uno:InsertContents", "", 0, args5())

End Sub 
Me funciona 100% en ApacheOpenoffice, pero no logro que lo haga en LibreOffice(5.1.x y 5.2.x sobre GNU/Linux y MSWindows7). Esporádicamente parece que sí, pero la mayoría es que no. Lo que mal-entiendo de mis búsquedas es que el «MoveMode» se comportan ya distintos y no sé cual es el bueno en LibO

He visto que en LibreOffice se pueden usar .uno:InsertContents y .uno:Paste .uno:PasteOnly .uno:PasteOnlyText .uno:PasteOnlyFormula pero no va en OpenOffice.

¿Habrá manera de una única macro para «pegado especial» que funcione indistintamente en ambos?

Gracias anticipadas

Editado: siguiendo algo de este enlace para LibreOffice ...

Código: Seleccionar todo

Sub PegadoEspecial(RangOrx As String, RangoDestino As String, Optional TipoPegado As String )
'Para LibreOffice (sin probar en AOO)
'Copia de RangOrx a RangoDestino solo los tipos de datos indicados en TipoPegado (ausente → todo)
' S=texto V=valores F=formulas 

	Dim Document As Object
	Dim Dispatcher As Object
		
	Select Case TipoPegado
		Case "F": 	TipoPegado = ".uno:PasteOnlyFormula"	'formulas
		Case "S": 	TipoPegado = ".uno:PasteOnlyText"		'string-texto o texto dev.por formula
		Case "V": 	TipoPegado = ".uno:PasteOnlyValue"		'valores o resultados que son un valor
		Case Else:	TipoPegado = ".uno:Paste"				'todo-todo
	End Select 
	
	Document = ThisComponent.CurrentController.Frame
	Dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
	
	Dim args1(0) as new com.sun.star.beans.PropertyValue
	args1(0).Name = "ToPoint"
	args1(0).Value = RangOrx
	
	Dispatcher.executeDispatch(Document, ".uno:GoToCell", "", 0, args1())
	Dispatcher.executeDispatch(Document, ".uno:Copy", "", 0, Array())
	
	Dim args3(0) as new com.sun.star.beans.PropertyValue
	args3(0).Name = "ToPoint"
	args3(0).Value = RangoDestino
	
	Dispatcher.executeDispatch(Document, ".uno:GoToCell", "", 0, args3())

 	Dispatcher.executeDispatch(document, TipoPegado, "", 0, Array())

End Sub 

Re: Pegado especial con macro AOO <> LibO

Publicado: Mié Nov 02, 2016 6:43 pm
por mauricio
y... ¿quieres así una función generica o solo deseas una acción especifica del pegado especial? o... ¿esta ultima edición resuelve tu problema?

Un abrazo

Re: Pegado especial con macro AOO <> LibO

Publicado: Mié Nov 02, 2016 11:31 pm
por fornelasa
Con respecto a la primer macro de este tema:
xiseme escribió:Lo que mal-entiendo de mis búsquedas es que el «MoveMode» se comportan ya distintos y no sé cual es el bueno en LibO
ummmmm no, no lo creo, estoy seguro que no va por ahí, me parece estamos ante un bug de LO, puedo casi firmarlo.
¿O se tratará tal vez (ya) de una ligera incompatibilidad entre archivos de estos dos programas?

Saludos, Federico.

Re: Pegado especial con macro AOO <> LibO

Publicado: Jue Nov 03, 2016 11:20 am
por xiseme
Gracias por vuestra atención.

La cosa surge por pegar solo fórmulas en un rango extenso. De ahi paso a querer (por querer que no quede! :mrgreen: ) una macro que cubra todas las posibilidades y veo que lo que funciona en AOO no lo hace en LibO.
Para datos tenemos .DataArray creí que para fórmulas con .FormulaArray... pero no
La opción oRango.getCellByPosition(i, n).Formula = txtFormulaEnInglés es muy lenta (minutos, deshabilitando recálculo automático mejora pero aún es lenta)

Sí que puede que sea un bug de LibO ... ... o no ... o sí .... o no ...
Haciendo pruebas como con el adjunto con ambas opciones Hay veces que no pega los datos con ninguna y otras con los dos. Desconcertado me tiene :mrgreen: con lo que a mí me gustan las certezas.
PobandoCopiaRangos.ods
(17.55 KiB) Descargado 302 veces
ProbandoPegado2.ods
(16.42 KiB) Descargado 297 veces

Re: Pegado especial con macro AOO <> LibO

Publicado: Jue Nov 03, 2016 6:01 pm
por fornelasa
Hola a todos:
Con respecto a la primer macro de este tema, me parece que no hay explicación coherente que aclare lo que sucede.
Parece que el problema está en la transición de archivos (abrir/trabajar/cerrar en Calc y después abrir en LO).
En base a lo anterior y a las pruebas que he realizado, si después de haberlo trabajado en Calc AOO lo abrimos en LO y entonces ejecutamos la macro manualmente (Alt-F11) a partir de ese momento la macro ya no falla pulsando los botones.

Re: Pegado especial con macro AOO <> LibO

Publicado: Vie Nov 04, 2016 5:53 pm
por xiseme
Acabo de hacer el proceso que indicas en el archivo de trabajo real y, SÍ ahora mismo sí que lo está pegando bien.
A ver si se mantiene días posteriores después de abrir/trabajar/cerrar en LibO que es el que estará en todos los pcs.

En todo caso sí que parece una inconsistencia arbitraria de LibO.

Muchas gracias por tus pruebas.

Re: Pegado especial con macro AOO <> LibO

Publicado: Vie Nov 04, 2016 6:13 pm
por fornelasa
Yo creo que sí nos dará lata.

Parecería un bug del evento "Botón del ratón soltado" ya que (parece) con el evento "Botón del ratón pulsado" funciona normalmente.
Entre más conozco a LO más quiero a AOO :mrgreen: :mrgreen:
Saludos.

Re: Pegado especial con macro AOO <> LibO

Publicado: Sab Nov 05, 2016 3:45 pm
por xiseme
Has acertado**: efectivamente da la lata.

Ni con botón-pulsado ni con botón-soltado va bien en el 100% de las veces en todos los pc's

Escribiré las fórmulas una a una, celda a celda grrrr....

Código: Seleccionar todo

'OPCION 0: Metodo lento pero seguro funcion en todo caso  (10-15 seg según num.celdas a escribir)
'desactivamos calculo automatico
	Document = ThisComponent
	Document.EnableAutomaticCalculation(False)file:///usr/share/applications/org.kde.dolphin.desktop
'escribimos fórmulas 		DOCBAR es una función personalizada
		FilaInicio = oCeldas.RangeAddress.StartRow + 1		'fila en la que escribimos la formula +1 porque empiezan en cero		
		LetraColInicio =Mid("ABCDEFGHIJKLMNOPQRSTUVWXYZ",oCeldas.RangeAddress.StartColumn+1,1)
		
	For n = 0 To oCeldas.Rows.Count -1
		For i = 1 To 6 Step 1
			LetraCol = Mid("ABCDEFGHIJKLMNOPQRSTUVWXYZ",oCeldas.RangeAddress.StartColumn +i+1,1)
			Select Case i
				Case 1,2,3		'Columnas Lote /peso /unds		 =IF(D8="";"";DOCBAR(D8;E$7-G$7;""))
					txtFormula = "=IF(" & LetraColInicio & FilaInicio + n & "="+CHR$(34)+CHR$(34)+";"+CHR$(34)+CHR$(34)+";" &_
										"DOCBAR(" & LetraColInicio & FilaInicio + n & ";" & LetraCol & "$" & FilaInicio-1 & ";"+CHR$(34)+CHR$(34)+"))"
					oCeldas.getCellByPosition(i, n).Formula = txtFormula
				Case 5,6		'columnas fecha/pedido-carga-envio	 =IF(D8="";"";I7-J7)
					txtFormula = "=IF("  & LetraColInicio & FilaInicio + n & "="+CHR$(34)+CHR$(34)+";"+CHR$(34)+CHR$(34)+";" &_
										LetraCol & FilaInicio + n-1 & ")"
					oCeldas.getCellByPosition(i, n).Formula = txtFormula
			End Select 
		Next i
	Next n
'reponemos calculo automatico	
	Document.Calculate() 'o  oDoc.calculateAll()
	Document.EnableAutomaticCalculation(True)
**Para que luego digan de presuntas dotes adivinatorias ajenas :mrgreen: :lol: :lol:

Re: Pegado especial con macro AOO <> LibO

Publicado: Sab Nov 05, 2016 6:24 pm
por mauricio
Insisto... NO usen más Basic, es viejo, obsoleto... y sobre todo lento, lento, lento... ya dije que es lento...
Con este código...

Código: Seleccionar todo

def copy_only_formula():
    doc = XSCRIPTCONTEXT.getDocument()
    sheet = doc.Sheets[0]
    source = sheet['C7:L7']
    target = sheet['C19:L1019']

    #~ start = datetime.datetime.now()

    #~ Se asume que se quiere copiar solo una fila
    formulas = source.getFormulaArray()[0]
    #~ Vaciamos lo que NO sea formula
    row = [r if r.startswith('=') else '' for r in formulas]
    data = []
    #~ Agregamos las filas destino
    for r in range(target.getRows().getCount()):
        data.append(row)
    target.setFormulaArray(tuple(data))
    doc.calculate()

    #~ end = datetime.datetime.now() - start
    #~ print ('Segundos: {}'.format(end))
    return
Tuve estos tiempos con tus datos:

Código: Seleccionar todo

1,000 filas, Segundos: 0.1
10,000 filas, Segundos: 0.8
100,000 filas,  Segundos: 8
Un abrazo

Re: Pegado especial con macro AOO <> LibO

Publicado: Lun Nov 07, 2016 5:59 pm
por fornelasa
mauricio escribió:Insisto... NO usen más Basic, es viejo, obsoleto... y sobre todo lento, lento, lento... ya dije que es lento...
No, no, y mil veces no, claro que no, me niego a dejar mi Basic adorado :mrgreen:

Por supuesto, eso no nos impide aprender otros programas super mega archi recontra complicados como Python, JavaScript y BeanShell.

Para muestra un botón, vean la sencillez con que se resuelve este tema, obvio con Basic (y de los otros programas ni sus luces, y eso que ahí hay mega-genios (creo)).
https://forum.openoffice.org/en/forum/v ... 20&t=85893

Por cierto ahí esta participando un usuario llamado einstein que se ve es muy inteligente.
:roll: :roll:
Saludos, Federico.

Re: Pegado especial con macro AOO <> LibO

Publicado: Mar Nov 08, 2016 3:21 am
por mauricio
fornelasa escribió:No, no, y mil veces no, claro que no, me niego a dejar mi Basic adorado :mrgreen:
A nadie se le impide sufrir... :lol:

Re: Pegado especial con macro AOO <> LibO

Publicado: Mar Nov 08, 2016 5:40 am
por fornelasa
:lol: ..... pero no, no sufro, en este caso sufren los chicos Java.

Si yo tuviera el mismo problema que tiene el usuario del vínculo que mencioné, yo ya lo habría resuelto usando Basic y estaria en el cine disfrutando una pelicula , en cambio él, usando el potentísimo Java sigue batallando y no le funciona para nada, eso si que es sufrir :mrgreen:

Saludos, Federico.

Re: Pegado especial con macro AOO <> LibO

Publicado: Mar Nov 08, 2016 6:09 pm
por fornelasa
He probado la macro Python y funciona bien en LO pero en AOO no, marca este error.

Imagen

a sufrir ..... 8-)

A que se deberá?

Saludos, Federico.

Re: Pegado especial con macro AOO <> LibO

Publicado: Mar Nov 08, 2016 6:39 pm
por mauricio
A que LibreOffice a partir de 5.1+, hizo unos cambios muy buenos para integrar mejor el soporte con Python, lo siento, OpenOffice esta muy, muy atrasado en esto... si quieres que sea compatible, tienes que usar la sintaxis vieja: https://wiki.openoffice.org/wiki/ES/Man ... PythonCalc

Saludos

Re: Pegado especial con macro AOO <> LibO

Publicado: Mar Nov 08, 2016 6:40 pm
por fornelasa
En LO funciona bien, pero si la macro se asigna a un botón control (botón del ratón soltado) entonces falla
Imagen
No sé si yo este sumando la fecha y por eso no me cuadra.....
A que se deberá?
 Editado: Si la macro es asignada a un dibujo o imagen funciona bien. Lo anterior me lleva a concluir que si es un bug de LO en al menos el control botón.
De ese modo, parece que las macros originales de xiseme funcionan normalmente si se asignan a dibujos y no al control botón, aquí el archivo ejemplo: 
Ok bien, entonces otra pregunta:

¿Como incluyo la macro Python dentro del archivo y no dentro de LibreOffice Macros?
Saludos, Federico.

Re: Pegado especial con macro AOO <> LibO

Publicado: Mar Nov 08, 2016 7:52 pm
por mauricio
No, el error es evidente: takes 0 positional arguments

Cuando se asigna una macro a un objeto, generalmente la macro debe tener al menos un argumento para recibir el evento, entonces, una macro que se ejecuta directamente y es de la forma:

Código: Seleccionar todo

def test():
   return
si se asigna a un boton, entonces, debe ser:

Código: Seleccionar todo

def test(event):
   return
por supuesto, el poder de Python, entre muchas otras cosas, es su versatilidad, puedes hacer:

Código: Seleccionar todo

def test(event=None):
   return
y funcionará de las dos maneras...

P.D. No uses el evento, botón del raton soltado, si un botón solo va a ejecutar una macro, es mucho mejor usar solo el evento Ejecutar acción

Re: Pegado especial con macro AOO <> LibO

Publicado: Mar Nov 08, 2016 8:00 pm
por fornelasa
ok bien, gracias mauricio es claro que hasta yo lo entiendo :) . He editado mi post previo, ¿que opinas?
Saludos Federico.

Re: Pegado especial con macro AOO <> LibO

Publicado: Mar Nov 08, 2016 10:09 pm
por mauricio
Si te refieres a la pregunta de como incluir la macro dentro del archivo, esto ya lo he documentado: https://wiki.openoffice.org/wiki/ES/Man ... imeraMacro

lo cual, se puede automatizar, con Python claro esta...

Si te refieres a la asignación a una imagen o a un botón, me parece que es solo asignar los argumentos correctos... no veo el bug...

Saludos

Re: Pegado especial con macro AOO <> LibO

Publicado: Mié Nov 09, 2016 12:37 am
por fornelasa
Con el único afán de expresar lo que veo; aquí mis comentarios:
mauricio escribió:Si te refieres a la pregunta de como incluir la macro dentro del archivo, esto ya lo he documentado: https://wiki.openoffice.org/wiki/ES/Man ... imeraMacro
Si a eso me refería ..... desde mi punto de vista mucho más complicado que Basic.
mauricio escribió:Si te refieres a la asignación a una imagen o a un botón, me parece que es solo asignar los argumentos correctos... no veo el bug...
He adecuado la macro agregándole event=None y funciona bien en LO, coincido, no hay bug.

Eso de que Python no tenga un IDE propio en LO no me gusta y para mi eso lo complica muchísimo más que Basic. Me imagino que el no tener un IDE propio debe tener sus ventajas y desventajas pero a mi no me gusta y por eso prefiero Basic, hasta JS y BS llevan ventaja con su IDE chafa.

A continuación me refiero a la comunidad en general:
Este archivo y la macro Basic hace lo mismo
es un decir ya que la macro Python de arriba no hace la tarea de la consulta
que el codigo en Python, y yo no veo diferencia significativa en tiempo entre uno y otro, ademas funciona en ambas suites.

Saludos, Federico.