Copie de un libro de trabajo y péguelo en otro

Resuelto user2832896 asked hace 11 años • 2 respuestas

He escrito el siguiente código y lo veo continuamente pastespecial method of class has failed. Intenté superar este problema, pero nada parece funcionar. Estoy intentando copiar una hoja completa de un libro y pegarla en otro:

Set x = Workbooks.Open(" path to copying book ")
Workbooks.Open(" path to copying book ").Activate
Range("A1").Select
'Cells.Select
Selection.Copy
Set y = Workbooks.Open("path to pasting book")
Workbooks.Open("Path to pasting book").Activate

With y
    Sheets("sheetname").Cells.Select
    Range("A1").PasteSpecial
    'Sheets("sheetname").PasteSpecial
    .Close
End With

With x
    .Close
End With
user2832896 avatar Oct 14 '13 07:10 user2832896
Aceptado

Esto debería ser suficiente, avíseme si tiene problemas con él:

Sub foo()
Dim x As Workbook
Dim y As Workbook

'## Open both workbooks first:
Set x = Workbooks.Open(" path to copying book ")
Set y = Workbooks.Open(" path to destination book ")

'Now, copy what you want from x:
x.Sheets("name of copying sheet").Range("A1").Copy

'Now, paste to y worksheet:
y.Sheets("sheetname").Range("A1").PasteSpecial

'Close x:
x.Close

End Sub

Alternativamente, podrías simplemente:

Sub foo2()
Dim x As Workbook
Dim y As Workbook

'## Open both workbooks first:
Set x = Workbooks.Open(" path to copying book ")
Set y = Workbooks.Open(" path to destination book ")

'Now, transfer values from x to y:
y.Sheets("sheetname").Range("A1").Value = x.Sheets("name of copying sheet").Range("A1") 

'Close x:
x.Close

End Sub

Para extender esto a toda la hoja:

With x.Sheets("name of copying sheet").UsedRange
    'Now, paste to y worksheet:
    y.Sheets("sheet name").Range("A1").Resize( _
        .Rows.Count, .Columns.Count) = .Value
End With

Y otra forma más, almacenar el valor como una variable y escribir la variable en el destino:

Sub foo3()
Dim x As Workbook
Dim y As Workbook
Dim vals as Variant

'## Open both workbooks first:
Set x = Workbooks.Open(" path to copying book ")
Set y = Workbooks.Open(" path to destination book ")

'Store the value in a variable:
vals = x.Sheets("name of sheet").Range("A1").Value

'Use the variable to assign a value to the other file/sheet:
y.Sheets("sheetname").Range("A1").Value = vals 

'Close x:
x.Close

End Sub

El último método anterior suele ser el más rápido para la mayoría de las aplicaciones, pero tenga en cuenta que para conjuntos de datos muy grandes (100.000 filas) se observa que el Portapapeles en realidad supera al volcado de matriz:

Copiar/Pegar Especial vs Rango.Valor = Rango.Valor

Dicho esto, hay otras consideraciones además de la velocidad, y puede darse el caso de que valga la pena compensar el impacto en el rendimiento en un conjunto de datos grande, para evitar interactuar con el Portapapeles.

David Zemens avatar Oct 14 '2013 01:10 David Zemens

Copiaste usando Celdas.
Si es así, no es necesario realizar PasteSpecial ya que está copiando datos exactamente en el mismo formato.
Aquí está su código con algunas correcciones.

Dim x As Workbook, y As Workbook
Dim ws1 As Worksheet, ws2 As Worksheet

Set x = Workbooks.Open("path to copying book")
Set y = Workbooks.Open("path to pasting book")

Set ws1 = x.Sheets("Sheet you want to copy from")
Set ws2 = y.Sheets("Sheet you want to copy to")

ws1.Cells.Copy ws2.cells
y.Close True
x.Close False

Sin embargo, si realmente desea pegar algo especial, utilice un rango dinámico ("Dirección") para copiar.
Como esto:

ws1.Range("Address").Copy: ws2.Range("A1").PasteSpecial xlPasteValues
y.Close True
x.Close False

Tome nota de los :dos puntos después de .Copycuál es un Statement Separatingcarácter.
El uso Object.PasteSpecialrequiere ser ejecutado en una nueva línea.
Espero que esto te ayude.

L42 avatar Oct 14 '2013 03:10 L42