web-dev-qa-db-fra.com

Copier d'un classeur et coller dans un autre

J'ai écrit le code suivant et vois continuellement la méthode pastespecial de la classe a échoué. J'ai essayé de surmonter ce problème, mais rien ne semble fonctionner. J'essaie de copier une feuille entière d'un livre de travail et de la coller dans un autre:

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
25
user2832896

Cela devrait le faire, laissez-moi savoir si vous avez des problèmes avec:

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

Alternativement, vous pouvez simplement:

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

Pour étendre cela à la feuille entière:

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

Et encore une autre façon, stockez la valeur en tant que variable et écrivez-la dans la destination:

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

La dernière méthode ci-dessus est généralement la plus rapide pour la plupart des applications, mais notez que pour les très grands ensembles de données (100 000 lignes), il est observé que le Presse-papiers surpasse le vidage de tableau:

Copier/CollerSpécial vs Range.Value = Range.Value

Cela dit, il existe d'autres considérations que la simple vitesse, et il se peut que la performance atteinte sur un ensemble de données volumineux en vaille la peine, à éviter interagir avec le Presse-papiers.

65
David Zemens

Vous avez copié en utilisant des cellules.
Si tel est le cas, inutile de cliquer sur Coller spécial puisque vous copiez des données exactement au même format.
Voici votre code avec quelques corrections.

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

Si toutefois vous souhaitez vraiment coller des éléments spéciaux, utilisez une plage dynamique ("Adresse") pour la copie.
Comme ça:

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

Prenez note du point : après le .Copy qui est un caractère Statement Separating.
Utiliser Object.PasteSpecial nécessite d'être exécuté sur une nouvelle ligne.
J'espère que cela vous fait avancer.

5
L42