web-dev-qa-db-ja.com

あるブックからコピーして別のブックに貼り付ける

私は次のコードを書いて、継続的にクラスの過去のメソッドが失敗しましたを参照しています。私はこの問題を克服しようとしましたが、何もうまくいかないようです。あるワークブックからシート全体をコピーして、別のブックに貼り付けようとしています。

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

これでうまくいくはずです。問題がある場合はお知らせください。

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

または、次のことができます。

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

これをシート全体に拡張するには:

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

さらに別の方法として、値を変数として保存し、変数を宛先に書き込みます。

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

上記の最後の方法は、通常、ほとんどのアプリケーションで最も高速ですが、非常に大きなデータセット(10万行)の場合、クリップボードが実際に配列ダンプを上回ることが観察されていることに注意してください。

コピー/貼り付けスペシャルvs Range.Value = Range.Value

とはいえ、速度だけでなくotherの考慮事項があり、大きなデータセットでのパフォーマンスヒットはトレードオフの価値がある場合があります。クリップボードとの対話。

65
David Zemens

Cellsを使用してコピーしました。
その場合、データをまったく同じ形式でコピーするため、PasteSpecialは不要です。
これは、いくつかの修正を加えたコードです。

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

ただし、本当に特別に貼り付けたい場合は、ダイナミックRange( "Address")を使用してコピーしてください。
このような:

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

:文字の後の.Copyの後のStatement Separatingコロンに注意してください。
Object.PasteSpecialを使用するには、新しい行で実行する必要があります。
これでうまくいくことを願っています。

5
L42