10本目 行の削除

VBA100本ノック

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万人に戻るかわからないんですけどね。

ホントに皆さんありがとうございました。
これからも頑張りますぅ~!

コメント

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