Excelマクロによるコピー(転記)入門

「マクロ コピペ」「マクロ 転記」で検索して当ブログをご覧いただいております。
Excelマクロでのコピー(転記)の基礎をまとめてみました。

DSC00178

※カフェにて by α6400

 

Excelマクロでコピー

 

次のようなデータがあり、シート「4月」の日付(セルA2)をシート「data」のセルA2へコピーするとします。
(シート「4月」には、25行までデータが入っています)

image

 

人の手でやるなら、Ctrl+Cで選択して、Ctrl+Vで貼り付ければ済む話です。
しかしながら、それを繰り返さなければいけません。

もちろん、範囲をまとめて選択して、コピー、貼り付けをすることもできますが、シートが複数あったり、ファイルに分かれていたり、毎月、毎週、毎日やらなければいけないとなると大変です。

 

コピペだけで済む仕事はできるだけ自動化したいものであり、そのほうが人よりも速くて正確にできます。
人とパソコンの役割分担は、それぞれが得意なことをやるのが原則です。

 

Excelマクロでコピーをする場合、主に2つに方法があります。

その1つは、copyを使う方法。

こう書きます。

Sub copy()
 Worksheets("4月").Range("a2").copy Worksheets("data").Range("a2")
End Sub

 

それぞれ、このような意味です。

image

 

実行するとこうなります。

image

 

他のセルも同様に書けばいいのですが、それだと美しくありません。
まとめてコピーするなら、こう書きます。
セルA2からG25を、Range(“a2", “g25")と指定できるのです。

Sub copy()
 Worksheets("4月").Range("a2", "g25").copy Worksheets("data").Range("a2")
End Sub

 

このような意味になります。

image

 

結果はこうなりますが、色(書式)までコピーすると不便な場合もあるでしょう。

image

 

値のみを貼り付けるなら、こう書きます。

Sub copy_value()

 Worksheets("4月").Range("a2", "g25").copy
 Worksheets("data").Range("a2").PasteSpecial Paste:=xlPasteValues

End Sub

 

image

実行するとこうなり、データとしても扱いやすいです。

image

 

 

 

Excelマクロで値(Value)のみ転記

 

もう1つの方法は、値を入力する方法。

こう書きます。
シンプルに = でつなぐだけです。

Sub value()
 Worksheets("data").Range("a2", "g25").value = Worksheets("4月").Range("a2", "g25").value
End Sub

 

意味はこうなります。
コピーのときと違い、シート「data」、「4月」の順で書きます。
〇=△で、「〇に△を入れる」という意味ですので。

image

 

こちらのほうがシンプルで書きやすいです。
特に、1つのセルをコピーするときは、こちらのValueのほうがいいでしょう。

ただ、連続でデータをコピーする場合は、値のみコピーのほうがわかりやすいです。

私は、

・単独でコピー Value

・複数範囲をコピー 値のみ貼り付け

と使っています。

 

コピペの繰り返し

 

これらコピペを繰り返すこともマクロではできます。

 

値のみコピーの場合

Sub copy_value_repeat()
'値のみコピー 繰り返し

    Dim W_s As Worksheet
    For Each W_s In Worksheets
    
        If W_s.Name <> "data" Then
            Dim Sheet_row
            Sheet_row = W_s.Range("a" & Rows.Count).End(xlUp).Row
            
            W_s.Range("a2", "g" & Sheet_row).copy
            
            Dim Data_row
            Data_row = Worksheets("data").Range("a" & Rows.Count).End(xlUp).Row
            
            Worksheets("data").Range("a" & Data_row + 1).PasteSpecial Paste:=xlPasteValues
        End If
    
    Next

End Sub

 

値を入力する場合

Sub value_repeat()
'値を入力 繰り返し

    Dim W_s As Worksheet
    For Each W_s In Worksheets
    
        If W_s.Name <> "data" Then
            Dim Sheet_row
            Sheet_row = W_s.Range("a" & Rows.Count).End(xlUp).Row
            
           
            Dim Data_row
            Data_row = Worksheets("data").Range("a" & Rows.Count).End(xlUp).Row
            
            
            Worksheets("data").Range("a" & Data_row + 1, "g" & Data_row - 1 + Sheet_row).value = W_s.Range("a2", "g" & Sheet_row).value
            
        End If
    
    Next

End Sub

 

値をコピーする方法(前者)で解説すると、4月、5月、6月のシートで繰り返し処理できるように、For Eachを使っていますが、シート「data」は除きたいので、IFで指定しています。
赤い部分がFor Each、黄色い部分がIFで、それぞれ、間にあるプログラムを処理するものです。

 

image

 

コピー元のシート(4月、5月、6月)で、データ数を数えて(Sheet_row)、その範囲までコピーしています。
4月だとデータ数は25でしたが、5月は、20なので、それぞれ指定しなければいけませんが、その部分もマクロに数えてもらうわけです。

image

貼り付け先も、データ数によって場所が変わります。

4月を貼り付けるときは、2行目に貼り付ければいいのですが、

image

image

5月の場合は、すでに4月が貼り付けられているので、2行目だと、データを上書きしてしまいます。

4月のデータの下、つまりシート「data」のデータ数を数えて(Data_row)、25、その25に1を足した場所=26(Data_Row+1)に貼り付けるわけです。

image

image

 

サンプルで、試してみていただければ。
EX-ITサンプル コピペマクロ.xlsm
シートを増やしたり、データを増やしたりしてみると、おもしろいです。

Excelファイルを開き、Alt+F11(Altキー、F11を同時押し)で、プログラムを開いて、該当プログラムのSubからEnd Subの間で、実行ボタンまたはF5を押すとプログラムが動きます。

 

image

 

 

 



■編集後記

昨日は予定なし。
セミナーの準備や新刊の内容練りこみ、各種手続きなど、結構進みました。
午前中はいまいちでしたが。

「1日1新」

Adobeで印鑑データづくり
とある申込

 

■娘(2歳)日記

昨日は、めばえ(雑誌)の付録づくりを。
UFOキャッチャー(クレーンゲーム)でした。
このめばえ、よくできていて、紙でつくる付録のおもちゃは、実際のおもちゃの廉価版。
これで気に入れば、そのおもちゃを買うという導線が実にうまいです。
アイスクリーム屋はそれで買うことになりました。