初心者のためのExcel(エクセル)マクロVBA入門-プログラミングの基礎11~オブジェクトその3
Excelマクロの本質はオブジェクトの正しい指定!
前回でオブジェクトとプロパティとメソッドは理解できたと思います。
そして前回に記載した図ですがこれがとても重要です。この関係性をしっかりと理解しましょう。
Excelマクロを作る場合には特にこの関係性は重要なんです。
マクロの自動記録の大きな落とし穴
Excelを操作するには基本的には上から指定してあげることが原則です。マクロの自動記録機能などを使うとそういった指定が「省略」されて記述されるので、マクロの自動記録から入るとどうしてもこの「オブジェクトの関係性」を理解できません。結果として人が見てもよくわからない、ちょっと状況が変わるともう動かないものが出来上がってしまうわけです。
例えば、A,B,Cという名前のエクセルファイルが開いていたとします。シートの名前はすべてSheet1、Sheet2、Sheet3です。では、このエクセルファイルBのSheet1のセルA1に対して何か操作をしたい場合に、この階層構造をよく知らないとこう書いてしまいます。
Range("A1").Value = "これはテストです"
※たぶんマクロの自動記録を使ってもこんな感じで書かれます。
もちろん、間違いではないです。ですが、これでは「プログラムとして不完全なもの」と言わざるを得ません。
マクロはあるブックから別のブックに対して操作を行いたいときもあります。例えばボタンを押したら、あるフォルダにあるエクセルファイルに対して、一定の処理を行って保存して閉じて、また次のファイルに対して・・・なんてことしたいですよね?その時に上のように書いてしまうと、動いてくれません。
この書き方は、「マクロを書いたブックとシートに対してだけ動く書き方」なんです。では、きちんと指定して書くにはどうしたらよいか?ここで先ほどのオブジェクトの階層構造の話が出てきます。これを理解していればきちんと間違いなく、操作するExcelファイルの対象のセル、つまりオブジェクトを指定することができます。
簡単です。難しくありません。
先ほど書いた、「ファイルBのSheet1のセルAに対して」をきちんとVBAで書いてあげればよいんです。
Application.WorkBooks("ファイルB.xls").Sheets("Sheet1").Range("A1").Value = "これはテストです"
全部きちんと最後まで指定するとこうなります。「~の」を「.」に置き換えただけですね。
これなら、きちんとどのファイルのどのシートのどのセルか?が一目でわかりますね。
でもやっぱり省略はする
上記が完全版ですが、Excelにのみ対象を限定しているのであればApplicationは省略してもよいでしょう。また、動作の対象が1つのブック(ファイル)にのみ行うのであれば、WorkBooksも省略してもよいです。さらにいうとですね、
「これが何のオブジェクトなのかが人もコンピュータも明確にわかるのであれば、省略は自由」
ということです。さっきと反対っぽいのですがいったいどういうことでしょうか?要するに「どこまで書けば、人もPCもコードを見てわかるのか?」ということです。この例で言えば、同じファイル内だけ処理が完了するのなら、「どのシートか」から書けば良いですよね。1つのファイルにシートは複数あるわけですから。複数のファイルにまたがって処理するのなら、やはりBookオブジェクトから記述すべきです。
大事なことは正しくオブジェクトを指定すること
このように、コンピュータと人が分かるように記述することがExcel VBAをプログラミングする上での「キモ」になります。「コツ」と言っても大げさではないくらいです。なぜなら、「正しくオブジェクトを指定することができれば、操作するのは簡単」だからです。おそらく、みなさんが一番大きくつまづくところもここだと思います。これからプログラミングをしていく中でたぶん、一番見るであろうVBAのエラーは・・・
「オブジェクト変数または With ブロック変数が設定されていません。」
だからです。これは「きちんとオブジェクトを指定することができていない」ために起こるエラーです。だから、正しくオブジェクトを指定することが最重要になります。ここまでくれば、もうきっとVBAのプログラミングはできるはずです!!後はどんどん、いろんなExcelのオブジェクトの指定の仕方と、操作の仕方を覚えるだけです。
非常に重要なことなのでしっかり理解してくださいね。
かしこ