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ぷ主みたいな人の助けになるように
動画作り頑張るでぃ~~!
次回も楽しみにしていてください~!
最後までご視聴、ブログ閲覧いただきありがとうございました!!
コメント