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万人達成っす~~~!!
ホントに皆さんありがとうございました。
これからも頑張りますぅ~!
コメント