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