それでは、前回の①「個人シート(sheet)のアンケート結果をサマリーシート(sheet)の一覧表に転記する」 処理を見ていきましょう。
習得した知識を使ってプログラムを書いてみる
別シートの値を転記するのは、過去の回でやりましたね。第4回だったと思います。その内容を思いだしながら実践してみてください。名前のところ以外は記述できると思います。
まずは、山田さんのアンケート結果のみをプログラムしてみましょう。
Visual Basic
Sub sample()
Worksheets(“サマリー”).Range(“D4”).Value = _
Worksheets(“山田”).Range(“D5”).Value
Worksheets(“サマリー”).Range(“E4”).Value = _
Worksheets(“山田”).Range(“D6”).Value
Worksheets(“サマリー”).Range(“F4”).Value = _
Worksheets(“山田”).Range(“D7”).Value
End Sub
どうでしょうか。第4回の内容をそのまま使って書いてみました。
イコール(=)の左側にはサマリーシート(sheet)のセル(Cell)を指定していて、右側に山田シート(sheet)のセル(Cell)を指定していますね。思い出しましたでしょうか。
なので、これを3人分書いてしまえば問題は解決。ということになるので、書いてみましょう。
Visual Basic
Sub sample()
‘山田さんの転記
Worksheets(“サマリー”).Range(“D4”).Value = _
Worksheets(“山田”).Range(“D5”).Value
Worksheets(“サマリー”).Range(“E4”).Value = _
Worksheets(“山田”).Range(“D6”).Value
Worksheets(“サマリー”).Range(“F4”).Value = _
Worksheets(“山田”).Range(“D7”).Value
‘田中さんの転記
Worksheets(“サマリー”).Range(“D5”).Value = _
Worksheets(“田中”).Range(“D5”).Value
Worksheets(“サマリー”).Range(“E5”).Value = _
Worksheets(“田中”).Range(“D6”).Value
Worksheets(“サマリー”).Range(“F5”).Value = _
Worksheets(“田中”).Range(“D7”).Value
‘鈴木さんの転記
Worksheets(“サマリー”).Range(“D6”).Value = _
Worksheets(“鈴木”).Range(“D5”).Value
Worksheets(“サマリー”).Range(“E6”).Value = _
Worksheets(“鈴木”).Range(“D6”).Value
Worksheets(“サマリー”).Range(“F6”).Value = _
Worksheets(“鈴木”).Range(“D7”).Value
End Sub
個人シート(Sheet)のシート名の変更と、サマリーシート(Sheet)の出力先を一行ずつずらしていることが読み取れるでしょうか。
実行結果を見てみましょう。
どうでしょうか。同じ状況になっていますか。後は名前が入ればやりたいことは完了します。
シート名を書き出す・・予定でしたが・・
前回の投稿ではシート名を名前に出すという説明をしました。ただ、プログラムを見てもらうと分けるのですが、すでにセル(Cell)の転記の段階でシート名を指定しています。
思いっきり「山田」と書いてますね。つまり、このプログラムを書いた人はシート名が「山田」であるという事を知っていることになります。
「何を当たり前のことを言い始めたのだろうか、この人は?」と思っている方もいるかもしれません。確かにその通りで、当たり前のことを言っています。何を伝えたいかと言いますと、シート名を指定しなくても、シート名を知っているならば、普通に「山田」をセルに代入するプログラムを書けばよいのではないでしょうか。
ということで、名前を入れた状態でのプログラムは以下のようになります。
Visual Basic
Sub sample()
‘山田さんの転記
Worksheets(“サマリー”).Range(“C4”).Value = “山田” ‘追加
Worksheets(“サマリー”).Range(“D4”).Value = _
Worksheets(“山田”).Range(“D5”).Value
Worksheets(“サマリー”).Range(“E4”).Value = _
Worksheets(“山田”).Range(“D6”).Value
Worksheets(“サマリー”).Range(“F4”).Value = _
Worksheets(“山田”).Range(“D7”).Value
‘田中さんの転記
Worksheets(“サマリー”).Range(“C5”).Value = “田中” ‘追加
Worksheets(“サマリー”).Range(“D5”).Value = _
Worksheets(“田中”).Range(“D5”).Value
Worksheets(“サマリー”).Range(“E5”).Value = _
Worksheets(“田中”).Range(“D6”).Value
Worksheets(“サマリー”).Range(“F5”).Value = _
Worksheets(“田中”).Range(“D7”).Value
‘鈴木さんの転記
Worksheets(“サマリー”).Range(“C6”).Value = “鈴木” ‘追加
Worksheets(“サマリー”).Range(“D6”).Value = _
Worksheets(“鈴木”).Range(“D5”).Value
Worksheets(“サマリー”).Range(“E6”).Value = _
Worksheets(“鈴木”).Range(“D6”).Value
Worksheets(“サマリー”).Range(“F6”).Value = _
Worksheets(“鈴木”).Range(“D7”).Value
End Sub
先ほどのプログラムから3行追加されただけです。個別に「山田」「田中」「鈴木」の名前を代入している行が確認できると思います。追加のコメントを入れてある部分です。実行結果も以下の通りうまくいきました。
3名固定であれば・・・
さて、これはこれで立派なプログラムですし、問題なく動くと思います。これまでの知識を使って正確にやりたいことを表現しています。
ただ、従業員が3名だけであれば、このプログラムでも良いのかもしれませんが、「え、うちの会社、100名ちょっといるんですけど。これ100回書くんですか。」や「従業員の退職や中途が採用されたり、結婚して名前が変わったりするたびにプログラムを見返して『名前間違っていないかな?』『人数あってるかな?』と確認しなければいけないのでしょうか。」という心の声が漏れてきそうです。そもそも、従業員が3名だったら、それほど困っていないのでプログラムも組みませんよね。
そうなんです。このような”固定的な”プログラムの書き方をしてしまうと、元データに慢性的な動きがある場合、そのメンテナンス(プログラムの修正)のコストが大きな問題になることが少なくありません。せっかく自動化したつもりが毎々”手動”の確認と修正を行っていては、本末転倒というものです。一度書いたプログラムは基本的には触らずに毎回実行だけしたいものです。
シート(Sheet)の数だけ処理を繰り返す
上記の問題を解決する方法が実はVBAというプログラムだけではなく、世の中のプログラムの全般に備えられています。それが「繰り返し処理」です。
「繰り返し処理」は与えられた条件の間、同じ処理を繰り返してくれます。”同じ処理”といっても、全く同じことをただ繰り返すのではなくて、『別シートから転記する』という処理を繰り返しますが、転記するシート(Sheet)やセル(Cell)の位置は繰り返すたびに変更できる優れものです。
これを使えば、繰り返す条件を「サマリーシート(Sheet)以外の個人シート(Sheet)の数」と設定すれば、従業員のシートの数だけ繰り返してくれます。人数の増加、減少にも対応できます。
そして、その繰り返す中でひとつずつ転記していくシート(sheet)を変更したり、サマリーシート(sheet)に転記するセル(Cell)を1行ずつ移動させていくことなどが出来れば、全員分の内容がサマリーシート(sheet)にすべて転記されます。
では、このやり方について説明していきたいのですが、毎度のことながら長くなってしまったので、次回にしたいと思います。