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!

) 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

con lo que a mí me gustan las certezas.
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
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

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
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.

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
A nadie se le impide sufrir...

Re: Pegado especial con macro AOO <> LibO
Publicado: Mar Nov 08, 2016 5:40 am
por fornelasa

..... pero no, no sufro, e
n 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
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.
a sufrir .....
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

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:
si se asigna a un boton, entonces, debe ser:
por supuesto, el poder de Python, entre muchas otras cosas, es su versatilidad, puedes hacer:
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:
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.