** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Otros de Microsoft: Windows y Office > Excel
  Mensajes nuevos Mensajes nuevos RSS - Copiar datos de un libro de excel a otro libro
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoCopiar datos de un libro de excel a otro libro

 Responder Responder Página  12>
Autor
Mensaje
litris Ver desplegable
Habitual
Habitual
Avatar

Unido: 27/Noviembre/2006
Estado: Sin conexión
Puntos: 136
Enlace directo a este mensaje Tema: Copiar datos de un libro de excel a otro libro
    Enviado: 28/Junio/2017 a las 13:09
Buenos dias a todos,

Os escribo porque tengo una duda y no se como resolverlo. Cada mes exporto a excel un programa que tenemos en un sharepoint el qual registra las incidencias que se abren. Ese excel contiene una tabla con muchas columnas (hora de recepción de la incidencia, hora de finalización, tiempo de resulucion, el ID de la incidencia...). Yo me he creado otro excel con una macro el cual copia todo lo que hay en el excel exportado y lo pega en mi excel. Al haber mucha cantidad de datos se tira mucho rato para hacerlo.

Queria saber como se podria hacer para que vaya verificando si el ID del excel exportado está o no en mi excel. En caso que no esté pues que genere una fila nueva e inserte la fila que contiene el ID que no está copiado en mi excel y pase a la siguente fila y cuando esté repetido que deje de copiar y cierre el excel exportado.

No se mucho de programación en excel. Lo que tenia ahora hecho fue grabando todo con una macro que habria el excel exportado, seleccionaba todo y pegaba en mi excel. Con el tiempo los datos han ido creciendo y tarda bastante en copiar.

Gracias de antemano.

Saludos.


Ojos que no ven ostia que te metes
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 4994
Enlace directo a este mensaje Enviado: 28/Junio/2017 a las 15:10

Con esos datos ...  no se puede «ver» la situación de tu ejemplo o problema.


... una tabla con muchas columnas ... una macro ...  copia todo lo que hay en el excel exportado y lo pega en mi excel.


- ¿Cuantas son «muchas columnas»?

- ¿Cuanto es  «copia todo»?

- ¿De que rango copia?

- ¿En que rango pega?

- ¿Como se llaman las hojas: origen y destino?



...
Como se podria hacer para que vaya verificando si el ID del excel exportado está o no en mi excel.


- ¿Donde está el ID origen?

- ¿Donde está el ID destino?



... cuando esté repetido que deje de copiar y cierre el excel exportado.


- ¿Sin verificar los IDs
restantes?      (algo me estoy perdiendo)



... los datos han ido creciendo y tarda bastante en copiar.


- ¿Que cantidad (actual) es «han ido creciendo»?

- ¿Cuánto tiempo es «tarda bastante»?




- ¿Puedes incluir alguna imagen?





Editado por AnSanVal - 28/Junio/2017 a las 15:11
Pregunta lo que no sabes, recuérdalo para cuando te pregunten y ofrece tu ayuda (reconforta).

Mi sitio_web con ejemplos Excel.
Arriba
litris Ver desplegable
Habitual
Habitual
Avatar

Unido: 27/Noviembre/2006
Estado: Sin conexión
Puntos: 136
Enlace directo a este mensaje Enviado: 28/Junio/2017 a las 16:35
Disculpa, la verdad me he explicado muy mal. Te hago otro resumen a ver si lo explico mejor. Nosotros en sharepoint tenemos un gestor de tiquets. Un tiquet contiene bastantes datos: ID del tiquet, persona que genera ese tiquet, fecha de creación, fecha en que se cierra el tiquet, titulo del tiquet.... Cada mes yo exportaba esos datos a un excel. En la exportacion no se puede hacer ningun filtro, te descarga todos los tiquets que haya desde que se creó. Entonces Yo me hice un excel y una macro que abria el excel exportado, seleccionaba toda la hoja (ctrl+e) que contiene toda la información y la copiaba en mi excel. Lo hago así porque en mi excel tengo otra hoja donde hago algun gráfico estadistico. Entonces mi idea es que en mi excel solo añada los tiquets nuevos que se generan, no volcarlo todo cada vez.

- ¿Cuantas son «muchas columnas»? va desde la A hasta la la AN

- ¿Cuanto es  «copia todo»? copia todos los datos que hay en la hoja de excel exportado

- ¿De que rango copia? copia desde el rango A1 hasta el AN15909 (hago un Ctrl + E)

- ¿En que rango pega? Pega desde el rango A1 hasta el AN15909

- ¿Como se llaman las hojas: origen y destino? Son dos libros de excel diferentes. Uno que se genera cada vez que lo exporto (origen) de sharepoint donde la hoja se llama "owssvr" y el excel donde quiero volcar esos datos la hoja se llama "hoja1"


- ¿Donde está el ID origen? El ID está en la columna B

- ¿Donde está el ID destino? El ID está en la columna B



... cuando esté repetido que deje de copiar y cierre el excel exportado.


- ¿Sin verificar los IDs
restantes? imagina que yo tengo todos los datos volcados en el destino hasta el mes de mayo. Este mes de junio vuelvo a hacer un exportacion (excel origen) que contiene todos los tiquets hasta junio. Como los tiquets más nuevos se colocan en las primeras filas cuando el ID de destino coincida con el ID de origen es que ya no hay que copiar nada más.


... los datos han ido creciendo y tarda bastante en copiar.


- ¿Que cantidad (actual) es «han ido creciendo»? hay 15909 filas

- ¿Cuánto tiempo es «tarda bastante»? tarda como unos 45 segundos y a veces tengo que cerrarlo porque se queda sin responder.




Editado por litris - 28/Junio/2017 a las 16:37
Ojos que no ven ostia que te metes
Arriba
litris Ver desplegable
Habitual
Habitual
Avatar

Unido: 27/Noviembre/2006
Estado: Sin conexión
Puntos: 136
Enlace directo a este mensaje Enviado: 28/Junio/2017 a las 17:59
He grabado una macro de lo que haria yo. Lo que pasa que no se como hacer que eso sea un bucle que vaya verificando que el ID copiado es diferente del que ya hay. Esto es el resultado de la macro:

'Con el excel Destino abierto selecciono la fila 1 de la hoja1 e inserto fila en blanco
Rows("2:2").Select
    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
'Abro excel origen, selecciono fila 1 y la copio
    Workbooks.Open Filename:="C:\Users\CPG\Desktop\origen.xlsx"
    Rows("2:2").Select
    Selection.Copy
'Abro excel destino y pego la fila 1 del origen
    Windows("destino.xlsx").Activate
    ActiveSheet.Paste

'El siguiente paso seria comparar si el ID del que he copiado en la fila 1 es diferente que el que está en la fila 2. Si no es el mismo haria lo que pongo a continuacion.
'Voy al excel origen y elimino la fila 1 para que la fila 2 suba y sea la 1 de nuevo y asi ir copiando y pegando la fila 1 del origen al destino y en el destino insertar una nueva fila.

    Windows("origen.xlsx").Activate
    Rows("2:2").Select
    Application.CutCopyMode = False
    Selection.Delete Shift:=xlUp
'De nuevo inserto una fila en el destino
    Windows("destino.xlsx").Activate
    Rows("2:2").Select
    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
   'Aqui volveria a ir al origen para copiarla de nuevo y pegarla en destino....

No se si mi planteamiento es correcto o no vale para nada.

Ojos que no ven ostia que te metes
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 4994
Enlace directo a este mensaje Enviado: 28/Junio/2017 a las 19:19

No se como es tu código, pero comprueba que al principio deshabilitas la actualización de pantalla y los eventos, y al final los habilitas nuevamente, tal que así (azul)...


Sub Prueba()

  Dim celda As Range, filaO2&, filaD2&

  Application.ScreenUpdating = False

  Application.EnableEvents = False

  filaO2 = Workbooks("LibroO.xlsx").Worksheets("Hoja1").Range("A100000").End(xlUp).Row

  For Each celda In Workbooks("LibroO.xlsx").Worksheets("Hoja1") _

      .Range("A1:A" & filaO2) ' Este es el rango origen para los ID.

'Comprueba si el ID de origen es igual al primer ID en destino.

    If celda.Offset(,1).Value = Range("B2").Value Then

'Cierra el libro origen.

      Workbooks("LibroO.xlsx").Close savechanges:=False

    Else

      filaD2 = Cells(Rows.Count, 1).End(xlUp).Row + 1

'Copia la fila de datos en la hoja destino (debajo del último existente).

      Range("A" & filaD2 & ":AN" & filaD2).Value = celda.Resize(, 40).Value

    End If

  Next celda

  Application.EnableEvents = True

  Application.ScreenUpdating = True

End Sub


... eso reduce muchísimo el tiempo de procesado.



Otro punto interesante es evitar seleccionar hojas y celdas (obviamente desconozco si es tu caso), por ejemplo en vez de ...


Hoja1.Activate

Range("A7").Select

ActiveCell.Value = 1500


... es, preferible...


Worksheets("Hoja1").Range("A7").Value = 1500





EDITADO: No había visto tu último mensaje, pero visto «por arriba», veo que cometes uno de los fallos comunes: Seleccionas rangos para trabajar con ellos y eso consume recursos innecesariamente.
EDITADO2: Corregido para ID en columna B.




Editado por AnSanVal - 28/Junio/2017 a las 22:20
Pregunta lo que no sabes, recuérdalo para cuando te pregunten y ofrece tu ayuda (reconforta).

Mi sitio_web con ejemplos Excel.
Arriba
litris Ver desplegable
Habitual
Habitual
Avatar

Unido: 27/Noviembre/2006
Estado: Sin conexión
Puntos: 136
Enlace directo a este mensaje Enviado: 29/Junio/2017 a las 10:44
Muchas gracias AnSalVal.

He probado el código y he intentado hacer algunas modificaciones. El código que me has pasado va rapidísimo copiando todo el contenido. El unico problema es que si intento solo añadir los ultimos tiquets del mes de junio los va añadiendo en la ultima fila. Una vez añadidos si vuelvo a ejecutar la macro me los vuelve a añadir al final (de manera que salen repetidos) porque como compara lo que hay en la celda B2 de origen con la B2 de destino siempre le sale que no existen. No se si me explico. Lo que he hecho es añadir codigo para que ordene todo por la columna B2 que es donde están los ID asi si vuelvo a ejecutar el codigo lo hace bien:

Sub Prueba()


 Dim celda As Range, filaO2&, filaD2&, contador&

  Application.ScreenUpdating = False

  Application.EnableEvents = False

  contador = 0

  filaO2 = Workbooks("origen.xlsx").Worksheets("owssvr").Range("A100000").End(xlUp).Row

  For Each celda In Workbooks("origen.xlsx").Worksheets("owssvr").Range("A2:A" & filaO2)  ' Este es el rango origen para los ID.

'Comprueba si el ID de origen es igual al primer ID en destino.

    If celda.Offset(, 1).Value = Range("B2").Value Then

'Cierra el libro origen.

      Workbooks("origen.xlsx").Close savechanges:=False

    Else

      filaD2 = Cells(Rows.Count, 1).End(xlUp).Row + 1

'Copia la fila de datos en la hoja destino (debajo del último existente).

      Range("A" & filaD2 & ":AN" & filaD2).Value = celda.Resize(, 40).Value
      contador = contador + 1
    End If

  Next celda

  Application.EnableEvents = True

  Application.ScreenUpdating = True
 
  If contador <> 0 And contador <> 1 Then

  Columns("B:B").Select
    ActiveWorkbook.Worksheets("Hoja1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Hoja1").Sort.SortFields.Add Key:=Range("B1"), _
        SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Hoja1").Sort
        .SetRange Range("A2:AN54540")
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

  End If



End Sub


Ojos que no ven ostia que te metes
Arriba
litris Ver desplegable
Habitual
Habitual
Avatar

Unido: 27/Noviembre/2006
Estado: Sin conexión
Puntos: 136
Enlace directo a este mensaje Enviado: 29/Junio/2017 a las 12:16
Tengo una pregunta a ver si es posible hacerlo o no. Se podria decir que de todas las columnas que copia solo me peque unas en concreto? o seria mas sencillo hacer una macro para que una vez pasado todo al excell destino elimine las columnas que yo quiera?

Gracias.
Ojos que no ven ostia que te metes
Arriba
lbauluz Ver desplegable
Administrador
Administrador
Avatar

Unido: 29/Marzo/2005
Localización: Alcalá Meco
Estado: Sin conexión
Puntos: 2928
Enlace directo a este mensaje Enviado: 29/Junio/2017 a las 14:51
Pues si, es una opcion válida correr una segunda macro que elimine duplicados.

Otra opción es que justo antes de pegar la fila en el documento 2, compares a ver si ya existe y en ese caso no la añades.

Un saludo.

Luis
Quod natura non dat, Salmantica non præstat
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 4994
Enlace directo a este mensaje Enviado: 29/Junio/2017 a las 17:48
«... Una vez añadidos si vuelvo a ejecutar la macro me los vuelve a añadir al final (de manera que salen repetidos) ...»

¡Claro! Es correcto que así sea. Pero entre ejecución y ejecución de la macro, tú debes ordenar los datos de destino (no se si es de mayor a menor o de menor a mayor. Supongo que lo sabes tú), de modo que en B2 quede el ID correcto para la próxima comparativa. La ordenación de datos puedes incluirla en el código, y de ese modo te vale como despreocupación para olvidos.

EDITADO: No había leído que ya lo habías resuelto. Thumbs Up 



Editado por AnSanVal - 29/Junio/2017 a las 17:58
Pregunta lo que no sabes, recuérdalo para cuando te pregunten y ofrece tu ayuda (reconforta).

Mi sitio_web con ejemplos Excel.
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 4994
Enlace directo a este mensaje Enviado: 29/Junio/2017 a las 17:54
«... Se podría decir que de todas las columnas que copia solo me peque unas en concreto?...»

Si, pero... ¿«unas en concreto» son celdas consecutivas? ¿Cuál es el rango al que te refieres?

Pregunta lo que no sabes, recuérdalo para cuando te pregunten y ofrece tu ayuda (reconforta).

Mi sitio_web con ejemplos Excel.
Arriba
litris Ver desplegable
Habitual
Habitual
Avatar

Unido: 27/Noviembre/2006
Estado: Sin conexión
Puntos: 136
Enlace directo a este mensaje Enviado: 30/Junio/2017 a las 09:57
Hola AnSanVal,

Al ser tantas columnas las que se tienen que copiar hay algunas que si son consecutivas pero otras no. Por ejemplo, me interesaria la A,B,C,E,F,H,J,P,S,T,U,X,Y,AB,AC y AE.
Estaba pensando en hacer una macro que despues de importar los datos borrara esas columnas. La primera vez me iria bien pero a la que quiera seguir añadiendo datos al excel destino en los meses siguientes los datos de las columnas no coincidicirian porque en el excel origen habrá más columnas que en el excel destino. No se si me he explicado muy bien.

Un saludo.
Ojos que no ven ostia que te metes
Arriba
prga Ver desplegable
Moderador
Moderador


Unido: 16/Noviembre/2004
Localización: España
Estado: Sin conexión
Puntos: 2873
Enlace directo a este mensaje Enviado: 30/Junio/2017 a las 11:35
Hola.
Por dar una idea, siempre cabe la posibilidad de darles  anchura cero a las columnas que no se tienen que ver. No es como borrarlas, pero a muchos efectos es casi lo mismo
Espero que ayude a resolver la duda.
Un saludo a todos
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 4994
Enlace directo a este mensaje Enviado: 30/Junio/2017 a las 14:02
"Copiando" desde [A] hasta [AE], tienes 2 opciones:

La más sencilla es la propuesta de prga (yo también prefiero esa), la otra sería una segunda macro (por no saturar la principal) que borre los campos no deseados, pero no por columnas sino por celdas; de la fila insertada si lo haces cada vez que insertas una fila, o del rango insertado si la haces al final del proceso. En el caso de rango debes tener en cuenta en que fila empiezas el volcado y en que fila lo terminas.
Pregunta lo que no sabes, recuérdalo para cuando te pregunten y ofrece tu ayuda (reconforta).

Mi sitio_web con ejemplos Excel.
Arriba
litris Ver desplegable
Habitual
Habitual
Avatar

Unido: 27/Noviembre/2006
Estado: Sin conexión
Puntos: 136
Enlace directo a este mensaje Enviado: 04/Julio/2017 a las 10:35
Disculpad la tardanza en contestar. Finalmente no eliminaré ninguna columna ya que debido a mis limitaciones en programación voy a perder gran cantidad de tiempo.
Ojos que no ven ostia que te metes
Arriba
litris Ver desplegable
Habitual
Habitual
Avatar

Unido: 27/Noviembre/2006
Estado: Sin conexión
Puntos: 136
Enlace directo a este mensaje Enviado: 04/Julio/2017 a las 11:26
Ahora, lo que estoy intentando es hacer como un filtro por mes y año una vez copiado todos los datos en el libro destino. En la hoja donde están todos los datos he añadido dos columnas que son mes (columna AO) y año (columna AP). En otra hoja llamada filtroMes, que es donde quiero que se vuelquen los datos, en 2 celdas (B1 y D1) escribo el mes y en otro el año que me servirán para filtrar. He intentado modificar el código de AnSanVal pero no acaba de funcionar.

Dim celda As Range, filaO2&, filaD2&
  Dim mes1 As String
  Dim anyo As Integer

  Application.ScreenUpdating = False

  Application.EnableEvents = False
 
  mes1 = Worksheets("FiltroMes").Range("B1").Value
 
  ano = Worksheets("FiltroMes").Range("D1")

  filaO2 = Worksheets("hoja1").Range("A100000").End(xlUp).Row

  For Each celda In Worksheets("hoja1").Range("AP" & filaO2)  ' Este es el rango origen.

    'Comprueba si el valor de la hoja1 es igual al de la hoja FiltroMes.

    If celda.Offset(, 0).Value = anyo Then 'comparo si es el mismo año
       
        If celda.Offset(, -1).Value = mes1 Then 'Luego comparo si el mes es el mismo
   
            filaD2 = Cells(Rows.Count, 1).End(xlUp).Row + 1

            'Copia la fila de datos en la hoja FiltroMes (debajo del último existente).

            Range("A" & filaD2 & ":AN" & filaD2).Value = celda.Resize(, 40).Value
        End If
    End If
  Next celda

  Application.EnableEvents = True

  Application.ScreenUpdating = True


Algo me dejo porque no funciona bien. En el primer Next Celda ya sale y además solo me copia el valor 2017 en la celda A2 en vez de todos los valores.
Ojos que no ven ostia que te metes
Arriba
 Responder Responder Página  12>
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable