9本目 フィルターとコピー

VBA100本ノック

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


問題

#VBA100本ノック 9本目

「成績表」シートに、5教科の成績と、
G列に合否判定があります。
「合格者」シートを新規作成し、
合格者の氏名だけをA列に列挙してください。
※点数は非公開なので、「合格者」シートには出力しないでください。
※何度でも実行できるようにしてください。

動画の流れ・解答

■考えた流れ
0:00 冒頭・問題確認
1:42 「合格者」シートを新規作成(作り直す)
3:50 「合格者」シートを新規作成(作り直す)part2
6:14 「合格者」シートを新規作成
8:58 G列が”合格”でフィルター
12:04 A列の合格者名を合格者シートへコピー

※動画内での回答

Sub ノック9本目()
    
    Dim ws成績表 As Worksheet
    Dim ws合格者 As Worksheet
    
    On Error Resume Next
    Application.DisplayAlerts = False
    Sheets("合格者").Delete
    On Error GoTo 0
    Application.DisplayAlerts = True
    
    Set ws成績表 = Sheets("成績表")
    Set ws合格者 = Worksheets.Add
    ws合格者.Name = "合格者"
    
    ws成績表.AutoFilterMode = False
    With ws成績表.Range("A1").CurrentRegion
        .AutoFilter 7, "合格"
        .Columns(1).Copy ws合格者.Range("A1")
    End With
    ws成績表.AutoFilterMode = False

End Sub

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

Sub VBA100_09_01()
  Dim wsIn As Worksheet
  Dim wsOut As Worksheet
  
  On Error Resume Next
  Application.DisplayAlerts = False
  Worksheets("合格者").Delete
  Application.DisplayAlerts = True
  On Error GoTo 0
  
  Set wsIn = Worksheets("成績表")
  Set wsOut = Worksheets.Add(After:=wsIn)
  wsOut.Name = "合格者"
  
  wsIn.AutoFilterMode = False
  With wsIn.Range("A1").CurrentRegion
    .AutoFilter Field:=7, Criteria1:="合格"
    .Columns(1).Copy wsOut.Range("A1")
  End With
  wsIn.AutoFilterMode = False
End Sub

AutoFiilerメソッドの引数の部分、:=の書き方は紹介してません…!
またいずれ…!

新人君
新人君

:=を使った方が、後々見直したときに
わかりやすいですよね!

ブチョ
ブチョ

?後々見直すことなんて
あるの?
ないでしょ?

新人君
新人君

あるんやて…

「合格者」シートを新規作成(作り直す)

いきなりですが!!
“何度でも実行可能にする”コードのために、シートを作り直すところから!
シートの情報を毎回Clearしてもいいんですけど、今回はもうシートごと削除しちゃいました!!
それが手っ取り早いからね!

ただ、Excelで”削除”って意外と難しい…。
ないものは削除できないし、あるものを削除しようとしても、
「ホンマに削除して大丈夫??」って無駄な気遣いで聞いてきて止まっちゃうからね!

優しい…!優しすぎるがうえに…コードがちょっとめんどくなるんすわぁ…

一旦は「エラーが出ないようにする」ための、On Error Resume Nextの部分まで!!!
これを書いておけば、もし「合格者」って名前のシートがなかった場合でも、
「そんなシートありまへんで!」的なエラーを出さずに継続できるね!

一旦ここまで!

「合格者」シートを新規作成(作り直す)part2

続いては…思いやりアラートメッセージが出ないようにしましょう!
それはApplication.DisplayAlerts = Falseを設定すればOKなんすわあ!

これで完璧!と言いたいんだけど…
いじった設定は、元に戻してあげることが大事!

今回くらいのコードならこのままでも正直いいんだけど…
普通はエラーが出てくれないと困るんスわw

On Error Resume Nextを元に戻すためには…
On Error GoTo 0を設定してあげましょう!!

アラートの方は…
FalseだったところをTrueに戻してあげりゃOK!!

「合格者」シートを新規作成

シートを新規作成する!
んだけどちょっとまてよー!(キムタク風)

複数シートを扱う時は落ち着いて変数にしようぜって言ったよな?

シートを変数にぶちこむには…Set 変数名 = シート ってすりゃいいから…
新しくシートを作りたい時には…

Worksheets.Addメソッドさんを使えばいいんすわあ!!
これ初心者の頃、何やってんのかわからんかったわぁ……

これで、新規作成したシートがws合格者にぶちぶちぶちこまれたので、
あとはws合格者のNameを変更!

G列が”合格”でフィルター

ここから先は、VBAを書く前に手動で順番を確認してます!!
良かったら見てね!

フィルターがもし先にかかってたら困るから…解除するところから!!
こういうこまごました工夫が後々のエラー回避につながるんすわぁ…

フィルターしたければ、VBA フィルター でググればOK!!www
引数をどうやって使うかを動画見てイメージつけてください!!

上でも書いたけど、:=を使って指定するやり方もあるからね!!!

実行した結果は以下!!

A列の合格者名を合格者シートへコピー

ここまで出来たら、あとはA列を合格者シートへコピーするだけ!

なんだけど…このように、同じ記述が何回も出てくる場合は、
Withステートメントさんを使うと便利!

Withのところで書いたコードを使いたい時は、”.”を使えばOKなんだ!
スッキリ~!

今日はちょっと長くなっちゃったが…これがVBAの勉強と言うやつだ!!

ブチョ
ブチョ

お疲れ様!

新人君
新人君

頑張りましたね!

あとがたり

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

今回は…動画がなげえな!!おい!!
1周目の時も…この9本目から、2本に分けて投稿してましたね。

だけど…2周目では1問1動画にまとめるって決めてるんじゃい!
その方がすっきりしない??
最初は説明することが多いから、まとめるの難しいんだけどね…

とまあそんなことはさておき、今日はフィルターとコピーの問題だったね!!

そろそろAutoFilterメソッドとか…ある程度VBAの使い方がわかってきたと思うから…
ドドドっとコードを書いていってみたディ!!
ググり方とかも以前やったしなぁ!

早かったりとか、まだまだわかりにくいところとかあったら是非コメントとかで教えてくれな!!
超暇だったら動画作り直すからさ!
超暇だったらね!

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

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

あ、そういやもうすぐ…夢の登録者数10万人達成っす~~~!!
ホントに皆さんありがとうございました。
これからも頑張りますぅ~!

コメント

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