• ベストアンサー

Activeでないシートへのペースト

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

質問者が選んだベストアンサー

  • ベストアンサー
  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.1

シート全体をコピーしたいのですよね? クリップボードを経由する必要はあるのでしょうか。 Sheets("Sheet1").Cells.Copy Sheets("Sheet2").Cells あるいは Sheets("Sheet1").Cells.Copy Sheets("Sheet2").Cells(1, 1) でSheet1をSheet2に直接コピーできますよ。

noname#95859
質問者

お礼

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

その他の回答 (4)

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.5

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のセル全体、あるいは左上のセルを指定してコピーしているのです。

noname#95859
質問者

お礼

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

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 たとえば、 Sub Test() 'Sheets という使い方もあるのですが、Worksheets のほうがはっきりしています。  Worksheets("Sheet1").Cells.Copy  Worksheets("Sheet3").Paste End Sub で、コードは通るはずです。 >worksheets("ペースト先").paste 見たいなものと想像しましたが、だめでした。 自分は、そういうスタイルをあまり書かないだけであっても、それ自体に間違いは見出せません。 どうダメだったのか、実行時エラーでどういう反応をしたか、それが明らかでないと、Copy メソッドにDirection を入れても同じだと思います。おそらく、どこか、別のミスや見落としがあるはずです。たとえば、「インデックスが有効範囲ではありません」という場合、シート名が違っているとか、シート自体が存在しないとか、そういうことが原因ではないでしょうか?

noname#95859
質問者

お礼

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

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

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

noname#95859
質問者

お礼

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

回答No.2

Worksheets("Sheet1").Range("C1:C5").Copy Worksheets("Sheet1").Paste Destination:=Worksheets("ペースト先").Range("D1:D5") こんな感じでヘルプに乗ってますよ。 ヘルプはF1キーで立ち上がります。

noname#95859
質問者

お礼

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

関連するQ&A