マクロ記録でVBA
別のシートにコピーする

Excelマクロの自動記録を使って、エクセルVBAの初心者向け入門解説
公開日:2013年5月以前 最終更新日:2013-02-18

第6回.別のシートにコピーする



前回作成した100マスを別のシートにコピーしてみましょう。


ここでは、「Sheet1」に100マスがあり、それを「Sheet2」へコピーします。

いまは、「Sheet1」が開いていて、セルA1がアクティブになっています。


1.マクロの記録

2.A1~J10を選択

3.コピー

4.「Sheet2」を選択

5.セルA1を選択

6.貼り付け

7.記録終了


作成されたマクロは、


Sub Macro2()
'
' Macro2 Macro
'

'
  Range("A1:J10").Select
  Selection.Copy
  Sheets("Sheet2").Select
  Range("A1").Select
  ActiveSheet.Paste
End Sub


この5行は、上の「マクロの記録」の、2.~6.にそれぞれ該当しています。

1つの操作が1行の記述になっています。


Sheets("Sheet2").Select

これは初めて出てきました。

Sheets(シート名)

これで、シート名のシートを指します。

そして、Select

これは、RangeのSelectと同じで、そのシートをアクティブにします。

つまり、そのシートを開いた状態にします。



では、「Sheet2」のA1~J10が選択されている状態で「Delete」して下さい。

全部消えましたよね。


そして、その状態で、再度このマクロを実行して下さい。


何か変ですよね。

「Sheet2」のA1~J10にコピーの点々が付いていて、100マスがコピーされません。


Range("A1:J10").Select
このような、RangeやCellsは、アクティブなシート(今開いているシート)のセルを指しています。


マクロを記録する時点で、「Sheet1」がアクティブだったので、

Sheets("Sheet1").Select
この記述が漏れているのです。

では、これを先頭に追加して、再度実行して下さい。


Sub Macro2()

  Sheets("Sheet1").Select
  Range("A1:J10").Select
  Selection.Copy
  Sheets("Sheet2").Select
  Range("A1").Select
  ActiveSheet.Paste
End Sub


ちゃんとコピーされましたよね。



では、恒例の消しこみです。


今までの例で行けば、

Select、Selection、ActiveSheet、ActiveCell

は消せる事がわかります、これらを消してつなげると、




Sub Macro2()

  Sheets("Sheet1").Range("A1:J10").Copy
  Sheets("Sheet2").Range("A1").Paste
End Sub


では実行して下さい。


何か、エクセルが怒っていますよね。


Excel VBA 解説


とても、冷たいお言葉をエクセルから頂きましたね。(笑)


「デバッグ」を押して下さい。


Sheets("Sheet2").Range("A1").Paste
の行が、黄色になっています。


つまり、この行はダメだと、エクセルが言っているのです。


逆に考えれば、1行目は良いとも言っています。


この状態を解除するには、


メニューの「実行」→「リセット」です。


では、何がどうダメなのでしょうか。


エクセルは不親切です、そこまで教えてくれません。


Pasteは、

シート.Paste

としか記述できないのです。


ですから、

Sheets("Sheet2").Select
Range("A1").Select
ActiveSheet.Paste
この部分は、省略できないのです。


つまり、

Sub Macro2()

  Sheets("Sheet1").Range("A1:J10").Copy
  Sheets("Sheet2").Select
  Range("A1").Select
  ActiveSheet.Paste
End Sub


となります。



では、次は、値の貼り付けをやってみましょう。


「Sheet2」がアクティブな状態で、全て消しておきます。


1.マクロの記録

2.A1~J10を選択

3.コピー

4.「Sheet2」を選択

5.セルA1を選択

6.「形式を選択して貼り付け」→「値」→「OK」

7.記録終了


作成されたマクロは、


Sub Macro3()
'
' Macro3 Macro
'

'
  Sheets("Sheet1").Select
  Range("A1:J10").Select
  Selection.Copy
  Sheets("Sheet2").Select
  Range("A1").Select
  Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
End Sub


太字の部分が変わりましたよね。


まず、

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False

の、最初の行の最後の部分の「 _」ですが、行の継続をしています。

つまり、1行だと長くなりすぎる場合に、複数行に分けて書くことが出来るのです。

空白1つあけて、「_」(アンダーバー)です。


そして、これが、値の貼り付けになります。


では消しこみをしましょう。


と言っても、最初の3行は、前と同じですし、後半は省略出来ない・・・


いいえ、この場合は省略できるのです。


Sub Macro3()
  Sheets("Sheet1").Range("A1:J10").Copy
  Sheets("Sheet2").Range("A1").PasteSpecial _
    Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
End Sub

行継続の位置をずらしてあります。


先ほどは、

Sheets("Sheet2").Range("A1").Paste

は、エクセルにダメだと言われたのですが、

Sheets("Sheet2").Range("A1").PasteSpecial

は、エクセルが「いいよ」と言ってくれます。


何故かって、・・・私に聞かないで・・・エクセルに聞いて(笑)

これと言った根拠は無いと思います、エクセルを作った人が、たまたまそうしたのだとしか言えません。

この件に関しては、そういうものだと覚えて下さい。



次回は、「.Copy」を使わずに、別の方法で、値をコピーしてみましょう。


いよいよ、VBAの深みに入っていきます。


ここが最初の山場です。


初心者のかなり多くが、ここを理解していないのです。


従って、応用が利かない。


セルの値をコピーする。


いたって基本であり、最も頻繁に使用するはずなのに、


ここの理解が足りていないのです。



これは、入門書と言われる書籍に問題があるのかも知れません。

(すみません、入門書は読んだ事ないので、はっきりとは言えません)


著者は当然分かっているのでしょうが、初心者を混乱させまいとして、


必要最小限の事しか書いていないのです。


しかし、先の原発問題もそうですが、情報不足はかえって危険な事もあります。


ここまで、私も初心者に不要と思われる事は、説明を省略してきました。


しかし、セルの値をコピーするという、極めて基本で重要な事は、しっかり説明します。


これを理解せずして、VBAの理解などあり得ないし、活用などできはしません。





同じテーマ「マクロの記録でVBA」の記事

第3回.複数セルに文字を入れる
第4回.連続数値を入れる
第5回.100マスに数値を入れる
第6回.別のシートにコピーする
第7回.別のシートにコピーする2
第8回.計算式を入れる
第9回.計算式をコピーする
第10回.計算結果を入れる
第11回.イミディエイトで値の確認
第12回.セルに色を塗る
第13回.罫線を引く


新着記事NEW ・・・新着記事一覧を見る

ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.ひらがな⇔カタカナの変換|エクセル基本操作
5.繰り返し処理(For Next)|VBA入門
6.変数宣言のDimとデータ型|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.Findメソッド(Find,FindNext,FindPrevious)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。


このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ