2016年6月2日木曜日

【VBA実践】別のシートでコピーしたデータを1つのシートに集約させて、蓄積させていく。

私がVBAをマスターしたいと思った技術の1つです。
誰しもがブック内にあるたくさんのシートにあるデータを
1つのシートにまとめたうえで管理したいと考えたことがあると思います。

もちろん、シートだけでなく他のブックからデータを引っ張ってくることも出来ます。

VBAの勉強を始めようとした私が最初にぶち当たった壁なんですが
これは、マクロの記録だけでは対処のしようがないんです。

マクロの記録とVBAは同じようで同じではないです。

マクロは処理の自動化で
Excel内で作業をした内容を記録させて
同じ動きをさせることが出来る機能なんです。
厳密にいうと、さらに意味は全く違いますが。

VBAはそんな自動化処理をするための文章を
直接書き込む事なんです。

似て非なるもの。
【白い恋人】と【面白い恋人】くらい差があるかもしれません。

そして、VBAには出来て、マクロの記録には出来ないことがあります。

条件により作業内容を変える!ということ。

マクロはやったことを記録して、その通り繰り返すだけ。
VBAは条件に応じてその先の処理内容を変えていくことが出来ます。


すみません、横道にそれましたが
今回のテーマもデータを蓄積させるさせるためには
データが入っている一番下の次のセルに別のデータを張るという作業の繰り返しになります。


ここで必要な大きな作業内容を説明しますと…


・蓄積させたいデータコピーする。
・貼り付けたいシートを選択し、現段階でシート内に
 データが何行目まで入っているかを確認する。
・そのデータの1つ下のセルにデータを貼り付ける。
・蓄積させたいデータが入っているシートの数だけ
 その作業をループする。


大きく分けてその4つ分のコードを書けば、希望の処理を行うことが出来ます。
まず、答えは以下の通りです。
※ブック内一番左側にAll_dataという名前のシートがあり、
以降そのシートにデータを蓄積させる元データのシートがあることを前提としてます。
-------------------------------------------------
Sub test()

Dim scount, row As Long

For scount = 2 To Sheets.Count

    Sheets(scount).Select
    Range("A1").Copy

    Sheets("All_data").Select
    row = Cells(Rows.Count, 1).End(xlUp).row + 1
    Cells(row, 1).Select
    ActiveSheet.Paste

Next scount

End Sub
-------------------------------------------------
※変数は赤文字で表示してます。
この中に上の4つの条件が書かれています。


順序としては以下の通りです。
・蓄積させたいデータが入っているシートの数だけ
 その作業をループする。
For scount = 2 To Sheets.Count
~~処理内容~~
Next scount

ここでFor文というのを使います。
ここでの使い方はシート2シート目から
最後のシートまでの枚数を割り出し、順に処理をしていくという
ループ処理指示になります。

なお、For文に関しては
後日別の記事で詳しくご案内しますね。


・蓄積させたいデータコピーする。
For文で選択されたシートのコピーしたいセルを指示して
コピーします。

Sheets(scount).Select
Range("A1").Copy
この2行です。
なお、RangeプロパティでもCellsプロパティでも、
Rangeプロパティで広い範囲を指定してコピーしてもOKですよ。


・貼り付けたいシートを選択し、現段階でシート内に
 データが何行目まで入っているかを確認する。

Sheets("All_data").Select
row = Cells(Rows.Count, 1).End(xlUp).row + 1
Cells(row, 1).Select

貼り付けるシート、つまりAll_dataというシートを指示してあげます。(1行目)
ここからが魔法の言葉なんですが
Cells(Rows.Count, 1).End(xlUp).rowという記述が
選択しているシートで何行目までデータが入っているかというのを
調べる記述です。
Cells(Rows.Count, 1)1はA列を示してるので
B列の末端を調べるときはここを2に変えてください。
それを変数rowに代入して、Cellsプロパティに当て込んであげればいいわけです。
しかし、End(xlUp).rowの後には必ず【+1】を付け加えてあげてください。
そうじゃないと、ずっと同じ場所にデータが毎回貼り付けられてしまい
蓄積もクソもない、鬼畜の所業になってしまいます。
もっちょいかみ砕いていうと、
データが入っている最終行を割り出したその下にデータを貼り付けたいので
最終行の1つ下、つまり【+1】を付与して1つしたにずらしてあげるわけです。


・そのデータの1つ下のセルにデータを貼り付ける。

ActiveSheet.Paste

あとは選択した箇所にペーストしてあげればOKです。



こんな時、特にCellsプロパティの便利さが実感できます。

たかだか260文字程度を入力するだけで
たくさんのシートにあるデータをかき集めることが出来るのです。

しかも一瞬で。


もちろん、これが全世界の正解ではありません。
VBAはたくさんのやり方が存在します。

これはそんな方法の1つだと思っていただければ思います。


0 件のコメント:

コメントを投稿