[RESUELTO] guardar copia de hoja de cálculo específica

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...
Responder
physic
Mensajes: 85
Registrado: Lun Oct 29, 2018 12:55 am

[RESUELTO] guardar copia de hoja de cálculo específica

Mensaje por physic »

saludos ,

         he encontrado un código del sr. Maurício , que se adapta muy bien para resolver mi problema https://forum.openoffice.org/es/forum/v ... 2832#p9016

         es necesario generar una copia de una hoja de cálculo específica y guardar en otro directorio con el nombre encontrado en la celda de la hoja de cálculo .

         después de copiar y guardar, debe cerrar la copia .

         entonces el código del sr. maurício es de gran ayuda para empezar a resolver el problema .

         es necesario copiar sólo una hoja de cálculo específica, y necesito copiar sólo los valores, sin las fórmulas .

         es necesario adaptar este código del sr. maurício , para copiar los valores de la hoja de cálculo específica, guardar en otro directorio y cerrar la copia .


abrazos amigos .
Última edición por physic el Sab Dic 15, 2018 5:34 am, editado 6 veces en total.
LibreOffice 5.4.4.2 >>> Windows 7
jsgaston
Mensajes: 8
Registrado: Dom Feb 19, 2017 1:12 am

Re: macro: guardar copia de hoja de cálculo específica

Mensaje por jsgaston »

hola ... physic .... eso es que estas sick de phy?
mira ... yo estoy buscando hacer algo parecido... copiar una tabla de otra tabla .. e ir guardandola a continaución de otra
hasta que la tabla esté llena .... y quiero que las tablas se vayan guardando cada 1 segundo ¿tienes alguna idea de por donde tengo que empezar para hacer esta macro?
openoffice 4.1.3
win 10
arivas_2005
Mensajes: 162
Registrado: Mié Nov 16, 2011 6:01 pm

Re: macro: guardar copia de hoja de cálculo específica

Mensaje por arivas_2005 »

Saludos...
usando de referencia el enlace sugerido, el gravador de macros (Version 4.4.7.2) y ---
https://forum.openoffice.org/es/forum/v ... 50&t=12145
https://forum.openoffice.org/en/forum/v ... e0fc82160f

propongo el código siguiente para que sea valorado como alternativa a la necesidad descrita antes.

Código: Seleccionar todo

Sub copySelectedRangeFromSheetToNewDocDemo()
	If Not GlobalScope.BasicLibraries.isLibraryLoaded("Tools") Then
		 GlobalScope.BasicLibraries.loadLibrary("Tools") 
	endif
	
	Hoja_origen=0
	
	dh       = CreateUnoService("com.sun.star.frame.DispatchHelper")
	frSrc    = ThisComponent.CurrentController.Frame
	sheetSrc = ThisComponent.Sheets(Hoja_origen)   '  aqui se controla la hoja origen
	rgSrc    = sheetSrc.GetCellRangeByName(ThisComponent.Sheets(Hoja_origen).Absolutename)
	ThisComponent.CurrentController.Select(rgSrc)
	dh.ExecuteDispatch(frSrc, ".uno:Copy", "", 0, Array())
	
	'  destino
	docTrg   = StarDesktop.LoadComponentFromUrl("private:factory/scalc", "_blank", 0, Array())
	frTrg    = docTrg.CurrentController.Frame
	sheetTrg = docTrg.Sheets(0)
	cellTrg  = sheetTrg.GetCellRangeByName("A1")
	frTrg.Activate()
	docTrg.CurrentController.Select(cellTrg)
	
	'' pegando datos, atributos y todo, con solo la siguente linea
'	dh.ExecuteDispatch(frTrg, ".uno:Paste", "", 0, Array())

	''  pegando solo datos--------con el grupo de lineas siguintes-------------------
	dim argsp(5) as new com.sun.star.beans.PropertyValue
	argsp(0).Name = "Flags"
	argsp(0).Value = "SVD"
	argsp(1).Name = "FormulaCommand"
	argsp(1).Value = 0
	argsp(2).Name = "SkipEmptyCells"
	argsp(2).Value = false
	argsp(3).Name = "Transpose"
	argsp(3).Value = false
	argsp(4).Name = "AsLink"
	argsp(4).Value = false
	argsp(5).Name = "MoveMode"
	argsp(5).Value = 4
	dh.ExecuteDispatch(frTrg, ".uno:InsertContents", "", 0, argsp())
	'' - fin de pegando solo datos---------------------------------------------------
	
	nombre_hoja_origen=ThisComponent.Sheets(Hoja_origen).name
	docTrg.Sheets(Hoja_origen).name=nombre_hoja_origen
		
	nombre_para_libro=ThisComponent.Sheets(Hoja_origen).getCellRangeByName("A1").getstring()
		
	sRutaURL = ThisComponent.getURL()	
	sRutaCompletaplana = ConvertFromUrl( sRutaURL )	
	sNombre = FileNameOutOfPath( sRutaURL )	
	sRuta = DirectoryNameoutofPath(sRutaCompletaplana, GetPathSeparator())
	Otra_Ruta=sRuta & GetPathSeparator() & "TEMPO"  '  <-- nombre de la carpeta para las copias
    existe_otra_ruta=dir(convertToURL(Otra_Ruta),16)
    if len(existe_otra_ruta)=0 then   
    	mkdir convertToURL(Otra_Ruta)
    endif
    wait 50
     if len(existe_otra_ruta)=0 then
      msgbox "No SE PUDO CREAR LA RUTA " & chr(10) & _
    	Otra_Ruta  & chr(10) & _
    	"Crearla y luego reintentar"
    	docTrg.close(False)
    	stop
    endif
    
    existe_copia_libro=dir(convertToURL(Otra_Ruta &  GetPathSeparator() & nombre_para_libro & ".ods"),0)
    if len(existe_copia_libro)>0 then 
    	Libro_Copia=Otra_Ruta &  GetPathSeparator() & nombre_para_libro & "_c.ods"
    else
        Libro_Copia=Otra_Ruta &  GetPathSeparator() & nombre_para_libro & ".ods"
    endif    
	dim propFich()	
	docTrg.storeAsURL(convertToURL(Libro_Copia), propFich())
	docTrg.close(true)
	
End Sub
Ojala no se me haya esdapado errorcillos y ayude a encontrar la solución a la necesidad existente.
exitos
Libreoffice 4.7
Puppy slacko 6 y windows 7
physic
Mensajes: 85
Registrado: Lun Oct 29, 2018 12:55 am

Re: macro: guardar copia de hoja de cálculo específica

Mensaje por physic »

sr. arivas_2005 ,

desde ya, quiero agradecer por su ayuda !

informo que la macro falló al copiar en la carpeta "TEMPO" en la siguiente línea del código: Otra_Ruta = sRuta & GetPathSeparator () & "TEMPO" .

es necesario que la dirección de la carpeta sea en el siguiente formato: C: \ Users \ Padrao \ Documents \ prueba A \ prueba B \ prueba C .

es posible poner en su código la dirección de la carpeta de destino así: C: \ Users \ Padrao \ Documents \ prueba A \ prueba B \ prueba C ... ??


abrazos amigo
LibreOffice 5.4.4.2 >>> Windows 7
arivas_2005
Mensajes: 162
Registrado: Mié Nov 16, 2011 6:01 pm

Re: macro: guardar copia de hoja de cálculo específica

Mensaje por arivas_2005 »

Pruebe cambiando el valor de Otra_Ruta con el path que requiera como destino.
' ' ' Otra_Ruta=sRuta & GetPathSeparator() & "TEMPO" ' <-- nombre de la carpeta para las copias .. cambie así:

Código: Seleccionar todo

 Otra_Ruta="C:\Users\Padrao\Documents\Prueba A\Prueba B\Prueba C"
Pero... , debe asegurarse que dicha rama de directorios ya existe
---------------------------------------------------------------------------------------
y si lo considera necesario, elimine el grupo de lineas siguientes:
existe_otra_ruta=dir(convertToURL(Otra_Ruta),16)
if len(existe_otra_ruta)=0 then
mkdir convertToURL(Otra_Ruta)
endif
wait 50
if len(existe_otra_ruta)=0 then
msgbox "No SE PUDO CREAR LA RUTA " & chr(10) & _
Otra_Ruta & chr(10) & _
"Crearla y luego reintentar"
docTrg.close(False)
stop
endif
Creo que el libro .ods orígen puede estar en cualquier carpeta pero la copia se almacenará en "C:\Users\Padrao\Documents\Prueba A\Prueba B\Prueba C" y el puntero de celda debe apuntar a la celda "A1" de la hoja activa, donde debe estar el nombre para la copia a crear.
ojala trabaje la macro con el(los) cambio(s)
También, revise este hilo:
https://forum.openoffice.org/en/forum/v ... 292f67a2d5
saludos.
Libreoffice 4.7
Puppy slacko 6 y windows 7
physic
Mensajes: 85
Registrado: Lun Oct 29, 2018 12:55 am

Re: macro: guardar copia de hoja de cálculo específica

Mensaje por physic »

sr. arivas_2005 ,

                 muy bueno su macro, ya funciona muy bien . :super:

                 me gustaría pedirle el favor para una necesidad más en la macro, es una necesidad más ideal para mi problema .

                 es posible cambiar la línea del código: (Hoja_origen = 0) por otra información, en lugar de indicar en la macro el índice de la hoja de cálculo (= 0), es mucho más accesible para mí indicar el nombre de la hoja de cálculo, algo así como: (Hoja_origen = hoja de cálculo 3) .

                 si puede hacer este cambio en la macro, será mucho más práctico para mí en la ejecución de la tarea .


abrazos amigo .
LibreOffice 5.4.4.2 >>> Windows 7
arivas_2005
Mensajes: 162
Registrado: Mié Nov 16, 2011 6:01 pm

Re: macro: guardar copia de hoja de cálculo específica

Mensaje por arivas_2005 »

pruebe realizando los cambios siguientes

cambie Hoja_origen = 0
por Hoja_origen ="hoja de cálculo 3"

cambie
'sheetSrc = ThisComponent.Sheets(Hoja_origen) '

por
sheetSrc =ThisComponent.getSheets().getByName(Hoja_origen)


cambie
'rgSrc = sheetSrc.GetCellRangeByName(ThisComponent.Sheets(Hoja_origen).Absolutename)

por
rgSrc = sheetSrc.GetCellRangeByName(ThisComponent.getSheets().getByName(Hoja_origen).Absolutename)


elimine
'nombre_hoja_origen=ThisComponent.Sheets(Hoja_origen).name


cambie
' docTrg.Sheets(Hoja_origen).name=nombre_hoja_origen

por
docTrg.getSheets().getByIndex(0).name=Hoja_origen ' ' Esto porque el .ods destino solo tiene una hoja, la 0

ojalá funcione.
Libreoffice 4.7
Puppy slacko 6 y windows 7
physic
Mensajes: 85
Registrado: Lun Oct 29, 2018 12:55 am

Re: macro: guardar copia de hoja de cálculo específica

Mensaje por physic »

sr. arivas_2005 ,

                                 está copiando correctamente la hoja de trabajo "REGISTRO" a la nueva carpeta, es decir, está colocando en el nuevo directorio correctamente .

                                pero ahora no está copiando ningún valor, está creando una copia de la hoja de cálculo vacía, sin los valores copiados .

                               se adjunta una imagen del código con los cambios que usted sugiere .

                                es que hice algo malo ??


abrazos amigo .
Adjuntos
código.png
LibreOffice 5.4.4.2 >>> Windows 7
arivas_2005
Mensajes: 162
Registrado: Mié Nov 16, 2011 6:01 pm

Re: macro: guardar copia de hoja de cálculo específica

Mensaje por arivas_2005 »

Saludos.
El adjunto me trabaja. Hace la copia sin formatos.
Adjuntos
CreaCopiaDeHoja.ods
(13.19 KiB) Descargado 363 veces
Libreoffice 4.7
Puppy slacko 6 y windows 7
physic
Mensajes: 85
Registrado: Lun Oct 29, 2018 12:55 am

Re: macro: guardar copia de hoja de cálculo específica

Mensaje por physic »

saludos arivas_2005 ,

su macro en el archivo adjunto no muestra ningún error para ejecutar el código .

la macro Guarde correctamente la copia de la hoja de cálculo deseada, con el nuevo nombre deseado, y también en el directorio de carpeta deseado .

Pero, para mí, continúa No mostrando los valores, es decir, crea un nuevo archivo vacío, sin valores ninguno . :(

parece que no puede copiar o pegar los valores , voy a seguir tratando de corregir el problema .


abrazos amigo .
LibreOffice 5.4.4.2 >>> Windows 7
arivas_2005
Mensajes: 162
Registrado: Mié Nov 16, 2011 6:01 pm

Re: macro: guardar copia de hoja de cálculo específica

Mensaje por arivas_2005 »

saludos.
Y si adjunta el archivo del inconveniente o una muestra con el problema para validar el proceso?
Libreoffice 4.7
Puppy slacko 6 y windows 7
physic
Mensajes: 85
Registrado: Lun Oct 29, 2018 12:55 am

Re: macro: guardar copia de hoja de cálculo específica

Mensaje por physic »

saludos arivas_2005 ,

                  sigue el archivo adjunto que estoy usando aquí para hacer mis pruebas, también está junto en el archivo de su macro y un botón en la hoja de cálculo .

detalles :

                 pero no está copiando los valores para mí, es decir, está creando un nuevo archivo totalmente vacío, no puede copiar los valores para mí, la hoja de cálculo copiada queda vacía .


abrazos amigo .
Adjuntos
Controle de Estoque.ods
(31.28 KiB) Descargado 341 veces
LibreOffice 5.4.4.2 >>> Windows 7
arivas_2005
Mensajes: 162
Registrado: Mié Nov 16, 2011 6:01 pm

Re: macro: guardar copia de hoja de cálculo específica

Mensaje por arivas_2005 »

Saludos.
como primera impresión, voy a suponer que el botón estaría generando el inconveniente.
Eliminé el botón en el adjunto #2.
Ahora, Localice un ícono con forma de "cubo verde" en la barra de formato para ejecutar la macro, con un clic.
Hacer la prueba.
Adjuntos
Controle de Estoque2.ods
(38.85 KiB) Descargado 385 veces
Libreoffice 4.7
Puppy slacko 6 y windows 7
physic
Mensajes: 85
Registrado: Lun Oct 29, 2018 12:55 am

Re: macro: guardar copia de hoja de cálculo específica

Mensaje por physic »

[Resuelto]

  sr. arivas_2005 ,

                    Muchas gracias por la ayuda y la dedicación para resolver mi problema .

                    la macro ahora está funcionando perfectamente . :bravo: :bravo: :bravo:

                    felicitaciones por su conocimiento . :super:


abrazos amigo .
LibreOffice 5.4.4.2 >>> Windows 7
Responder