「エクセルマクロ達人養成塾」、ブログ担当の大椛です。
今回は、「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 なんていうループのまま、ステップインモードで一行一行挙動を確認することもなく、書いたマクロをただ漫然と実行しているだけだと、なかなか問題は解決しません。
まずは、このくらいなら自分がテストしてもいいかな、と思える範囲のデータ量に直してからプログラムの中身を検証しろ、ということのようです。
この話は、次回につづきます。