3日がかりのその仕事、3分で終わらせる方法教えます!
パソコンスキルの心技体

テストをするときは、データ量を減らして – Excelマクロ・VBA

2012年11月13日
  • このエントリーをはてなブックマークに追加
  • follow us in feedly

「エクセルマクロ達人養成塾」、ブログ担当の大椛です。

今回は、「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 なんていうループのまま、ステップインモードで一行一行挙動を確認することもなく、書いたマクロをただ漫然と実行しているだけだと、なかなか問題は解決しません。

まずは、このくらいなら自分がテストしてもいいかな、と思える範囲のデータ量に直してからプログラムの中身を検証しろ、ということのようです。

この話は、次回につづきます。

キーワード

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

最新の記事

人気記事

最新記事

カテゴリ

最新コメント

タグクラウド