前回の続きになります。
シート数の取得について
これは以下の記述で簡単に取得できます。
任意の変数 = Sheets.Count
ただし、このままだと全シート数が取得されてしまいます。
なので上の数から1(集約されるシート分)を引いた数を対象とする必要があります。
しかし自分の場合は、これ以外に機能を追加した場合に新しくシートを追加することもあるかもしれないと考え、新しくシートを追加した後、エクセル上で以下の対策をしました。
a-b=c
a…上述の任意の変数
b…除外するシート数を手入力で行う
c…集約させたいシート数
※cに関してはセル内にIF文を入れ、aに数値が入っていればa-bの結果を表示、入っていなければ何も表示させないようにしました。
イメージとしてはこんな感じ
このcという変数が今後必要な数値になります。
その1のおさらい
ここで再度作りたいものの完成形を見返してみましょう。
この画像であればデータ元のシート数は3であり、シート1つ目のデータ内容がB列にあたります。項目名称が一致した場合のコピペ先の処理は変数を使って以下のようになります。
元データシート数…m
集約データの行数…n
元データの行数…n(必要のない行も含まれますが、他にいい案がないので無視します)
ループする変数
i…集約データの最終行まで
j…元データシートの最後まで
k…元データの最終行まで
For j = 1 To m
For i = 1 To n
For k = 1 To n
If 集約のシート.Cells(i,1).Value = Sheets(j).Cells(k,1).Value Then
Sheets(j).Cells(k,2).Copy
集約のシート.Cells(i,j+1).Select
ActiveSheet.Paste
Else : 集約のシート.Cells(i,j+1).Select
Selection.ボーダー処理
End If
Next k
Next i
Next j
まとめ
きっと詳しい人だともっと効率のいい方法を考え付くのだと思いますが、とりあえずはこれでいいのかなと思いました。
その1に戻りますが、集約データのシートのA列は手入力で入力していました。そこで自動でする方法として、以下を考えました。
- 左端のシートのA列を新しいシートにコピー
- 左から2番目のシートのA列をコピペしたすぐ下のセルに張り付け
- 最後のシートまで繰り返し
- 完了後、重複する項目を削除
次回はその説明を行いたいと思います。