Visual Basic - Copiar mismo rango de hojas de un libro a otro

Life is soft - evento anual de software empresarial
 
Vista:

Copiar mismo rango de hojas de un libro a otro

Publicado por Mario (5 intervenciones) el 17/12/2017 18:50:12
Hola,
Estoy empezando con vba. Mi principal objetivo es el siguiente. Tengo una hoja excel con una serie de pestañas por países y un rango de datos para cada país. Quiero coger el rango I76:I133 de cada hoja de ese libro y pegarlo en otro libro diferente, que tiene la misma estructura de hojas, y quiero pegarlo en el mismo rango de cada hoja de destino.
El libro origen se llama trimestral.xlsx
El libro destino se llama master.xlsx

He hecho varios intentos tal que así (ver abajo), pero vaya, no doy con la tecla :S, me podéis ayudar? Mil gracias! Mario

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub prueba_copia()
Dim libroorigen As Workbook
Dim librodestino As Workbook
Dim mihojaorigen As Worksheet
Dim mihojadestino As Worksheet
libroorigen = Windows("trimestral.xlsx")
librodestino = Windows("master.xlsx")
For Each mihojaorigen In libroorigen.Worksheets
Range("I76:I133").Select
Selection.Copy
For Each mihojadestino In librodestino.Worksheets
Range("I76").Select
ActiveSheet.Paste
Next mihojadestino
Next mihojaorigen
End Sub
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Antoni Masana
Val: 1.259
Plata
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Copiar mismo rango de hojas de un libro a otro

Publicado por Antoni Masana (558 intervenciones) el 18/12/2017 10:10:36
Es más sencillo que lo que estás haciendo.
Además estas pegando los datos de cada hoja origen en todas las hojas destino.
El resultado final es: los datos de la última hoja origen en todas las hojas destino.

1
2
3
4
5
6
7
8
9
10
11
12
Sub prueba_copia()
    Dim Libro_Origen As Workbook
    Dim Libro_Destino As Workbook, mi_Hoja As Worksheet
 
    libro_Origen = Windows("trimestral.xlsx")
    libro_Destino = Windows("master.xlsx")
 
    For Each mi_Hoja In libro_Origen.Worksheets
        Libro_Origen.Sheets(mi_Hoja).Range("I76:I133").Copy
        Libro_Destino.Sheets(mi_Hoja).Range("I76").Paste
    Next
End Sub

El FOR dice:

para la hoja X copia de la columna I las filas del 76 al 133 y lo copias en la hoja X del libro destino (master) en a partir de la celda I76.

La copia se puede poner también así:

1
2
3
4
5
6
7
8
9
10
11
Sub prueba_copia()
    Dim Libro_Origen As Workbook
    Dim Libro_Destino As Workbook, mi_Hoja As Worksheet
 
    libro_Origen = Windows("trimestral.xlsx")
    libro_Destino = Windows("master.xlsx")
 
    For Each mi_Hoja In libro_Origen.Worksheets
        Libro_Origen.Sheets(mi_Hoja).Range("I76:I133").Copy  Libro_Destino.Sheets(mi_Hoja).Range("I76")
    Next
End Sub

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Copiar mismo rango de hojas de un libro a otro

Publicado por Mario (5 intervenciones) el 19/12/2017 09:26:36
Hola Antoni,
Muchísimas gracias por tu comentario. Sigo teniendo dos problemas que hacen que no funcione el código que me propones:

El primero es que libro_Origen=Windows(... No me la reconoce. He tenido que cambiarlo a Set Libro_Origen=Workbooks("trimestral.xlsx"). Y lo mismo con el Libro_Destino.

Solventado ese tema, me sigue dando error la primera línea dentro del bucle FOR (Libro_Origen.Sheets(mi_Hoja...)... El error que me da es de tipo 13 (type mistmatch).

Pongo abajo el código que estaba usando. Es muy frustrante porque tiene pinta de ser algo simple para solucionar esto, pero no lo veo :S.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Sub copia()
Dim Libro_Origen As Workbook
 
Dim Libro_Destino As Workbook, mi_Hoja As Worksheet
 
Set Libro_Origen = Workbooks("trimestral.xlsx")
 
Set Libro_Destino = Workbooks("Master.xlsx")
 
For Each mi_Hoja In Libro_Origen.Worksheets
 
    Libro_Origen.Sheets(mi_Hoja).Range("I76:I133").Copy
 
    Libro_Destino.Sheets(mi_Hoja).Range("I76").Paste
 
Next
 
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.259
Plata
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Copiar mismo rango de hojas de un libro a otro

Publicado por Antoni Masana (558 intervenciones) el 19/12/2017 15:29:53
Prueba esto:

1
2
3
4
5
6
7
8
9
10
11
Sub prueba_copia()
    Dim mi_Hoja As Worksheet
 
    Windows("trimestral.xlsx").Activate
    For Each mi_Hoja In Worksheets
        mi_Hoja.Range("I76:I133").Copy
        Windows("master.xlsm").Activate
        mi_Hoja.Range("I76").PasteSpecial xlPasteAll
        Windows("trimestral.xlsx").Activate
    Next
End Sub

Hay cosas sobre este lenguaje que no acabo de entender. Esta vez lo he probado.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Copiar mismo rango de hojas de un libro a otro

Publicado por Mario (5 intervenciones) el 20/12/2017 10:09:37
De nuevo muchas gracias!
Sigue habiendo un problema, y es que el código asume que la variable mi_Hoja sólo hace referencia a las hojas del libro trimestral y no del libro master. Es curioso porque pensaba que mi_Hoja sólo almacenaría el nombre de la hoja independientemente del libro, pero pareciera que no. El código sólo copia y pega los datos de trimestral a trimestral :S.
Se está resistiendo esto :S.

He probado haciendo este código hoja a hoja y sí funciona, pero claro, tengo que hacer esto unas 30 veces para cada pestaña :S
1
2
3
4
5
6
Windows("Trimestral.xlsx").Activate
Sheets("Portugal").Range("i76:i180").Copy
Windows("Master.xlsx").Activate
Sheets("Portugal").Select
Range("z76").Select
ActiveSheet.Paste
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.259
Plata
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Copiar mismo rango de hojas de un libro a otro

Publicado por Antoni Masana (558 intervenciones) el 20/12/2017 11:11:29
Haber si esto sirve:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub prueba_copia()
    Dim mi_Hoja As Worksheet, Hojas() As String, Num As Integer, a As Integer
 
    Num = 0: ReDim Hojas(Worksheets.Count): Windows("trimestral.xlsx").Activate
 
    For Each mi_Hoja In Worksheets
        Num = Num + 1
        Hojas(Num) = mi_Hoja.Name
    Next
 
    For a = 1 To Num
        Windows("trimestral.xlsx").Sheets(Hojas(a)).Range("I76:I133").Copy
        Windows("master.xlsm").Sheets(Hojas(a)).Range("I76").PasteSpecial xlPasteAll
    Next
End Sub

Primero guardo los nombres de las hojas y despues copia

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Copiar mismo rango de hojas de un libro a otro

Publicado por Mario (5 intervenciones) el 20/12/2017 11:37:38
Hola Antoni, me temo que la línea
1
Windows("trimestral.xlsx").Sheets(Hojas(a)).Range("I76:I133").Copy
me da un error tipo 438 object does not support this property or method
No hay manera...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.259
Plata
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Copiar mismo rango de hojas de un libro a otro

Publicado por Antoni Masana (558 intervenciones) el 20/12/2017 22:48:08
Puedes enviarme los libros, asi podre hacer la prueba y saber en qur falla.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Copiar mismo rango de hojas de un libro a otro

Publicado por Mario (5 intervenciones) el 01/01/2018 19:33:38
Hola Antoni,
Mil gracias por tu ayuda y feliz año. Quería compartir contigo el cómo lo solucioné finalmente (de ahí que no te diera más la tabarra :)).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub prueba_copia()
 
Dim libroorigen As Workbook, librodestino As Workbook
Dim mihojaorigen As Worksheet, mihojadestino As Worksheet
 
 
Set libroorigen = Workbooks("trimestral.xlsx")
Set librodestino = Workbooks("master.xlsx")
 
 
For Each mihojaorigen In libroorigen.Worksheets
   mihojaorigen.Range("I76:i133").Copy
 
        For Each mihojadestino In librodestino.Worksheets
            Range("I76:I133").Select
            ActiveSheet.Paste
        Next mihojadestino
 
Next mihojaorigen
 
End Sub

Lo dicho, gracias por la ayuda y consejos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar