ワンポイントマクロ8-マクロの記録ポイント
皆さんこんにちは。
「マクロの記録」で書いたコードがうまく使えないことってありますよね。
そんなときに、ココを書き変えるだけでうまく使えるマクロになりますよっ。というポイントをご紹介します。
前回の<ワンポイントマクロ7-マクロを書いてもらおう!>でマクロの記録をご紹介しました。内容は「必要なデータだけを別シートにまとめる。」ということで、イメージ図とできたマクロが以下のとおりです。
◆イメージ
一行ずつ確認していきますので書変え後のマクロをすぐ確認したい方は最後の「◆まとめ」をご覧ください。
<テキスト>
①Selection.AutoFilter
②ActiveSheet.Range("$A$1:$C$10").AutoFilter Field:=3, Criteria1:=">=10000", Operator:=xlAnd
③Columns("A:C").Select
④Selection.Copy
⑤Sheets("ピックアップ").Select
⑥Columns("A:A").Select
⑦ActiveSheet.Paste
◆コードを順番に確認してみる
①Selection.AutoFilter
→選択した範囲(selection)にオートフィルタを適用・解除(AutoFilter)させるコードです。いきなりこのコードから始まっていますので、Selectionを指すのはこの時にたまたま開いていたシートの選択していたセルということになってしまいます。
ですので、データが何もないところを選択していた場合オートフィルタの適用範囲がわからないため、エラーがでてマクロは止まってしまいます。
〇書き変えたいところ1
Selectionを具体的な範囲にしてあげる
➡Worksheets("記録").Range("A1").AutoFilter
②ActiveSheet.Range("$A$1:$C$10").AutoFilter Field:=3, Criteria1:=">=10000", Operator:=xlAnd
→指定範囲に条件をもってフィルタをかけるコードです。
ActiveSheetとはこのときにアクティブになっているエクセルシートです。①のコードではWorksheets("記録")を選択して開いたわけではないので、①を実行する前と同じ状態(たまたま開いていたシート)です。
ですので、ActiveSheetをWorksheets("記録")に書き変えて指定します。
そして、
Range("$A$1:$C$10")は逆に、がっちり範囲が決まってしまっているので、データ行が増えても10行目までしかフィルタがかからない書き方になっています。
〇書き換えたいところ2
ActiveSheet.Range("$A$1:$C$10")の部分はフィルタをかける範囲なので、①と同じ書き方にして範囲を指定すればよい
➡Worksheets("記録").Range("A1").AutoFilter Field:=3, Criteria1:=">=10000", Operator:=xlAnd
★AutoFilter の使い方参考記事<マクロルーティン#16(指定のシートにまとめる)>
③Columns("A:C").Select
→このコードもシート名が指定されていないのでシート名を指定します。
〇書き換えたいところ3
➡Worksheets("記録").Columns("A:C").Select
このように書きたいところですが、Selectを使うときにはシートを選択してから、セル範囲を選択するように書きます。(関係ないシートが開いていた場合エラーで止まることがあるからです。)
↓↓
Worksheets("記録").Select
Columns("A:C").Select
④Selection.Copy
→このコードもSelectionの部分があいまいですが、直前の書き変えたコードを見てみると、
Worksheets("記録").Select
Columns("A:C").Select
というように、この時点で「記録シートを選択して、A~C列を選択してる」ことがわかります。コードは上から順番に実行されるので、④Selection.Copyは直前のSelect部分のCopyをするということになります。
したがって、ここはこのままでOKです。
⑤Sheets("ピックアップ").Select
→ここはシート名から指示されているのでOKですね。
(WorksheetはSheetに含まれるのでここは気にしなくて大丈夫です。)
⑥Columns("A:A").Select
→ここはシート名が指示されていないですが、直前のコードでピックアップシートが選択されている状態なので大丈夫。
⑦ActiveSheet.Paste
→ここも前のコードに引き続きピックアップシートが選択されているままなので、ActiveSheetというはピックアップシートになるわけですからこのシートにPasteするということでOKです。
◆確認した結果
Worksheets("記録").Range("A1").AutoFilter
Worksheets("記録").Range("A1").AutoFilter Field:=3, Criteria1:=">=10000",
Operator:=xlAnd
Worksheets("記録").Select
Columns("A:C").Select
Selection.Copy
Sheets("ピックアップ").Select
Columns("A:A").Select
ActiveSheet.Paste
◆まとめ
↓<マクロの記録>のまま
↓書き変え後
関連資料<マクロルーティン#16(指定のシートにまとめる)>
関連資料<マクロルーティン#17(指定のシートにまとめる)続き>
★コードは上から順番に実行されます。コードを見直すときは、その時点でエクセルシートがどのような状態なのか想像します。
・どのファイルのどのシートが選択されているのか、
・どのシートのセルを選択しているのか、
今回のように2つのシートを使う場合や、複数ファイルを扱う場合はマクロの記録を使わずに書くときも気を付けるポイントです。
次回はこの書き変えたマクロをもっと見やすく書き変えます!
マクロを見やすく書くことで、
・何をしているのか、
・どこを書き変えればいいのか
判断しやすくなります。