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

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

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



前回は、値の貼り付けを「マクロの記録」で行い、そのマクロを修正しました。


以下になります。


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


今回は、同じ事を「.COPY」を使わずにやってみましょう。


そもそも、これは何をしているかと言うと、


「.COPY」で、セルをクリップボードに入れ、


クリップボードの値のみセルに入れています。


そこで、クリップボードの代わりに、変数へ入れてから、セルに入れてみましょう。


Sub Macro4()
  Dim ClipBoard
  ClipBoard = Sheets("Sheet1").Range("A1:J10")
  Sheets("Sheet2").Range("A1:J10") = ClipBoard
End Sub


変数ClipBoardに入れ、その変数をセルに入れています。


Sheets("Sheet1").Range("A1:J10").Copy

ClipBoard = Sheets("Sheet1").Range("A1:J10")
そして、

Sheets("Sheet2").Range("A1").PasteSpecial _
    Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Sheets("Sheet2").Range("A1:J10") = ClipBoard

と、同じように記述しています。


ClipBoard = Sheets("Sheet1").Range("A1:J10")

は、

ClipBoard ← Sheets("Sheet1").Range("A1:J10")

ですね、セルの値を変数に入れます。


Sheets("Sheet2").Range("A1:J10") = ClipBoard
は、

Sheets("Sheet2").Range("A1:J10") ← ClipBoard
です、変数の値をセルに入れています。


では、実行してみましょう。


ちゃんとコピー出来ちゃいましたね。


簡単ですね。


複数のセルを1つの変数に入れられるんだ・・・


入れられるのです。


どのように入っているか・・・その説明は、大分先になります。


今は、これで出来ると言う事だけ覚えて下さい。



でも、上をさらに簡潔にまとめると、


Sheets("Sheet2").Range("A1:J10") ← ClipBoard ← Sheets("Sheet1").Range("A1:J10")


ということですよね。


それなら、直接入れられないのって思いますよね。


つまり、



Sub Macro5()
  Sheets("Sheet2").Range("A1:J10") = Sheets("Sheet1").Range("A1:J10")

End Sub


これで良さそうに思えます。


では、実行してみて下さい。


何も変化が無かったはずです。

(あっ、ちゃんと、Sheet2の内容は消してから実行して下さいね。)


どうなっているのでしょうか。


この指定はダメなのです。しょぼん


でも、


Sub Macro6()
  Sheets("Sheet2").Range("A1") = Sheets("Sheet1").Range("A1")

End Sub


このように、1つのセルだけでやってみて下さい。


どうです、コピーされましたよね。


では、複数セルの場合は、一度変数に入れないといけないのでしょうか。


いやいや、これなら、コピーできます。


Sub Macro7()
Sheets("Sheet2").Range("A1:J10").FormulaR1C1 = Sheets("Sheet1").Range("A1:J10").FormulaR1C1
End Sub


前に、FormulaR1C1は要らないと言いましたが、復活です。


突然の復活ですね。


なんなんだー、と言いたいですか・・・私も言いたい(笑)


FormulaR1C1は要らないと言いましたが、それは値を入れる時のことです。


つまり、上も、


Sheets("Sheet2").Range("A1:J10") = Sheets("Sheet1").Range("A1:J10").FormulaR1C1


これならOKです。



上記は、普通は(多くの場合、多くの人がという意味です)、


FormulaR1C1ではなく、Valueを使って、


Sheets("Sheet2").Range("A1:J10").Value = Sheets("Sheet1").Range("A1:J10").Value


と記述します。


しかし、マクロの記録では、FormulaR1C1に値を入れています。


何故なのか、何が違うのか、Valueとは何か、FormulaR1C1とは何か・・・


それは、計算式をセルに入れる時まで、置いておきましょう。


Valueとの違いをその時に説明します。


ただ、当面は、文字や数値を入れる場合は、Valueを使うと覚えて下さい。



まとめると、値を入れる時(=の左にある時)は、FormulaR1C1を省略して良いが


値を取得(=の右にある時)は、FormulaR1C1を省略してはいけない。


ですから、セルの値を、他のセルに入れる時は、


Sheets(シート名).Range(範囲).FormulaR1C1 = Sheets(シート名).Range(範囲).FormulaR1C1

または、
Sheets(シート名).Range(範囲).Value = Sheets(シート名).Range(範囲).Value


のように、省略せずに書いて下さい。


または、


変数 = Sheets(シート名).Range(範囲)
Sheets(シート名).Range(範囲) = 変数


のように、一旦変数にいれてから、セルにいれます。



今回は、さらに、100マスを作った時のマクロを手直しして、コピーしてみましょう。


元は、


Sub Macro1()
  Dim i
  Dim j
  Dim k
  i = 1
  k = 1
  Do While i <= 10
    j = 1
    Do While j <= 10
     Cells(i, j) = k
     k = k + 1
     j = j + 1
    Loop
    i = i + 1
  Loop
End Sub


これを手直しして、


Sub Macro1()
  Dim i
  Dim j
  i = 1
  Do While i <= 10
    j = 1
    Do While j <= 10
     Sheets("Sheet2").Cells(i, j) = Sheets("Sheet1").Cells(i, j)
     j = j + 1
    Loop
    i = i + 1
  Loop
End Sub


太字の部分の違いと、変数kが不要になっています。


このプログラムが基本だと言いました。


つまりは、こういうことなのです。


これさえ書けるのなら、大抵のことは出来てしまうのです。


多少プログラムが長くても、大した問題ではありません。


コピペすれば一瞬で完成するのですから。


そして、今後も頻繁に使用することになるでしょう。


ですから、このプログラムだけは、絶対に体得して下さい。





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

第4回.連続数値を入れる
第5回.100マスに数値を入れる
第6回.別のシートにコピーする
第7回.別のシートにコピーする2
第8回.計算式を入れる
第9回.計算式をコピーする
第10回.計算結果を入れる
第11回.イミディエイトで値の確認
第12回.セルに色を塗る
第13回.罫線を引く
第14回.行列を入れ替えて貼り付け


新着記事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」をお願いいたします。
本文下部へ