「黒歴史」教えて下さい

Excel VBA シートのコピー、ペーストに関する質問です。
Sheets("Sheet1").Cells.Copy
ActiveSheet.Paste
これは、機能します。
今、Activeでないシート(例として "ペースト先")へのペーストしたいと
思います。ActiveSheet.Paste に対応する記述がわかりません。
worksheets("ペースト先").paste 見たいなものと想像しましたが、
だめでした。
宜しくお願いいたします。

A 回答 (5件)

シート全体をコピーしたいのですよね?


クリップボードを経由する必要はあるのでしょうか。

Sheets("Sheet1").Cells.Copy Sheets("Sheet2").Cells
あるいは
Sheets("Sheet1").Cells.Copy Sheets("Sheet2").Cells(1, 1)

でSheet1をSheet2に直接コピーできますよ。
    • good
    • 0
この回答へのお礼

ありがとうございます。
目からうろこが落ちる、と言う感じです。
copyの distinationがあるのですね。
小生、長いこと、マクロのレコーディング機能を使ってやっていたので、
全然、気がつかなかったです。
ありがとうございます。

お礼日時:2007/02/03 15:08

No.1です。

補足説明です。

まず質問者様のやり方がうまくいかなかった理由ですが、たとえば、
Worksheets("Sheet1").Range("A1:B2").Copy
と範囲を絞ってコピーした場合、
Worksheets("Sheet2").Paste
とすると、これはSheet2の現在選択されているセルを起点として、Sheet1のA1:B2の内容がコピーされます。Sheet2でD3が選択されている場合、D3:E4にコピーされるわけです。

しかし、これを
Worksheets("Sheet1").Range("A:A").Copy
Worksheets("Sheet2").Paste
とA列全体をコピーした場合、Sheet2で1行目のどこかが選択されていないとエラーになります。そうでないとPasteする際にセルの最大範囲を超えてしまうからです。

それを踏まえてですが、
Sheets("Sheet1").Cells.Copy
では、Sheet1の全範囲をコピーします。そうすると、
Worksheets("Sheet2").Paste
は、上に述べたように貼り付ける先が「コピーした範囲をセルがはみ出さない領域」でなければエラーとなります。しかしコピーした範囲は全セルなので、コピー先シートでA1以外のセルが選択されていない場合は失敗します。A1が選択されている場合(あるいはコピーした範囲と同じく全セルが選択されている場合)のみ、貼り付けが成功します。

これはActiveSheetでも同じで、
ActiveSheet.Paste
がうまくいったのは単に偶然そのシートのA1を選択していたからに過ぎないと思います。実際、A1以外のセルを選択した状態で
Sheets("Sheet1").Cells.Copy
ActiveSheet.Paste
を実行すると、エラーになります。

したがって、回避策としては、「明示的にコピー先のA1セルを指定する(あるいは全セル範囲を指定する)」必要があるわけです。
そうすると、
Sheets("Sheet2").Cells(1, 1).PasteSpecial
あるいは
Sheets("Sheet2").Cells.PasteSpecial
という書き方になります。(Rangeオブジェクトの場合はメソッドはPasteSpecialになります)

ただ、手作業ならいったんクリップボードにコピーして貼り付ける、というのでいいのですが、マクロでやるのであれば、Copyメソッドは貼り付け先を直接指定できる(省略するとクリップボードにコピー)ので、No.1の回答では、

Sheets("Sheet1").Cells.Copy Sheets("Sheet2").Cells
Sheets("Sheet1").Cells.Copy Sheets("Sheet2").Cells(1, 1)

とSheet2のセル全体、あるいは左上のセルを指定してコピーしているのです。
    • good
    • 0
この回答へのお礼

ご親切、本当に感謝します。
ご指摘の通りです。コピー先にて、A1以外のセルが選択されていて、
結果、worksheets("ペースト先").paste がエラーになっていました。
どうしたって、ペースト先のシートをアクティブにしなければいけないのか!(A1を選択するために)、と先に進めないでいました。
皆様のお陰で、copy機能が持つ、destinationを使うことで、解決できる
ことがわかり、本当に感謝しています。
ありがとうございます。

お礼日時:2007/02/03 15:21

こんにちは。



たとえば、
Sub Test()
'Sheets という使い方もあるのですが、Worksheets のほうがはっきりしています。
 Worksheets("Sheet1").Cells.Copy
 Worksheets("Sheet3").Paste
End Sub

で、コードは通るはずです。

>worksheets("ペースト先").paste 見たいなものと想像しましたが、だめでした。

自分は、そういうスタイルをあまり書かないだけであっても、それ自体に間違いは見出せません。

どうダメだったのか、実行時エラーでどういう反応をしたか、それが明らかでないと、Copy メソッドにDirection を入れても同じだと思います。おそらく、どこか、別のミスや見落としがあるはずです。たとえば、「インデックスが有効範囲ではありません」という場合、シート名が違っているとか、シート自体が存在しないとか、そういうことが原因ではないでしょうか?
    • good
    • 0
この回答へのお礼

ありがとうございます。
ペーストするシートにて、A1以外のセルが選択されていました。
皆様のお陰で、コピーに関することは、はっきりと理解できました。
ありがとうございました。

お礼日時:2007/02/03 15:23

Sub test02()


Sheets("Sheet4").Cells.Copy Destination:=Worksheets("Sheet2").Range("A1")
End Sub
でうまくいきそうですが。
値はもちろん、フォント、パターン、ハイパーリンクなどコピーされました。
    • good
    • 0
この回答へのお礼

ありがとうございます。
目からうろこが落ちる、と言う感じです。
ありがとうございます。

お礼日時:2007/02/03 15:11

Worksheets("Sheet1").Range("C1:C5").Copy


Worksheets("Sheet1").Paste Destination:=Worksheets("ペースト先").Range("D1:D5")
こんな感じでヘルプに乗ってますよ。
ヘルプはF1キーで立ち上がります。
    • good
    • 0
この回答へのお礼

ありがとうございます。
目からうろこが落ちる、と言う感じです。
もっとヘルプを探すようにします。
ありがとうございます。

お礼日時:2007/02/03 15:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報