Copiar rango en otro libro

09/07/2007 - 16:47 por maap | Informe spam
Buenas,
Me gustaría saber como puedo con vba, copiar un rango de la hoja
activa a una hoja determinada de un libro que no está abierto, es
decir que excel lo abra automáticamente, copie el rango y cierre el
libro que yo tenía abierto, dejandome en pantalla el que ha abierto
con la macro.
Gracias.
Saludos,

Preguntas similare

Leer las respuestas

#1 Juan M
09/07/2007 - 17:23 | Informe spam
"maap" escribió
Buenas,
Me gustaría saber como puedo con vba, copiar un rango de la hoja
activa a una hoja determinada de un libro que no está abierto, es
decir que excel lo abra automáticamente, copie el rango y cierre el
libro que yo tenía abierto, dejandome en pantalla el que ha abierto
con la macro.
Gracias.
Saludos,



Hola,

Él siguiente código hace lo que quieres más o menos,
Copia el rango A1:A5 de la hoja activa del libro que contiene el código al
rango de igual dimensión empezando en B1 del libro2

Impide la ejecución de macros de apertura del libro2.

Un saludo,
Juan

Inicio Código

Sub CopiaRango()

Dim Destino As Workbook

Application.ScreenUpdating = False
Application.EnableEvents = False
Set Destino = Workbooks.Open("c:\libro2.xls")
Application.EnableEvents = True
ThisWorkbook.Activate
Range("A1:A5").Copy Destino.Worksheets(1).Range("B1")

Destino.Close savechanges:=True
Set Destino = Nothing
Application.ScreenUpdating = True
End Sub

Fin Código
Respuesta Responder a este mensaje
#2 Ivan
09/07/2007 - 18:35 | Informe spam
hola chicos,

aunque la propuesta de Juan creo que lo sintetiza muy bien, como la habia preparado antes de ver la suya aqui va otra
opcion que por el contrario, seguramente es excesivamente rebuscada, pero ya que esta pues ahi va

(abusa de los avisos de error pero bueno, asi ves algunos de los que te puedes encontrar)

si te decides a probarlos, en un modulo normal copia/pega estos codigos y llamalos desde el cuadro macros, un boton,
etc.

''pega desde aqui

Sub Copiar_A_Otro_Libro(ByVal Ruta_Libro As String, _
ByVal Nombre_Libro As String, _
ByVal Nombre_Hoja As String)
Dim EstaHoja As String, Rango As String
With ThisWorkbook
If Nombre_Libro = .Name Or Ruta_Libro = "" _
Or Nombre_Libro = "" Or Nombre_Hoja = "" Then _
MsgBox "Datos incorrectos": Exit Sub
If ActiveSheet.Parent.Name <> .Name Then MsgBox _
"La hoja activa no pertenece a este libro." & vbCr & _
"Antes de continuar activa la hoja adecuada.": Exit Sub
EstaHoja = ActiveSheet.Name: Rango = Selection.Address
On Error Resume Next
Workbooks(Nombre_Libro).Activate
If Err.Number <> 0 Then
Err.Clear
Workbooks.Open Ruta_Libro & "\" & Nombre_Libro
If Err.Number <> 0 Then MsgBox _
"No se puede abrir el libro solicitado." & vbCr & _
"Puede que haya sido eliminado, movido " & vbCr & _
"a otro directorio, o que este protegido." & vbCr & _
vbCr & "Revisalo y vuelve a intentarlo.": Exit Sub
End If
ActiveWorkbook.Worksheets(Nombre_Hoja).Activate
If Err.Number <> 0 Then MsgBox _
"No se encuentra la hoja solicitada." & vbCr & vbCr & _
"Revisa los datos y vuelve a intentarlo.": Exit Sub
On Error GoTo 0

'' esta forma te pega 'TODO' (incl. formulas, formatos, etc) a partir de
'' la primera celda de la primera fila libre de la hoja destino,
'' si prefieres pegar solo valores u otra cosa cambialo por Copy + PasteSpecial

.Worksheets(EstaHoja).Range(Rango).Copy _
ActiveSheet.Range("a65536").End(xlUp).Offset(1)

'' esta otra posibilidad lo pegaria en el mismo rango que en la hoja origen
'' si quieres probarla elimina la comilla simple y ponle una a lo anterior

' .Worksheets(EstaHoja).Range(Rango).Copy ActiveSheet.Range(Rango)

.Close False
End With
End Sub


alguna de las formas de uso podrian ser estas:


'opcion 1: poniendo los nombres de la ruta, el libro y la hoja de
' destino en unas celdas de la hoja de origen (en el ej. k1, k2 y k3)

Sub NombresEnHoja()
Dim ruta As String, nombreL As String, nombreH As String
ruta = Range("k1"): nombreL = Range("k2"): nombreH = Range("k3")
Copiar_A_Otro_Libro ruta, nombreL, nombreH
End Sub

' opcion2: usando cuadros de dialogo Inputbox (hay otros cuadros de dialogo
' mas adecuados, pero para que te hagas una idea

Sub NombresEnHoja_2()
Dim ruta As String, nombreL As String, nombreH As String
ruta = InputBox("Introduce la ruta completa al libro de destino", , ThisWorkbook.Path)
If ruta = "" Then Exit Sub
nombreL = InputBox("Introduce el nombre del libro de destino", , ThisWorkbook.Name)
If nombreL = "" Then Exit Sub
nombreH = InputBox("Introduce la hoja de destino", , ActiveSheet.Name)
If nombreH = "" Then Exit Sub
Copiar_A_Otro_Libro ruta, nombreL, nombreH
End Sub

''pga hasta aqui

como digo, la propuesta de Juan es clara y concisa (aunque si no me equivoco cierra el libro recien abierto, pero ese
'despiste' es subsanable sin problemas(creo)

espero ayude
un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
#3 maap
09/07/2007 - 20:34 | Informe spam
Muchísimas gracias a los dos.
Creo que voy a probar primero la fórmula de Juan, porque el libro a
abrir para pasarle el rango es siempre el mismo.
Lo que quiero hacer es después de formatear una hoja, como resultado
de la exportación de un fichero de una aplicación corporativa, pasarlo
a un libro donde contiene una tabla que sirve como fuente a una tabla
dinámica.

Pero me apunto tus consejos también para estudiar el código puesto que
siempre se aprende de todo.
Lo dicho muchas gracias y confirmaré que me funciona.
Saludos,
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida