---topics:すべてのシートをひとつずつ見に行く、コピペ---

VBA編其ノ11 複数のシートのデータをひとつに合体 前編

例えば、同じフォーマットのデータが、ひとつのブックの複数シートに入っているとして。
下↓のサンプルデータのようなケースです※1
でね、それらをシート1枚に合体する作業※2を想定してほしいんですよ。

「ああああ」「いいいい」「うううう」「ええええ」の各シートには、同じフォーマットのデータが入っています
※1 「ああああ」「いいいい」「うううう」「ええええ」の各シートには、同じフォーマットのデータが入っています
ひとつのシートにまとめたい
※2 ひとつのシートにまとめたい

…サンプルデータ、手抜きじゃないですよ(笑)。 合体したときの結果がわかりやすいように、「あえて」です、あえて。
さて、眺めていただければわかると思いますが、「ああああ」「いいいい」「うううう」「ええええ」の4つのシートは、件数こそ違いますが、表のつくりは同じになってます。 項目の数も同じ。 項目の構成も、同じと考えてください。 で、コイツを合体したいな、というときに。
この手の↑作業、手作業でやるならコピペ繰り返しになるかと思うのですが、今回はこれを、VBAでやってみたいと思います。 さて、どうなることやら。

今回のマクロの考え方

では、前回同様、最初はイメージ作りから、…とイキたいところなのですが、イメージ作るにしても、何か材料がないと、なかなかむずかしいですよね。 なので、上述の合体作業、手作業だったらどういう動きをするか、一度観察してみましょう。

では、まず、新しい、まっさらなブックを開きます※3。 ここにデータを集約します。

新しいブックを開いた
※3 新しいブックを開いた 最終的にここにデータをまとめる

そうしたら、シート「ああああ」の全データをコピーして…※4

シート1の全データをコピー もちろんヘッダー(項目名)も
※4 シート1の全データをコピー もちろんヘッダー(項目名)も

新しいブックに貼り付けます※5 ※6

左上を始点として貼りつける
※5 左上を始点として貼り付ける
張り付けた
※6 張り付けた

次に、「いいいい」の2行目からおしりまでをコピーします※7。 2行目から、最終行まで、です。

もうヘッダーはいらないので、2行目から
※7 もうヘッダーはいらないので、2行目から

貼り付けるのはもちろん、さっき貼り付けた「ああああ」分の次の行からです※8 ※9

貼り付け先は、さっき貼り付けた分+1行目
※8 貼り付け先は、さっき貼り付けた分+1行目
「ああああ」と「いいいい」を合体した
※9 「ああああ」と「いいいい」を合体した

後は、※7~※9の作業を「うううう」「ええええ」と繰り返せばOK。 合体は完了します。

…と、手作業でやるならこんな↑感じになるんじゃないかと思うんですよ。 後は、これをマクロでどうやるか。
ちょっとまとめてみました※10

手順をまとめた
※10 手順をまとめた

各シートの内容をコピーするところは、ループ処理でイケそうですよね※11
コピペの仕方についてはまだ語ってないので、わからない部分だとは思うのですけど。

ループ処理が使えそう
※11 ループ処理が使えそう

…あと、新しいブックを開くやり方もまだですね。
その辺り、順番に学んでいきましょうか。

シートを次々選択する

まず、シート1からシート4まで、1コずつ順番に開いてみましょう。

とりあえず、ループさせないかたちで作ってみました。 今回も、マクロ専用ブック(其ノ11のマクロだけのブック)を作って、そこに書いてくださいね。 で、コイツを動かすと…※12 ※13

シート1からシート4まで選択する(だけの)マクロ
※12 シート1からシート4まで選択する(だけの)マクロ
次々開いて、選択されたシート名が表示される
※13 次々開いて、選択されたシート名が表示される

1コずつ開いてくれます。

シートを選択するワードは.selectです。 セルを選択するときと同じですね。 シートの指定はsheets()で行い、かっこの中に数字を入れます。
この()の中の数字は「左から何番目」という意味なので、例えばシートの順番を入れ替えて「うううう」を一番左にもってくると、一番最初に選択される、つまりsheets(1)が「うううう」シートになります。

「うううう」が一番左だと…
※14 「うううう」が一番左だと…
sheets(1)=「うううう」になる
※15 sheets(1)=「うううう」になる

数字の代わりにsheets("ええええ").selectというかたちで名前で指定することもできます。 この場合、左から何番目にあろうが関係なく「ええええ」を選択できます(「ええええ」というシートが存在しないとエラーになっちゃうけど)。
今回はループ処理をさせたいので、sheets(1)、sheets(2)、sheets(3)…とシート番号で指定する方を使いますが、ただ、シート名を直接指定するやり方も、局面によっては非常に便利です。 なので、頭の片隅に置いておいてください。

では今度は、ループさせるバージョンです。※16 ※17

シート1からシート4まで選択するのを、ループ処理でやってみた
※16 シート1からシート4まで選択するのを、ループ処理でやってみた
結果は前と同じ
※17 結果は前と同じ

sheets(1)からスタートして、iが4を超えたらもう処理しない、という命令にしました※18

sheets(1)からsheets(4)まで処理するしくみ
※18 sheets(1)からsheets(4)まで処理するしくみ

…ですが。
これだと、シート4までしか仕事してくれないんですよ。 シートが5枚のときも、10枚のときも、シート4までしか処理してくれない。
(さらに、この書き方だと、sheets(4)まであることが前提になっているから、もしシートが3枚しかなかったらエラーになっちゃうし。)
僕らがほしいのは、全部のシートを作業してくれるしくみです。 シートが何枚でも、おしりまで作業してくれなければ困ります。 なので、こんな↓ふうに書き換えてみました。

sheets.countというのは「現状存在するシートの数」のことです。 かっこなしの「sheets」で、cellsやrowsと同じく「すべてのシート」を意味します。 「count」は英語で「数」ってことですもんね。 だから、sheets.countは、今回のケースだと「4」になります。 もちろん、シート数を増減させると、sheets.countの値も変わってきますよ。

と、いうことで、コイツを応用すれば、「シートをおしりまで、順々に見に行く」という処理が書けそうです。

コピペする

では次に、コピペの仕方。 コードを3つ紹介します※19ので、コイツをサンプルデータに対して使用してみてください。 コツが掴み取れる、…ハズです。

コピペ練習を3つ用意しました
※19 コピペ練習を3つ用意しました

VBAでコピー&ペーストは、

Rangeオブジェクト.Copy Destination:=宛先

となります。 他にも書き方はあるんだけど、とりあえず基本形を1コ、覚えましょう。
「Sub コピペ練習その1()」を使うと、セル(1, 2)をセル(3, 7)にコピーします※20。 セル1コもRangeオブジェクト、ですよ。

セル1コをコピー
※20 セル1コをコピー

「Sub コピペ練習その2()」は範囲コピーです。 宛先(Destination:=○○)は、左上を始点に指定します※21。 「destination」は「目的地」とか、そんな意味です。

セル(1, 1)から(3, 5)までをコピー
※21 セル(1, 1)から(3, 5)までをコピー

「Sub コピペ練習その3()」では、宛先をシート3のセル(17, 1)に指定しています。
だから、シート1で動かせば、その内容がシート3にコピーされます※22 ※23

シート(1)でマクロを動かすと…
※22 シート(1)でマクロを動かすと…
シート(3)のセル(17, 1)にコピー
※23 シート(3)のセル(17, 1)にコピー

…う~ん、意外に話が長くなってきちゃったから、以下次回!

Copyright(C)森田表計算