VBA100本ノック10本目を動画で解説してみました。Excelの神髄さんの模範解答はコチラ
問題
#VBA100本ノック 10本目
画像のように、「受注」シートに、今月の受注データがあります。
受注数が空欄かつ備考欄に、
「削除」または「不要」の文字が含まれている行を、
削除してください。
行の削除は行全体を削除してください。
サンプルでは5行目と10行目を削除

動画の流れ・解答
■考えた流れ
0:00 冒頭・問題確認
1:32 最終行までループする
3:38 C列が空白かつD列の文字(削除、不要があるかどうか)で分岐
5:52 行全体を削除
8:38 最終行から2行目までループを回す
※動画内での回答
Sub ノック10本目()
Dim ws As Worksheet
Set ws = Sheets("受注")
Dim i As Long
Dim lastrow As Long
lastrow = ws.Cells(Rows.Count, 1).End(xlUp).Row
For i = lastrow To 2 Step -1
If ws.Cells(i, 3) = "" Then
If ws.Cells(i, 4).Value Like "*削除*" Or _
ws.Cells(i, 4).Value Like "*不要*" Then
Rows(i).Delete
End If
End If
Next i
End Sub
※神髄さんの解答(これ以外の方法も紹介してくれてます)
Sub VBA100_10_02()
Dim ws As Worksheet
Set ws = Worksheets("受注")
Application.ScreenUpdating = False
Dim i As Long
For i = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row To 2 Step -1
If ws.Cells(i, 3).Value = "" Then
If ws.Cells(i, 4).Value Like "*削除*" Or _
ws.Cells(i, 4).Value Like "*不要*" Then
ws.Rows(i).Delete
End If
End If
Next
Application.ScreenUpdating = True
End Sub
Application.Screenupdatingの部分は説明してません…!
またいつか……w

削除は逆からループを
回した方がいいんですね!

消去は?

削除と消去の違い
この人わかって質問してるのかな…?
最終行までループする(6本目、7本目の復習)
さて!もう既に何回目でしょうか…?
最終行までループするコード!!!
10本目まででこれだけ出てきてるから、今のうちに覚えとこうね!!
※今回はシートもしっかりと定義するバージョンでやってみました↓

なんならこれ、何も見ず書けるぐらいにした方が良いんじゃね?ってレベルですわ~~。
今後も何百回とお世話になるコードですからね。
一つ一つ書いていくとこういう意味↓なんですけどね。

変数名は人によってまちまちですが…一番メジャーなのがこの「lastrow」かな~と勝手に思ってます。
勿論!変数使わなくても、直接Forの中に書いてもいいでござーますよ!!(>_<)

C列が空白かつD列の文字(削除、不要があるかどうか)で分岐
ほなここからは…みんな大好き「条件分岐」のお話!!
ま~ずはC列が空白かどうかを判定!!
C列が空白じゃない時点でその行はガン無視でいいですからね!

ほいなら続いて…
C列が空白だった場合の処理!!
その場合、D列の文字の中に、”削除”、もしくは”不用”が含まれるかどうか見て行きましょう!
一旦は”削除”だけを判定してるよ!↓

よし!そしたらお次に…↓四角部分を2つ書いてもいいんだけど…
いいんだけどね?
ワイもOrとかAndを知らない時は2回おんなじこと書いてたけどね?
流石にね。それはスマートじゃないので…。

Or演算子さんを使って!!
まとめて書いちゃいましょう!
↓間違えやすいんだけど、こうじゃないから気を付けて!
× ws.Cells(i,4).Value Like “*削除*” Or “*不要*”
○ ws.Cells(i,4).Value Like “*削除*” Or ws.Cells(i,4).Value Like “*不要*”

行全体を削除
んよっし!
これで今回の問題の条件分岐部分が完成したから!!
お次はどうやって「行全体を削除」するかだ!!
コードを書いていく部分はコチラ↓

(Worksheets.)Rowsプロパティを使うぞ!!
Range.Rowsプロパティとは違うから気を付けてくれ!!説明してないがな!!
これで完成だ!と思いきや…

実はこのコードを実行しても…
データによっちゃあエラーになっちまうんだ!!
なんでかは動画を見てくれたらわかりやすいと思う!ガチで!

一応クソ下手くそに言葉で説明すると…!
Excelで行全体を削除すると、その行そのものがなくなるよな?
そしたらその行の一つ下にあった行って、一つ上にくるよな?
つまり!
例えばループでiが2だった場合、2行目が削除されて、3行目が2行目の位置に来るよな?
だけど次のiは3だから、次に処理するのは3行目になるよな?
でもその3行目って、元々4行目にあった行だよな?
つまり!もともと3行目にあった行に対して処理できないってわけだ!(はぁはぁ)
わかるか?わからんかったらスマン

最終行から2行目までループを回す
う~~ん…どうやって行の処理が飛ばされる問題を解決したらいいんだろう…
と思う間もなく!!
見出しででネタバレをかましてますが!!
ループをしたから回せば万事解決なんすよ。うん。
簡単でしょ??(自分では絶対思いつかない…)

これは書き方を知ってるか知ってないかが勝負の分かれ目!!
Step and a Step♪わたしの歩幅で~~♪ステップあんだステップ♪私だけのペースで~♪

歩幅を変えたければ、すてっぷあんだすてっぷのあとの数値を変えてください!!
Everything will be fine~♪

こうすると~??
Everything will be OK~♪

あ、コードとしてはこれで問題ないと思うんですけど、一応補足。
“_”(アンダーバー)の使い方も説明したから是非使ってみてね~!
自分のペースでいいからね~

オツカレサマデシタ!今日はこんなもんですわ!

お疲れ様!
Everything will be fine!

Step and a step!
あとがたり
おはこんばんちは。uぷ主です。
VBA100本ノック、10本目の解説となります。
いやぁ~、Step and a stepな問題でしたね!!
baby stepって感じな…
・・・え?
途中から何書いてるかわからない?
・・・は?
ご存じない?すてっぷあんだすてっぷを??
・・はぁ~~~。。。
幻滅ですわぁ~~。
今すぐググってください。
にじゅー すてっぷあんだすてっぷ で!!
最近は別バージョンも出てねぇ、めっちゃかわいいんですよ。
みーひさんとかリマさんとかがね、もうかわいいんですわ。まやさんもね。
あ。話がそれましたね。
今回はなんと!削除の問題~~!!
今回はたまたま”行”の削除でしたけど、他にも”シート”の削除とかでおんなじ問題が起こりやすいと思います。
・・・
はい。以上です。
え?短すぎるって?
いやいや!その方が早く読み終わっていいやないかい!!
こんなん読んでる暇あったら勉強しろ!!(‘Д’)
ま。とはいえ、やっっっっっっっっっっっっとノック2周目、10本目まで行きましたわ…。。
他にも色々やってるんで、2週間に1回しか今のところ取り組めてないのですが…
出来れば15本目までは2周目やりたいんですよね!!
15本目までのワイ、ホントに動画編集素人すぎて…
16本目からちょっとだけうまくなったんですよね(なんで)
だからもーちょっとだけ頑張ります!
ま、もしかしたら11本目は来年になるかもしれないけど…
のほほんとがんばるんで、良ければ応援お願いします!
ほな、最後までご視聴、ブログ閲覧いただきありがとうございました!!
あ、そういや先日、登録者数10万人達成しましたっす~~~!!
ま、そこからは伸びてないんで、またいつ9万人に戻るかわからないんですけどね。
ホントに皆さんありがとうございました。
これからも頑張りますぅ~!
コメント