今回は、Q7で取り扱った別のワークシートへのコピーをもう一度取り扱って行こうと思います。
というのも、Q7の時は3シート分のデータを別シートへコピーするというものでした。
その為、かなり単調なコードにしてしまったからです。
今回は、13人分のデータを用意しました。(Q8参照)
こちらです。
前回の3人+10人分のデータが追加されています。
これらのシートにある名前とそれぞれの得点を一つのシートに集約するマクロを作ってみましょう。
■ポイント
ループ処理を利用することで、効率的に書くことができます。
どこからどこのデータを取得したくて、それをどのように記述するかを考えていくのが今回のポイントです。
ただ単に、記載するだけなら、Q7の時のように単純に記述すればいいだけですからね。
だけど、そうすると今回の数が多くなってきたときに不便になります。
今回は、その不便さをどうやって解消するかがポイントとなります。
■回答
Sub Q9_Answer()
Dim i As Integer
Dim StartRow As Integer
StartRow = 3
For i = 3 To Worksheets.Count
Worksheets("全体").Range("B" & StartRow).Value = Worksheets(i).Range("B3").Value
Worksheets("全体").Range("C" & StartRow).Value = Worksheets(i).Range("C3").Value
Worksheets("全体").Range("D" & StartRow).Value = Worksheets(i).Range("D3").Value
Worksheets("全体").Range("E" & StartRow).Value = Worksheets(i).Range("E3").Value
StartRow = StartRow + 1
Next i
End Sub
■解説
まず、StartRowについて。StartRowは集約するシートの記載する最初の行を表しています。
今回は、3行目で、データシートの最初のインデックス番号である3とたまたま一致していたので、StartRowに関する記述をすべて無くして、iにすることで同様のことを実現できますが、
可読性なども考慮し、今回のようにしています。
次に、For文ですが、i = 3と3からループが始まっていますね。
これは、データシートの最初のインデックス番号を表しています。
インデックス番号は左から1から順番に振られていきます。
なので、これ以前に別にシートを挿入してしまうと、動作がうまくいきません。
マクロを使う環境に合わせて適宜変えていく必要があります。
今回は、データシート以外は固定である前提で作成しています。
そして、最後が代入する値をWorksheets(i).Range("B3").Valueと
インデックス番号を使用して記述していることです。
こうすることでもし仮にデータシートが増えたとしても一切手を加えることなく、
同様の処理を行うことができます。
極端な話、1000件分のデータや10000件分のデータも取り扱うことができます。
最後にマクロを実行し、集約した後の画像を掲載しておきます。