Página 1 de 1

[RESUELTO] macro para juntar varias hojas en una

Publicado: Mié Dic 28, 2011 6:33 pm
por osk
Hola:

Reconozco que soy muy novato en esto de la programación pero estoy intentando buscar una macro que realice la siguiente función.

Dispongo de un libro en calc que consta de varias hojas, todas las hojas tienen el mismo formato, son tablas en las que se añaden filas con cada comentario o punto que hemos acordado con cada cliente. Me gustaría realizar una macro que me junte en una hoja nueva todos los datos que tengo en las otras hojas.

No se si esto será posible.

Muchas gracias.

Re: macro para juntar varias hojas en una

Publicado: Mié Dic 28, 2011 8:32 pm
por fornelasa
Hola, Intenta con esta macro, copiala y pegala.
Esta macro crea una hoja nueva llamada "UnionDedatos" y aqui junta los datos de todas las demas hojas del libro de trabajo.

Nota Imprtante:
Cada que corras la macro asegurate de no tener una hoja llamada "UnionDeDatos" ya que si la tienes la macro al correr dará error. Si tienes esta hoja entonces primero eliminala y despues corre la macro y así la macro la creara automaticamente.

Código: Seleccionar todo

Sub UnirHojas()
dim document as object
dim dispatcher as object
dim args1(5) as new com.sun.star.beans.PropertyValue
dim args3(0) as new com.sun.star.beans.PropertyValue
'----------------------------------------------------------------------------------------------------------------------------
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
args3(0).Name = "Sel"
args3(0).Value = true
'----------------------------------------------------------------------------------------------------------------------------
ThisComponent.Sheets.InsertNewByName("UnionDeDatos",0)
ThisComponent.CurrentController.Select(ThisComponent.Sheets(0).GetCellRangeByName("A1"))
'-----------------------------------------------------------------------------------------------------------------------------
for a = 1 to ThisComponent.Sheets.GetCount()-1
ThisComponent.CurrentController.Select(ThisComponent.Sheets(a).GetCellRangeByName("A1"))
dispatcher.executeDispatch(document, ".uno:GoToEndOfData", "", 0, args3())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
args1(0).Name = "Nr"
args1(0).Value = 1
dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args1())
args1(0).Name = "Flags"
args1(0).Value = "SV"
dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:GoToEndOfData", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:GoLeftToStartOfData", "", 0, args1())
next
'----------------------------------------------------------------------------------------------------------------------------------------
ThisComponent.CurrentController.Select(ThisComponent.Sheets(0).GetCellRangeByName("A1"))
dispatcher.executeDispatch(document, ".uno:GoToEndOfData", "", 0, args3())
args1(0).Name = "aExtraWidth"
args1(0).Value = 100
dispatcher.executeDispatch(document, ".uno:SetOptimalColumnWidth", "", 0, args1())
End Sub
Saludos, Federico.

Re: macro para juntar varias hojas en una

Publicado: Sab Dic 31, 2011 2:05 pm
por osk
Muchísimas gracias Federico.

La macro que has adjuntado funciona perfectamente y me hes de gran ayuda , pero como siempre nos gusta buscar la perfección , sería posible que al ejecutar la macro, esta no tenga en cuenta la información de tres hojas en concreto? En el mismo libro tengo dos hojas que contienen otro tipo de información , una es la portada o la pagina de inicio y las otras dos unas tablas para consultar tarifas con lo que no me interés que la información de estas tres hojas se vea reflejada en la hoja unión de datos.


De antemano muchísimas gracias.

Re: macro para juntar varias hojas en una

Publicado: Dom Ene 01, 2012 5:44 pm
por fornelasa
Hola, para tratar de hacer lo solicitado (no tomar en cuenta tres hojas en la union de datos) tendriamos que agregar una instrucción If como en la macro que esta aqui. Estoy Suponiendo que tenemos un archivo que entre varias hojas tiene 3 que son llamadas "Uno", "Dos" y "Tres" y no queremos los datos de estas tres hojas.

Nota Imprtante:
Cada que corras la macro asegurate de no tener una hoja llamada "UnionDeDatos" ya que si la tienes la macro al correr dará error. Si tienes esta hoja entonces primero eliminala y despues corre la macro y así la macro la creara automaticamente.

Código: Seleccionar todo

Sub UnirHojas()
dim document as object
dim dispatcher as object
dim args1(5) as new com.sun.star.beans.PropertyValue
dim args3(0) as new com.sun.star.beans.PropertyValue
'----------------------------------------------------------------------------------------------------------------------------
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
args3(0).Name = "Sel"
args3(0).Value = true
'----------------------------------------------------------------------------------------------------------------------------
ThisComponent.Sheets.InsertNewByName("UnionDeDatos",0)
ThisComponent.CurrentController.Select(ThisComponent.Sheets(0).GetCellRangeByName("A1"))
'-----------------------------------------------------------------------------------------------------------------------------
for a = 1 to ThisComponent.Sheets.GetCount()-1
ThisComponent.CurrentController.Select(ThisComponent.Sheets(a).GetCellRangeByName("A1"))
oHoja = ThisComponent.CurrentController.ActiveSheet.name
If oHoja = "Uno" Or oHoja = "Dos" Or oHoja = "Tres" Then
Goto AntesNext
End If
dispatcher.executeDispatch(document, ".uno:GoToEndOfData", "", 0, args3())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
args1(0).Name = "Nr"
args1(0).Value = 1
dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args1())
args1(0).Name = "Flags"
args1(0).Value = "SV"
dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:GoToEndOfData", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:GoLeftToStartOfData", "", 0, args1())
AntesNext:
next
'----------------------------------------------------------------------------------------------------------------------------------------
ThisComponent.CurrentController.Select(ThisComponent.Sheets(0).GetCellRangeByName("A1"))
dispatcher.executeDispatch(document, ".uno:GoToEndOfData", "", 0, args3())
args1(0).Name = "aExtraWidth"
args1(0).Value = 100
dispatcher.executeDispatch(document, ".uno:SetOptimalColumnWidth", "", 0, args1())
End Sub
Saludos, Federico.

Re: macro para juntar varias hojas en una

Publicado: Dom Ene 01, 2012 9:45 pm
por osk
Muchas gracias.

He probado la macro en mi archivo de calc y funciona perfectamente .

Un saludo

Re: [RESUELTO] macro para juntar varias hojas en una

Publicado: Vie Ago 08, 2014 8:31 pm
por El Misterio 8
Hola, he querido poner en practica la primera macro que colgaste pero al momento de querer hacerla correr me aparece este mensaje: "Error de aplicación" "No se ha definido el tipo definido por el usuario". Como lo soluciono???

Re: [RESUELTO] macro para juntar varias hojas en una

Publicado: Sab Ago 09, 2014 12:13 pm
por SLV-es
Para que no de ese error en la primera macro, corrige las primeras líneas como ves aquí:

Código: Seleccionar todo

	Dim document As Object
	Dim dispatcher As Object
	Dim a As Integer
Si prefieres utilizar la segunda, la corrección es esta:

Código: Seleccionar todo

	Dim document As Object
	Dim dispatcher As Object
	Dim a As Integer, oHoja As String

Re: [RESUELTO] macro para juntar varias hojas en una

Publicado: Sab Ene 28, 2017 2:11 pm
por livermax
Buen día disculpen he intentado ejecutar la macro pero me sigue dando el mensaje de error podrían ayudarme indicándome que estoy realizando mal

Re: [RESUELTO] macro para juntar varias hojas en una

Publicado: Sab Ene 28, 2017 5:20 pm
por mauricio
Lo que estas realizando mal es la pregunta... ¿que macro "exactamente" estas intentando usar?... ¿que mensaje de error obtienes y en que línea?

Saludos

Re: [RESUELTO] macro para juntar varias hojas en una

Publicado: Dom Ene 29, 2017 2:20 pm
por livermax
Antes de nada muchas gracias por su respuesta le explico estoy intentando usar la segunda macro y obtengo un mensaje "Error de aplicación" "No se ha definido el tipo definido por el usuario me parece que se de debe a que el office que utilizo es de 64 bits podría por favor indicarme como puedo solucionar este impase de antemano agradezco su gentil apoyo.

Slds

Re: [RESUELTO] macro para juntar varias hojas en una

Publicado: Dom Ene 29, 2017 5:44 pm
por mauricio
En estos foros no damos soporte a Office...

Re: [RESUELTO] macro para juntar varias hojas en una

Publicado: Dom Ene 29, 2017 8:06 pm
por fornelasa
Así es, recordemos que el codigo es para la aplicación Calc y no para Excel.
Saludos, Federico.

Re: [RESUELTO] macro para juntar varias hojas en una

Publicado: Jue Abr 27, 2017 9:30 pm
por Jose_Tellez
Hola. y muchas gracias desde ya por la ayuda, lo que pasa es que estuve intentando usar esta macro, aclaro que antes usé una que también compartieron que unía muchos libros de .xls en uno solo, pero al ponerla me da el siguiente error:

BASIC runtime error.
An exception occurred
Type: com.sun.star.uno.RuntimeException
Message: .

y me selecciona esta línea:

ThisComponent.Sheets.InsertNewByName("UnionDeDatos",0)

Por favor, ¿Podrían decirme como solucionarlo o qué estoy haciendo mal?

Re: [RESUELTO] macro para juntar varias hojas en una

Publicado: Vie Abr 28, 2017 12:48 am
por fornelasa
Necesitamos dar más detalles, por ejemplo: enviar nuestro archivo ejemplo.
Hasta donde comentas aparentemente es:
fornelasa escribió:Nota Importante:
Cada que corras la macro asegúrate de no tener una hoja llamada "UnionDeDatos" ya que si la tienes la macro al correr dará error. Si tienes esta hoja entonces primero eliminala y después corre la macro y así la macro la creara automáticamente.
Saludos, Federico.

Re: [RESUELTO] macro para juntar varias hojas en una

Publicado: Vie Abr 28, 2017 1:34 pm
por Jose_Tellez
Mucha gracias por su respuesta, aquí si le adjunto mi archivo, se lo pondré con las hojas que deseo juntar.

Explico un poco: Antes apliqué una macro para poder unir varios archivos .xls en uno solo, dando como resultado el archivo adjunto. Ahora lo que quiero lograr es pasar toda la información a una sola hoja, intenté usar la macro que aquí nos ofrecieron pero me aparece el error que ya mencioné, y no tengo una hoja llamada "UniondeDatos" por lo que no podré darle solución con lo que me sugeriste.

Apenas voy aprendiendo a usar las macros, por lo que el nombre en donde ubiqué las que utilicé, están según las guías de este foro y se llama "Ejemplo de Macros"

Agradezco mucho su apoyo.

Re: [RESUELTO] macro para juntar varias hojas en una

Publicado: Vie Abr 28, 2017 4:33 pm
por fornelasa
De tu archivo la hoja Sheet1 no es necesaria.

Efectivamente con el archivo que has subido no existe la hoja "UnionDeDatos"

ummmm, ok, con los programas que dice mi firma funciona normalmente.

¿Podrías intentarlo nuevamente con el archivo ejemplo que has subido?

Saludos, Federico.

Re: [RESUELTO] macro para juntar varias hojas en una

Publicado: Vie Abr 28, 2017 5:14 pm
por Jose_Tellez
Creo que no entendí bien lo que quisiste decirme, ¿Si intento hacerlo nuevamente con el mismo archivo no me va a aparecer nuevamente el mismo error?.
Acabo de hacerlo y así es.

Sin embargo ya solucioné mi problema, y la macro está perfecta, no tiene errores que corregir realmente.
No estoy seguro de porqué ocurre, pero ese libro fue creado con otra macro, la siguiente:

Código: Seleccionar todo

Sub Juntar_Muchos_Cuadros
   Dim options(0) As New com.sun.star.beans.NamedValue
    
    util = createUnoService("org.universolibre.EasyDev")
   source = createUnoStruct("org.universolibre.EasyDev.CellRangeAddress")
   target = createUnoStruct("org.universolibre.EasyDev.CellRangeAddress")
    
    'Obtenemos todos los archivos ODS de la ruta especificada
    files = util.getFiles("/home/e10741/Escritorio/NOVIEMBRE", "xls")
   'Generamos un nuevo documento destino
   new_doc = util.newDoc("")
   target.Doc = new_doc
   'Abriremos los documentos de forma ocult
   options(0).Name = "Hidden"
   options(0).Value = True
   For i = LBound(files) To UBound(files)
      'Abrimos el documento
      doc = util.openDoc(files(i), options)
      source.Doc = doc
      
      'Copiamos todas las hojas del origen al destino, si tienes OpenOffice
      'util.sheetCopyToDoc(source, target, -1, True, False)
      'Copiamos todas las hojas del origen al destino, si tienes LibreOffice      
      util.sheetInsertFromDoc(source, target, -1, False)
      doc.dispose()
   Next
End Sub
Al parecer el haber creado ese libro con esta macro y después intentar aplicar la otra es lo que me produce ese error. (La macro de arriba también la saqué de este foro, creo que necesito aclarar eso)

Lo que hice fue copiar todas mis hojas y las trasladé a un nuevo archivo, en donde pude unir su información en una sola sin ningún problema.

Espero que estos detalles te sirvan tal vez para mejorar tus macros, o explicarnos el porqué de ese error, estoy muy agradecido por tu tiempo y dedicación, de verdad son muy útiles todas estas herramientas que nos ofrecen.

Saludos.

Re: [RESUELTO] macro para juntar varias hojas en una

Publicado: Vie Abr 28, 2017 7:32 pm
por fornelasa
Ok, ya sea por bien o por mal, quiero suponer que tu consulta ha sido [RESUELTA] ¿será así?
Saludos, Federico.

Re: [RESUELTO] macro para juntar varias hojas en una

Publicado: Vie Abr 28, 2017 7:54 pm
por Jose_Tellez
Si, no lo dije porque el post ya tiene esa calificación, pero si, mi caso quedó [Resuelto], gracias.

Re: [RESUELTO] macro para juntar varias hojas en una

Publicado: Vie Abr 28, 2017 8:03 pm
por fornelasa
ok bien. :super: