「エクセルマクロ達人養成塾」、ブログ担当の大椛です。
今回は、「Excelマクロ・VBA基礎コース」のフォローアップ講座のフィードバックから、僕にとっておもしろかった話をひとつご紹介。
こんな問題↓です。
1~6月の残業時間が一番多い人の氏名をセルK4に、月名をセルL4に、残業時間の値をセルM4に記入するマクロを作りなさい。(ただし、残業時間が一番多い人はひとりしかいないものとしてよい)
|B列 |C列 |D列 |E列 |F列 |G列 |H列 |
---------------------------------------------------------------------------------
5 行目 |名前 | 1月 | 2月 | 3月 | 4月 | 5月 | 6月 |
---------------------------------------------------------------------------------
6 行目 |秋田 祥平 | 38.5 | 39.5 | 40.0 | 40.0 | 29.0 | 40.0 |
---------------------------------------------------------------------------------
7 行目 |和歌 牧子 | 17.0 | 28.0 | 24.0 | 32.0 | 20.0 | 21.0 |
---------------------------------------------------------------------------------
8 行目 |大阪 弘祐 | - | 35.0 | 35.0 | - | 30.0 | 39.0 |
---------------------------------------------------------------------------------
9 行目 |静岡 秀二 | 31.5 | 2.5 | 19.0 | 37.5 | 33.0 | - |
---------------------------------------------------------------------------------
10行目 |福島 志晃 | 22.0 | - | - | 30.0 | 13.0 | - |
---------------------------------------------------------------------------------
11行目 |静岡 若菜 | 17.0 | 28.0 | 31.0 | 37.0 | 24.5 | 19.0 |
---------------------------------------------------------------------------------
12行目 |京都 志晃 | 40.0 | 18.0 | 20.0 | 36.0 | 40.0 | 40.0 |
---------------------------------------------------------------------------------
13行目 |千葉 謙次 | 30.0 | 24.0 | 5.0 | 29.5 | 55.5 | 41.0 |
---------------------------------------------------------------------------------
14行目 |島根 貴 | - | - | - | - | - | - |
---------------------------------------------------------------------------------
15行目 |三重 真美 | 30.0 | 28.0 | 40.0 | 40.0 | 30.0 | 28.5 |
---------------------------------------------------------------------------------
いわゆる「勝ち抜き戦」です。変数の値を順番にデータの値と比べ、「変数<データ」となれば、変数にデータの値を入れていく。
If文とFor Next構文だけで解決するとなると、こんな感じ↓。
Sub kaitou() Dim gyo Dim kati Dim retu retu = "C" kati = 6 For gyo = 6 To 33 If Range(retu & kati).Value < Range("C" & gyo).Value Then retu = "C" kati = gyo End If If Range(retu & kati).Value < Range("D" & gyo).Value Then retu = "D" kati = gyo End If If Range(retu & kati).Value < Range("E" & gyo).Value Then retu = "E" kati = gyo End If If Range(retu & kati).Value < Range("F" & gyo).Value Then retu = "F" kati = gyo End If If Range(retu & kati).Value < Range("G" & gyo).Value Then retu = "G" kati = gyo End If If Range(retu & kati).Value < Range("H" & gyo).Value Then retu = "H" kati = gyo End If Next Range("K4").Value = Range("B" & kati).Value Range("L4").Value = Range(retu & "5").Value Range("M4").Value = Range(retu & kati).Value End Sub
この問題について、大阪の受講生Hさん(女性)から、
とのこと。
彼女が書いたプログラムもメールに記載されていました。
Sub mondai3() '間違い Dim gyo Dim zangyo '残業時間が一番多い人 zangyo = 6 Dim tsuki tsuki = "C" For gyo = 6 To 33 If Range(tsuki & zangyo).Value < Range(tsuki & gyo).Value Then zangyo = gyo tsuki = "D" End If Next For gyo = 6 To 33 If Range(tsuki & zangyo).Value < Range(tsuki & gyo).Value Then zangyo = gyo tsuki = "E" End If Next For gyo = 6 To 33 If Range(tsuki & zangyo).Value < Range(tsuki & gyo).Value Then zangyo = gyo tsuki = "F" End If Next For gyo = 6 To 33 If Range(tsuki & zangyo).Value < Range(tsuki & gyo).Value Then zangyo = gyo tsuki = "G" End If Next For gyo = 6 To 33 If Range(tsuki & zangyo).Value < Range(tsuki & gyo).Value Then zangyo = gyo tsuki = "H" End If Next Range("K4").Value = Range("B" & zangyo).Value Range("L4").Value = Range(tsuki & "5").Value Range("M4").Value = Range(tsuki & zangyo).Value End Sub
これを読んだ塾長から、こんな返信が↓
試しに、データ数を5行くらいにして、C列、D列、E列にしかデータがない状態にして、(マクロも相応のものに書き換えて)テストしてみてください。
こういうの、とても大切だそうです。
曰く、
「マクロをちゃんと書ききれない人のほとんどが、テストをマジメにやっていない!!」と。
今回、 For gyo = 6 To 33 … Next なんていうループのまま、ステップインモードで一行一行挙動を確認することもなく、書いたマクロをただ漫然と実行しているだけだと、なかなか問題は解決しません。
まずは、このくらいなら自分がテストしてもいいかな、と思える範囲のデータ量に直してからプログラムの中身を検証しろ、ということのようです。
この話は、次回につづきます。