8本目 点数の合否判定

VBA100本ノック

VBA100本ノック8本目を動画で解説してみました。Excelの神髄さんの模範解答はコチラ


問題

#VBA100本ノック 8本目
「成績表」シートに、5教科の成績表があります。
以下の2条件を満たした者が合格となります。
・5教科合計が350点以上。
・全ての科目が50点以上。
G列に、合格者に対しては「合格」と出力し、
不合格は空欄にしてください。

動画の流れ・解答

■考えた流れ
0:00 冒頭・問題確認
1:46 シートの定義、変数への代入
3:36 シートを定義するメリット(しないデメリット)
5:34 行列のループ(2重ループ)
7:34 列方向のループ内に条件分岐
10:24 50点未満がある場合の条件分岐

※動画内での回答

Sub ノック8本目()

    Dim ws As Worksheet
    Set ws = Sheets("成績表")
    
    Dim i As Long, j As Long, t As Long
    For i = 2 To ws.Cells(Rows.Count, 1).End(xlUp).Row
        t = 0
        For j = 2 To 6
            t = t + ws.Cells(i, j).Value
            If ws.Cells(i, j).Value < 50 Then
                t = -10000
            End If
        Next j
        If t >= 350 Then
            ws.Cells(i, 7) = "合格"
        End If
    Next i
    
End Sub

※神髄さんの解答(これ以外の方法も紹介してくれてます)

Sub VBA100_08_01()
  Dim ws As Worksheet
  Set ws = Worksheets("成績表")
  
  Dim i As Long, j As Long, t As Long
  For i = 2 To ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    t = 0
    For j = 2 To 6
      If ws.Cells(i, j) < 50 Then
        t = 0
        Exit For
      End If
      t = t + ws.Cells(i, j)
    Next
    ws.Cells(i, 7) = ""
    If t >= 350 Then
      ws.Cells(i, 7) = "合格"
    End If
  Next
End Sub 

Exit Forは解説しきれなかった部分…!!
またいずれ!!

新人君
新人君

合計を足していく部分が
メインっすかね!

ブチョ
ブチョ

VBEの開き方が
メインかと思ってたよ!

新人君
新人君

それ、0本目でやったやつ…

シートの定義、変数への代入

あんまり個人的には好きでない、変数のお話!!
かる~~~く紹介!

書き方だけ紹介!
型とかはまぁ…まだ深く考えんでええ!

SheetsでもWorkSheetsでもOK!的な書き方にしているが…。
違いは特に明記してません。
基本ウチのチャンネルではSheetsしか使いません…(>_<)

シートを定義するメリット(しないデメリット)

シートはきちんと定義、指定したほうがいいっすよね~ってお話。
そのコードを実行する瞬間に、アクティブなシートを処理しちゃいます。
何回これに泣いたことか…

昔問い合わせきたなぁ…↓

もしミスってClearとかしようもんなら…\(^o^)/

そんな時に限って別シートに、大事な数式とかデータが入ってたりするんだよなぁ…

行列のループ(2重ループ)

初めての2重ループですな!!
とまあまずは復習のここから…。

A列の最終行を取得してまっす!

列方向は”j”って変数を作ることが多いぞ

こやつをF8で実行すると…なんということでしょう!!
B2→C2→D2…
B3→C3→D3…のセルさんたちが変わっていくではありませんか!

ま、ここまでは前回の続きみたいなもんかな!

列方向のループ内に条件分岐

お次は列のループの結果によって、G列に合格と入れるかどうかの分岐!

一旦一つ一つ考えていきましょう!
まずは”合計が350点以上かどうか”の部分!

“t”って変数を新たに作って、そこに合計を出していきましょう!
まずは”i”のループの下に、t=0を入れてあげて、行ごとに点数をリセットする感じ!

そしてループ内では、「t = t + ws.Cells(i,j).Value」
これで2~6列目までループさせつつ、合計を出すことができたね!

※例えばjが3の時↓

最後、”j”のループのコードの下に、G列が”合格”かどうかを入れてあげましょう!

tが350以上の時は合格だから、こんな感じだね!↓

日付をmmdd形式に変更(Format関数)

お次は日付を扱う方法なり~~。
まずはシート上での復習??から。

言わずと知れた関数ですよね??たぶんね。

TEXT関数さんと”ほぼ”全くおんなじ感覚で使えるのが、FORMAT関数さん!!

TEXT関数さんが使えたらFormat関数さんも使えるぞ!!

ただし、mmddの前に'(シングルコーテーション)を付けるのを忘れるなよっ!

実行結果はコチラ↓
あとちょっとで完成だね!

50点未満がある場合の条件分岐

最後、1教科でも50点未満があった場合!
コチラも不合格!きびちー!

考え方は多々あるけど…

めんどくせえから、tにすっげえ小さい数値を代入すれば、
合計が350に達しないからいいんじゃね?

ま、簡単なその場しのぎのやり方には…
デメリットも当然あります…

後から見返したらわからなくなる可能性大。
あほほどマクロ書いてたら、一つ一つのコードなんてマジで忘れるんですよね…

ブチョ
ブチョ

お疲れ様!

新人君
新人君

頑張りましたね!

あとがたり

おはこんばんちは。uぷ主です。
VBA100本ノック、8本目の解説となります。

今回は初めての2重ループに加え…
“シート”を変数として扱ったり…
ループの中で変数に足し算していったり天
ちょっと初心者には難しい内容だったかも…?

だけどここまでできたらホント、あと1歩なんじゃないかしら…!
t = t + 1
これが何やってるかがわかれば充分っス!

ちなみにuぷ主はこれが分かるまでに2年かかりました!

少しでもuぷ主みたいな人の助けになるように
動画作り頑張るでぃ~~!

次回も楽しみにしていてください~!

最後までご視聴、ブログ閲覧いただきありがとうございました!!

コメント

タイトルとURLをコピーしました