Pegado especial con macro AOO <> LibO

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...
Responder
xiseme
Mensajes: 1918
Registrado: Lun Nov 24, 2008 1:13 pm

Pegado especial con macro AOO <> LibO

Mensaje 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 
Última edición por xiseme el Mié Nov 02, 2016 6:39 pm, editado 2 veces en total.
Razón: Añadir
Todo es mejorable, estamos dispuestos a mejorar. ¿Yo? ... poco a poco.
Nunca hay acritud en mis comentarios, si lo pareciera, seguro que me he expresado mal.
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Pegado especial con macro AOO <> LibO

Mensaje 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
______________________________________________
"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
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Pegado especial con macro AOO <> LibO

Mensaje 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.
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!
xiseme
Mensajes: 1918
Registrado: Lun Nov 24, 2008 1:13 pm

Re: Pegado especial con macro AOO <> LibO

Mensaje 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 254 veces
ProbandoPegado2.ods
(16.42 KiB) Descargado 253 veces
Todo es mejorable, estamos dispuestos a mejorar. ¿Yo? ... poco a poco.
Nunca hay acritud en mis comentarios, si lo pareciera, seguro que me he expresado mal.
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Pegado especial con macro AOO <> LibO

Mensaje 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.
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!
xiseme
Mensajes: 1918
Registrado: Lun Nov 24, 2008 1:13 pm

Re: Pegado especial con macro AOO <> LibO

Mensaje 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.
Todo es mejorable, estamos dispuestos a mejorar. ¿Yo? ... poco a poco.
Nunca hay acritud en mis comentarios, si lo pareciera, seguro que me he expresado mal.
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Pegado especial con macro AOO <> LibO

Mensaje 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.
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!
xiseme
Mensajes: 1918
Registrado: Lun Nov 24, 2008 1:13 pm

Re: Pegado especial con macro AOO <> LibO

Mensaje 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:
Todo es mejorable, estamos dispuestos a mejorar. ¿Yo? ... poco a poco.
Nunca hay acritud en mis comentarios, si lo pareciera, seguro que me he expresado mal.
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Pegado especial con macro AOO <> LibO

Mensaje 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
______________________________________________
"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
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Pegado especial con macro AOO <> LibO

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

Re: Pegado especial con macro AOO <> LibO

Mensaje 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:
______________________________________________
"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
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Pegado especial con macro AOO <> LibO

Mensaje 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.
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!
Avatar de Usuario
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Pegado especial con macro AOO <> LibO

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

Re: Pegado especial con macro AOO <> LibO

Mensaje 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
______________________________________________
"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
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Pegado especial con macro AOO <> LibO

Mensaje 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.
Adjuntos
PobandoCopiaRangos.ods
Sin control botón
(111.64 KiB) Descargado 224 veces
Última edición por fornelasa el Mar Nov 08, 2016 7:59 pm, editado 2 veces en total.
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!
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Pegado especial con macro AOO <> LibO

Mensaje 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
______________________________________________
"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
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Pegado especial con macro AOO <> LibO

Mensaje por fornelasa »

ok bien, gracias mauricio es claro que hasta yo lo entiendo :) . He editado mi post previo, ¿que opinas?
Saludos Federico.
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!
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Pegado especial con macro AOO <> LibO

Mensaje 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
______________________________________________
"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
fornelasa
Mensajes: 3268
Registrado: Jue Feb 17, 2011 8:30 pm
Ubicación: Estado de México, México.

Re: Pegado especial con macro AOO <> LibO

Mensaje 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.
Adjuntos
Copiar.ods
Copiar solo formulas sobre 10000 filas
(16.14 KiB) Descargado 259 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!
Responder