初心者のためのExcel エクセルマクロVBA入門:VBAをマスターしたいならSelectメソッドは使うな!
語弊があるかとは思いますが、ぶっちゃけこのテーマは扱うべきお話だと思って取り上げました。今回はSelectメソッドのお話。
Selectメソッドは必要ない
ぶっちゃけ私はこう思っています。これ?いるか?的な。なぜならすべてオブジェクトという単位で操作可能なエクセルにおいて、いちいちそのオブジェクトをSelectする必要があるのか?っちゅう話ですわ。
私はこのブログでずーっと言ってるのが・・・
オブジェクトを正しく指定できたら、エクセルマクロは超簡単!
と言ってます。この「オブジェクトを正しく指定」というのが、大切でこれができない人がSelectメソッドを使ってしまう。例えば検索一つとっても、、、たとえばA列からD列の間だけで「川崎」と検索をかけたいときに、、、
<オブジェクトが理解できなくてマクロの記録で覚えた人のコード>
Columns("A:D").Select Selection.Find(What:="川崎", After:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ False, SearchFormat:=False).Activate
<ちゃんとマクロを覚えてる人のコード>
Sheet1.Range("A:D").Find What:="川崎"
となります。とにかくSelectメソッドを使う人のコードにはSelection.メソッド名が多数出てきます。つまりなんか選択して、その選択した範囲において何か操作をする。と言ったことを初心者の方やマクロが理解できてない方はやろうとします。もっとわかりやすいのはコピーペーストですね。これも同じようにやってみましょう。例としては簡単にA1のセルの値をB1へコピーペーストです。今回はセルの内容だけではなく書式などもコピペする想定です。
<オブジェクトが理解できなくてマクロの記録で覚えた人のコード>
Range("A1").Select Selection.Copy Range("B1").Select ActiveSheet.Paste
<ちゃんとマクロを覚えてる人のコード>
Sheet1.Range("A1").Copy Sheet1.Range("B1")
はい、以上。CopyメソッドがどういうものかわかっていればSelectメソッドがいかに不要なものであるかが理解できると思います。もちろん私が書くVBAのコードにSelectメソッドが出てくることは99.8%くらいありません。物によってやむを得ず使う場合がありますが、それ以外で使うことはまずありません。なぜなら・・・
Selectメソッド使うことはオブジェクトを指定する行為そのもの
だからです。これ自体、VBA上でちゃんと指定するので必要ないわけです。そんで、ほんとによく見かけるのが初心者がつまづくエラーへとたどり着きます。。。すなわち。。
「Selectメソッドが失敗しました」
( ゚д゚)?は?失敗?
というエラーです。もはやですがSelectメソッド使わなければ出てこないエラーです。初心者は多用するので本当にたくさんこのエラーに出くわします。
- マクロの記録してみた。
- Selectメソッドを使ってマクロを作成!
- Selectメソッドが失敗しましたが多発!
- なんかよくわからない・・・
- エクセルマクロは難しいねできないわ!⇒イマココ
となる。本当に残念ですね。マクロの記録をするとこういう「マクロできないスパイラル」へ落ちます。なのでSelectメソッドを使ってはいけないのです。おそらくマクロの記録をして一番最初に出くわすメソッドでおそらく初心者の人が「理解しやすい」メソッドであることが、このマクロできないスパイラルへ落ちる理由の最たるものなのですが・・・
理解できるものやとっつきやすいものにとりあえず飛び乗って良いことなんかないぞ?
ってことですね。
Selectメソッドの本来の意味って?
Selectメソッドそれ自体は、エクセルの様々なオブジェクトに用意されているメソッドで、そのオブジェクトを「アクティブ」にします。それだけです。そう、文字通り「選択した状態にする」だけなんです。別に選択した状態にしなくても、セルに値を入れることはできるしシート名を変更したり、検索したりすることは全然可能です。だってオブジェクト指定すればいいのだから。じゃあ、マクロ上でSelectメソッドを使う時ってどういう時でしょうか?
Selectメソッドはシートやブックを選択する時に使う
( ゚д゚)3え?
ちょっと個人的ですがぶっちゃけこれくらいでしか使いません。つまり、「ユーザーが見た目上マクロを実行した後で最終的に見せておきたいシートがある場合」にのみSelectメソッドを使ったりします。または複数のブックにまたがるエクセルマクロを使ったりしたときに最終的に選択されているブックがある場合なんかにも使いますね。ですので、これだけは絶対なのですが、
エクセルの何かを「操作」するためにいちいちSelectメソッドを使うことはない!
ということなんです。エクセルの何かをマクロで動かしたいなら、ちゃんとオブジェクトを指定しましょう。
今日はここまで!
かしこ