VBA編其ノ11 複数のシートのデータをひとつに合体 前編
例えば、同じフォーマットのデータが、ひとつのブックの複数シートに入っているとして。
下↓のサンプルデータのようなケースです※1。
でね、それらをシート1枚に合体する作業※2を想定してほしいんですよ。
…サンプルデータ、手抜きじゃないですよ(笑)。
合体したときの結果がわかりやすいように、「あえて」です、あえて。
さて、眺めていただければわかると思いますが、「ああああ」「いいいい」「うううう」「ええええ」の4つのシートは、件数こそ違いますが、表のつくりは同じになってます。
項目の数も同じ。
項目の構成も、同じと考えてください。
で、コイツを合体したいな、というときに。
この手の↑作業、手作業でやるならコピペ繰り返しになるかと思うのですが、今回はこれを、VBAでやってみたいと思います。
さて、どうなることやら。
今回のマクロの考え方
では、前回同様、最初はイメージ作りから、…とイキたいところなのですが、イメージ作るにしても、何か材料がないと、なかなかむずかしいですよね。 なので、上述の合体作業、手作業だったらどういう動きをするか、一度観察してみましょう。
では、まず、新しい、まっさらなブックを開きます※3。 ここにデータを集約します。
そうしたら、シート「ああああ」の全データをコピーして…※4。
新しいブックに貼り付けます※5 ※6。
次に、「いいいい」の2行目からおしりまでをコピーします※7。 2行目から、最終行まで、です。
貼り付けるのはもちろん、さっき貼り付けた「ああああ」分の次の行からです※8 ※9。
後は、※7~※9の作業を「うううう」「ええええ」と繰り返せばOK。 合体は完了します。
…と、手作業でやるならこんな↑感じになるんじゃないかと思うんですよ。
後は、これをマクロでどうやるか。
ちょっとまとめてみました※10。
各シートの内容をコピーするところは、ループ処理でイケそうですよね※11。
コピペの仕方についてはまだ語ってないので、わからない部分だとは思うのですけど。
…あと、新しいブックを開くやり方もまだですね。
その辺り、順番に学んでいきましょうか。
シートを次々選択する
まず、シート1からシート4まで、1コずつ順番に開いてみましょう。
とりあえず、ループさせないかたちで作ってみました。 今回も、マクロ専用ブック(其ノ11のマクロだけのブック)を作って、そこに書いてくださいね。 で、コイツを動かすと…※12 ※13。
1コずつ開いてくれます。
シートを選択するワードは.selectです。
セルを選択するときと同じですね。
シートの指定はsheets()で行い、かっこの中に数字を入れます。
この()の中の数字は「左から何番目」という意味なので、例えばシートの順番を入れ替えて「うううう」を一番左にもってくると、一番最初に選択される、つまりsheets(1)が「うううう」シートになります。
数字の代わりにsheets("ええええ").selectというかたちで名前で指定することもできます。
この場合、左から何番目にあろうが関係なく「ええええ」を選択できます(「ええええ」というシートが存在しないとエラーになっちゃうけど)。
今回はループ処理をさせたいので、sheets(1)、sheets(2)、sheets(3)…とシート番号で指定する方を使いますが、ただ、シート名を直接指定するやり方も、局面によっては非常に便利です。
なので、頭の片隅に置いておいてください。
では今度は、ループさせるバージョンです。※16 ※17。
sheets(1)からスタートして、iが4を超えたらもう処理しない、という命令にしました※18。
…ですが。
これだと、シート4までしか仕事してくれないんですよ。
シートが5枚のときも、10枚のときも、シート4までしか処理してくれない。
(さらに、この書き方だと、sheets(4)まであることが前提になっているから、もしシートが3枚しかなかったらエラーになっちゃうし。)
僕らがほしいのは、全部のシートを作業してくれるしくみです。
シートが何枚でも、おしりまで作業してくれなければ困ります。
なので、こんな↓ふうに書き換えてみました。
sheets.countというのは「現状存在するシートの数」のことです。
かっこなしの「sheets」で、cellsやrowsと同じく「すべてのシート」を意味します。
「count」は英語で「数」ってことですもんね。
だから、sheets.countは、今回のケースだと「4」になります。
もちろん、シート数を増減させると、sheets.countの値も変わってきますよ。
と、いうことで、コイツを応用すれば、「シートをおしりまで、順々に見に行く」という処理が書けそうです。
コピペする
では次に、コピペの仕方。 コードを3つ紹介します※19ので、コイツをサンプルデータに対して使用してみてください。 コツが掴み取れる、…ハズです。
VBAでコピー&ペーストは、
Rangeオブジェクト.Copy Destination:=宛先
となります。
他にも書き方はあるんだけど、とりあえず基本形を1コ、覚えましょう。
「Sub コピペ練習その1()」を使うと、セル(1, 2)をセル(3, 7)にコピーします※20。
セル1コもRangeオブジェクト、ですよ。
「Sub コピペ練習その2()」は範囲コピーです。 宛先(Destination:=○○)は、左上を始点に指定します※21。 「destination」は「目的地」とか、そんな意味です。
「Sub コピペ練習その3()」では、宛先をシート3のセル(17, 1)に指定しています。
だから、シート1で動かせば、その内容がシート3にコピーされます※22 ※23。
…う~ん、意外に話が長くなってきちゃったから、以下次回!