[RESUELTO] Error al copiar rango. Easy Macro.

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...
Responder
Dario Piedra
Mensajes: 23
Registrado: Mié Jul 26, 2017 9:57 pm

[RESUELTO] Error al copiar rango. Easy Macro.

Mensaje por Dario Piedra »

Buenos días estimados,

Estaba tratando de copiar un rango de celdas de un libro, a otro libro usando easy macro. (usando OpenOffice 4.1.3 32bit)
Mi código es el siguiente:

Código: Seleccionar todo

from libo import LIBO

app = LIBO()

def main():
	doc_origen = app.get_doc('Origen.ods')
	hoja_origen = doc_origen.active
	rango_origen = hoja_origen['A1:A4']
	#hay algunos msgbox (bastantes) es para confirmar que cada dato seleccionado sea correcto.
	app.msgbox(doc_origen.title) #muestra el libro correcto.
	app.msgbox(hoja_origen) #resultado mostrado es = Libo.LOCalcSheet object at 0x0FDC7990
	app.msgbox(rango_origen.address)#muestra el rango correcto.
	
	doc_destino = app.get_doc('Destino.ods')
	hoja_destino = doc_destino.active
	app.msgbox(doc_destino.title) #muestra el libro correcto.
	app.msgbox(hoja_destino) #resultado mostrado es = Libo.LOCalcSheet object at 0x0FDC7DF0
	celda_destino = doc_destino.sheets['1']['A1'].get_next_cell()
	app.msgbox(celda_destino.address) #Si uso .get_next_cell() muestra el segundo error adjunto.
	rango_origen.move(celda_destino)
	
	return
	
Si realizo un cambio y en la celda_destino no uso la sentencia .get_next_cell(), me muestra la celda seleccionada de forma correcta pero el error se refleja al momento de ejecutar la sentencia rango_origen.move(celda_destino)

Código: Seleccionar todo

	celda_destino = doc_destino.sheets['1']['A1']
	app.msgbox(celda_destino.address) #Muestra la hoja y celda correcta.
	rango_origen.move(celda_destino)#Aquí se muestra el primer error adjunto.
Por lo que pude ver en el error creo que hace referencia al siguiente atributo:

Código: Seleccionar todo

    def __getitem__(self, index):
        if PY2:
            return self._get_item(index)
        return LOCalcSheet(self._obj[index])
Agradezco la ayuda que me puedan brindar para identificar el error.
Adjuntos
Error sin get_next_cell().
Error sin get_next_cell().
Error con get_next_cell().
Error con get_next_cell().
Última edición por Dario Piedra el Sab Jul 29, 2017 9:14 pm, editado 1 vez en total.
Windows 7 - Windows 10.
OpenOffice 4.1.3 32 Bit.
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Error al copiar rango. Easy Macro.

Mensaje por mauricio »

Hola...

Ya vi mi error... el problema es que OpenOffice no soporta aun la referencia directa por indice (slice), creí que ya lo había resuelto, pero me falto esa línea... lo arreglamos en un rato...
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Dario Piedra
Mensajes: 23
Registrado: Mié Jul 26, 2017 9:57 pm

Re: Error al copiar rango. Easy Macro.

Mensaje por Dario Piedra »

Comprendo Mauricio,

Estaré atento, te agradezco de antemano la ayuda.

Saludos.
Windows 7 - Windows 10.
OpenOffice 4.1.3 32 Bit.
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Error al copiar rango. Easy Macro.

Mensaje por mauricio »

Listo, he probado el mover en OpenOffice... pero acabo de caer en la cuenta que ahora LibreOffice usa primeros las filas y luego columnas, y OpenOffice usa primero columnas y despues filas para referirse a rangos... espero haber validado en todos los casos...

Por favor, actualiza y prueba nuevamente.

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Dario Piedra
Mensajes: 23
Registrado: Mié Jul 26, 2017 9:57 pm

Re: Error al copiar rango. Easy Macro.

Mensaje por Dario Piedra »

Muchísimas gracias Mauricio, muy amable.
Efectivamente ya no se muestra el error, sin embargo tengo una duda:

Código: Seleccionar todo

def main():
	doc_origen = app.get_doc('Origen.ods')
	hoja_origen = doc_origen.active
	rango_origen = hoja_origen['A1:A4']
	
	doc_destino = app.get_doc('Destino.ods')
	hoja_destino = doc_destino.active
	celda_destino = doc_destino.sheets['1']['A1']

	rango_origen.move(celda_destino)
	return
Según yo, el código debería escoger el rango de celdas 'A1:A4', del libro y hoja de origen, y pegarlo en la celda 'A1', de la hoja '1' del documento de destino.
Sin embargo cuando lo ejecuto solo hace esto:
1- Desaparece la celda 'A1' del libro de origen.
2- No aparece nada en la celda 'A1' del libro destino.

Probé cambiar el rango por este formato: (col:fil, col:fil)

Código: Seleccionar todo

rango_origen = hoja_origen[0:0, 0:3]
Sin embargo al hacer ese cambio, obtuve el error adjunto.

Te agradezco la ayuda que me puedas brindar,

Saludos.
Adjuntos
Error 7.PNG
Windows 7 - Windows 10.
OpenOffice 4.1.3 32 Bit.
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Error al copiar rango. Easy Macro.

Mensaje por mauricio »

Si tienes:

Código: Seleccionar todo

   hoja_destino = doc_destino.active
   celda_destino = doc_destino.sheets['1']['A1']
Entonces ya deberías de tener hoja_destino, por lo que celda_destino debe quedar:

Código: Seleccionar todo

celda_destino = hoja_destino['A1']
pero si seleccionas otros documento que NO es el activo, mi recomendación es que uses referencia directa a la hoja, y no a la activa:

Código: Seleccionar todo

celda_destino = doc_destino.sheets['1']['A1']
Toma nota de que estas referenciando la hoja que se llama '1', por que estas usando las comillas, si quieres hacer referencia a la hoja 1 (recuerda que empiezan en cero), entonces pasalo como un entero, sin las comillas.

Código: Seleccionar todo

celda_destino = doc_destino.sheets[1]['A1']
Pruebas y nos cuentas...

Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Dario Piedra
Mensajes: 23
Registrado: Mié Jul 26, 2017 9:57 pm

Re: Error al copiar rango. Easy Macro.

Mensaje por Dario Piedra »

Buenas tardes Mauricio,

Probé con los cambios que me indicas dejando del código de esta forma:

Código: Seleccionar todo

def main():
	doc_origen = app.get_doc('Origen.ods')
	hoja_origen = doc_origen.active
	rango_origen = hoja_origen['A1:A4']
	
	doc_destino = app.get_doc('Destino.ods')
	#hoja_destino = doc_destino.sheets[0] #estas líneas están comentadas para poder
	#celda_destino = hoja_destino['A1']#probar con la línea de abajo. en mis pruebas utilicé las dos formas.
	celda_destino = doc_destino.sheets[0]['A1']

	rango_origen.move(celda_destino)
	return
El resultado es el mismo, desaparece la primera la celda ['A1'] del documento origen, y no aparece nada en el documento destino.
Hice adicional las siguientes pruebas:
Cambie celda destino por este valor:

Código: Seleccionar todo

celda_destino = doc_destino.sheets[0]['A6']
Y el resultado es el siguiente: movió las celdas ['A2:A4'] a las posiciones ['A6:A8'], esto en la misma hoja del libro origen. (es decir, las movió de campo dentro del mismo libro y la misma hoja. La celda ['A1'] se quedó donde estaba.
Adicional está el problema de no poder seleccionar rangos en formato [col:fil, col:fil]

Saludos.
Windows 7 - Windows 10.
OpenOffice 4.1.3 32 Bit.
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Error al copiar rango. Easy Macro.

Mensaje por mauricio »

Ya veo... mover celdas solo funciona entre hojas del mismo libro, así funciona el método tanto de LibreOffice como de OpenOffice... para mover celdas entre libros, realmente lo que hay que hacer:

1.- Obtener los datos origen
2.- Copiarlos al destino
3.- Eliminar el origen

Por supuesto, la idea de Easy-Macro es facilitar las cosas, voy a validar si el origen y destino son diferentes archivos y actuar en consecuencia, de este modo, podemos dejar el método como esta y le damos el plus que buscamos.

Estén al pendiente.
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Dario Piedra
Mensajes: 23
Registrado: Mié Jul 26, 2017 9:57 pm

Re: Error al copiar rango. Easy Macro.

Mensaje por Dario Piedra »

Interesante, entonces la limitante es del mismo software.

En ese caso el método para copiar de un libro a otro sería el método copy_data?
Esto lo pregunto porque adicional al método move, probé el método copy y tuve el mismo resultado, copió la información en la misma hoja y libro de origen.

Saludos.
Última edición por Dario Piedra el Sab Jul 29, 2017 8:36 pm, editado 1 vez en total.
Windows 7 - Windows 10.
OpenOffice 4.1.3 32 Bit.
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Error al copiar rango. Easy Macro.

Mensaje por mauricio »

Así es, pero con Easy-Macro, lo vamos a mejorar... espera mis noticias...
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Dario Piedra
Mensajes: 23
Registrado: Mié Jul 26, 2017 9:57 pm

Re: Error al copiar rango. Easy Macro.

Mensaje por Dario Piedra »

Quisiera tener más conocimiento para apoyar más... Gracias nuevamente por toda la ayuda brindada.
Estaré atento.
Windows 7 - Windows 10.
OpenOffice 4.1.3 32 Bit.
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Error al copiar rango. Easy Macro.

Mensaje por mauricio »

Primera prueba... actualiza la librería y pruebas con el siguiente código:

Código: Seleccionar todo

    origen = app.get_doc('Origen.ods').sheets[0]['A1'].current_region
    destino = app.get_doc('Destino.ods').sheets[0]['A1']

    destino.data = origen.data
    origen.clear()
Lo he probado en OpenOffice y mueve los datos correctamente entre los libros...

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: Error al copiar rango. Easy Macro.

Mensaje por mauricio »

Ya me acorde que para eso eso hice el copy_data, he validado en OpenOffice...

Código: Seleccionar todo

    origen.copy_data(destino)
    origen.clear()
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Dario Piedra
Mensajes: 23
Registrado: Mié Jul 26, 2017 9:57 pm

Re: Error al copiar rango. Easy Macro.

Mensaje por Dario Piedra »

Es una completa maravilla.
Y lo mejor, si deseo mantener el origen por temas de "respaldo", basta solo con no agregar la sentencia:

Código: Seleccionar todo

origen.clear()
Mauricio, increíble la ayuda, realmente agradecido.
Windows 7 - Windows 10.
OpenOffice 4.1.3 32 Bit.
Avatar de Usuario
mauricio
Mensajes: 6092
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Error al copiar rango. Easy Macro.

Mensaje por mauricio »

Gracias por validar... esto nos permite tener una librería madura y lista para producción...

Saludos

P.D. No olvides marcar como resuelto
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
Responder