Copiar un rango de celdas mediante macro

Que tal Fernando!
A ver si me puedes ayudar con esto, ya que estoy un poco espeso.
Te pongo el ejemplo:
Libro: Libro1
A1: dato (por ejemplo 10)
A2: formula= Hoja2!A1
A3: Formula= A1+A2
Lo que quiero es copiar el Rango A1:A3 a otro libro (libro2 por ejemplo) y a la celda A5 (por ejemplo), pero de forma que las celdas del libro1 copiadas se me copien: A1 como dato, A2 como dato y A3 como fórmula, y todo esto de una sola vez y no hacerlo exclusivo para este ejemplo, es decir, que todas aquellas celdas que tengan referencia a otra hoja (codificador !) Me las copie como datos, y se mantengan el resto de fórmulas de la hoja.
Agradecería enormemente tu ayuda
Un abrazo
Nacho
Respuesta
1
Sin lugar a dudas esto sólo puede pensarse en un entorno de VBA. Sin embargo, la condición de que sirva para cualquier situación puede admitir muchas variantes.
En principio pensaría en dos pasadas: Una que pegue todo como valor y la siguiente que restablezca las fórmulas en aquellas que no referencien otra hoja. Pero para que este copiado de fórmulas funcione correctamente, deberás ser sumamente cuidadoso en el uso de las referencias relativas y absolutas de tales fórmulas.
De cualquier forma no será sencillo.
Sigue una macro que, en principio, resuelve tu problema. Pega la siguiente en un modulo nuevo:
Sub pastesel()
Dim MyArea As Range
Dim V_Book0, V_Book, V_Sheet, V_Cell As String
Dim countlines As Single
Set MyArea = Range(Selection.Address)
countlines = 0
V_Book0 = ThisWorkbook.Name
V_Book = InputBox("Ingrese Nombre del libro", "LIBRO?")
V_Sheet = InputBox("Ingrese Nombre de la hoja", "HOJA?")
V_Cell = InputBox("Ingrese celda inicial para el pegado", "CELDA?")
If Right(V_Book, 4) <> ".xls" Then V_Book = V_Book & ".xls"
MyArea.Copy
Windows(V_Book).Activate
Sheets(V_Sheet).Select
Range(V_Cell).Select
ActiveCell.PasteSpecial xlPasteValues
Windows(V_Book0).Activate
MyArea.Select
For Each cell In MyArea
If InStr(1, ActiveCell.Formula, "=") > 0 Then
If InStr(1, ActiveCell.Formula, "!") = 0 Then
ActiveCell.Copy
Windows(V_Book).Activate
Sheets(V_Sheet).Select
Range(V_Cell).Offset(countlines).Select
ActiveSheet.Paste
Windows(V_Book0).Activate
End If
End If
countlines = countlines + 1
ActiveCell.Offset(1).Select
Next
End Sub
---
Primero asegúrate de que el libro de destino también esté abierto junto con el que tiene la macro y los datos a transferir.
Selecciona el área a copiar, de una columna de ancho, y dispará la macro "pastesel"
Verás una rutina primitiva que te solicitará el nombre del libro, hoja y celda (inicial) de destino, uno por vez. Fue la forma más rápida para probar el macro aunque de hecho existen fromas más sofisticadas de resolverlo.
Funcionó para las pruebas que le hice.
Intentalo y comentame.
Un abrazo!
Fernando
Mil gracias Fernando,
Funciona perfectamente, no obstante solo con las siguientes condiciones:
1. Que el libro al que se pega esté previamente guardado
2. Funciona celda por celda, pero no para el rango entero seleccionado.
Si tienes una solución rápida para esto me contestas, pero no te preocupes porque ya me iré estrujando la cabeza para conseguir lo que quiero.
Yo había ideado una macro que intentaba hacer esto, no obstante no había podido efectuar lo que te pedía. El código era tal que así:
Sub pasaranuevahoja()
'
' pasaranuevahoja Macro
' Macro grabada el 04/10/2001 por ICP
'
'
Selection.SpecialCells(xlCellTypeVisible).Select
Selection.Copy
Workbooks.Add
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Selection.PasteSpecial Paste:=xlFormats, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Application.CutCopyMode = False
With Selection.Font
.Name = "CG Omega"
.Size = 9
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
End With
Selection.Columns.AutoFit
End Sub
Intentaré sobre esta conseguir lo otro.
Gracias, (contestame algo y finalizare la pregunta .. con un 5 por supuesto)
Un abrazo y gracias de nuevo
Estoy sorprendido.
Esta macro funciona para TODO un rango seleccionado, no celda por celda.
Antes de ejecutarla, toma (= selecciona = pinta) un rango con las celdas a copiar, digamos "B4:B50" (nota que debes considerara una columna por vez). Luego ejecuta la macro y ella copiará los valores y fórmulas en ese rango al otro libro.
Respecto a tu primer nota, esta macro abre el archivo que le indiques en ella misma. Escribe su nombre y path en el lugar que te marco.
Verás que la macro, ahora, sólo te pedirá hoja y celda.
Sub pastesel()
Dim MyArea As Range
Dim V_Book0, V_Book, V_Sheet, V_Cell As String
Dim countlines As Single
'=== NACHO: tipea aquí el path y nombre del archivo de destino:
V_Book = "C:\Mis documentos\ichova\Miarchivo.xls"
'======================
V_Book0 = ThisWorkbook.Name
Set MyArea = Range(Selection.Address)
countlines = 0
Workbooks.Open V_Book
V_Book = ThisWorkbook.Name
Windows(V_Book0).Activate
V_Sheet = InputBox("Ingrese Nombre de la hoja", "HOJA?")
V_Cell = InputBox("Ingrese celda inicial para el pegado", "CELDA?")
If Right(V_Book, 4) <> ".xls" Then V_Book = V_Book & ".xls"
MyArea.Copy
Windows(V_Book).Activate
Sheets(V_Sheet).Select
Range(V_Cell).Select
ActiveCell.PasteSpecial xlPasteValues
Windows(V_Book0).Activate
MyArea.Select
For Each cell In MyArea
If InStr(1, ActiveCell.Formula, "=") > 0 Then
If InStr(1, ActiveCell.Formula, "!") = 0 Then
ActiveCell.Copy
Windows(V_Book).Activate
Sheets(V_Sheet).Select
Range(V_Cell).Offset(countlines).Select
ActiveSheet.Paste
Windows(V_Book0).Activate
End If
End If
countlines = countlines + 1
ActiveCell.Offset(1).Select
Next
Application.CutCopyMode = False
End Sub
---
Te agradezco que quieras finalizar esta pregunta, pues en los 2 últimos días habré respondido una docena de preguntas y ninguna fue finalizada. ¿Costará tanto poner un comentario simple después de que uno pensó y tipeó tanto?
En fin, aún así, si te quedaron dudas sobre esto, NO la finalices, preguname de nuevo.
Un gran abrazo!
Fernando

Añade tu respuesta

Haz clic para o