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

He escrito el siguiente código y veo continuamente que el método de clase pastespecial ha fallado . Intenté superar este problema, pero nada parece funcionar. Intento copiar una hoja entera de un libro de trabajo 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 

Esto debería hacerlo, avíseme si tiene problemas con esto:

 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, puedes 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, almacene el valor como una variable y escriba 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 (100k filas) se observa que el Portapapeles en realidad supera al volcado de la matriz:

Copiar / PegarSpecial vs Range.Value = Range.Value

Dicho esto, hay otras consideraciones aparte de la velocidad, y puede ser que el rendimiento alcanzado en un gran conjunto de datos valga la pena compensar, para evitar interactuar con el Portapapeles.

Copiaste usando Cells.
Si es así, no es necesario que PasteSpecial ya que está copiando datos exactamente en el mismo formato.
Aquí está tu 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 especial, use un rango dynamic (“Dirección”) para copiar.
Me gusta esto:

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

Tome nota de : dos puntos después de .Copy que es un carácter de Statement Separating .Copy .
El uso de Object.PasteSpecial requiere ser ejecutado en una nueva línea.
Espero que esto te ayude