初心者のためのExcelマクロ超入門(絶対できるVBA開発)

マクロがまったくわからない人のためにエクセルマクロやVBAについてできるだけわかりやすく書いています。Twitter:@shuhhohhey

オブジェクト指向をロボに例えて説明したら、すげーわかりやすくて震える。-初心者のためのExcel エクセルマクロVBA入門

エクセルのマクロをマスターするにはプログラミング言語であるVBAとプログラミングの基礎を学びましょう。ということはずーっとこのブログで主張してきました。ただの動作を記録するような「マクロの記録」をするだけでは、一生マクロを覚えることは「不可能」です。ということも私の意見として述べてきました。だってプログラミングわからんとマクロをゼロから組めないもの。。。


ではどうしたらいいのか?

VBAを覚えるのに一番のキモは「オブジェクト」


ほぼ断言できるのですが、エクセルのマクロVBAにおける「オブジェクト」と「オブジェクト指向」というのがどういうものか?ということをしっかりと理解できれば、後はもう簡単だということ。
うん、ほぼだけど断言できると思います。
おそらくここを理解できるかどうか?がマクロマスターになるための一番の勘所だと言っていいです。
これも以前から言ってますが・・・

オブジェクトを理解してオブジェクトを正しく指定できればエクセルマクロは超簡単


ということですね。というかこれを理解するのが一番、マクロをマスターするのに一番の近道だし一度理解すれば、あとはもう本当に簡単だと思うのです。なぜか?

エクセルはたくさんのオブジェクトで出来ていてエクセルを自動で操作するのはオブジェクトを操作することと同じだから。

です。したがって操作する対象(これがオブジェクトなんだけど)がちゃんと自分でわかってるのか?ということはもちろんだけど、「自動で動かすエクセル自身が分かるように操作する対象を書けるか?」が最重要になるのですよ。

以前もこの回からこの回にわたって、延々とオブジェクトについて説明しました。
ポイントとしてはエクセルマクロという視点からみてオブジェクトとはなんぞや?みたいな話をしたと思います。
どうやってオブジェクトについて説明しようか?考えてたんですけど、今回はロボに例えて、概念的なオブジェクトとはなんぞや?みたいな話とエクセルマクロではどう?という形でお話をしたいと思います。

オブジェクトとは?物、こと、対象いや「ロボ」で。

オブジェクト自体は英語ではObjectで意味は「物・対象」なんて意味で使われています。プログラミング言語におけるオブジェクトとは・・・


「さまざまな機能(メソッド)や状態(プロパティ)を持っている1つの機械(ロボ)」


このロボの部分を「物、こと、対象」なんて置き換えればそれっぽい説明になりますが、ロボでいいです。理解できるまでは。(笑)ちょうどアマゾンのダンボみたいなやつをイメージすればいいと思うよ。

オブジェクト(ロボ)
f:id:drumer2sh:20131106122034p:plain


さて、このロボは機能と状態という2つの部品で出来ています。


ロボ(オブジェクト)=機能(メソッド)+状態(プロパティ)


となりますね。例を考えてみましょう。例えば、引出ロボです。(笑)このロボは引出をたくさん持っていて、引出にはいろんなものを入れることができます。こんなロボを考えてみましょう。
先ほども言った通り、ロボは機能と状態で出来ています。引出ロボの機能を考えます。

引出ロボを考えてみる。
f:id:drumer2sh:20131106122034p:plain


<引出ロボの機能>
・引出に何かをしまう。
・引出から何かを取り出す。
・引出の位置を移動する。
・引出を別の引出にコピーする。
・引出を削除する。

くらいでしょうか?では引出の状態はどんな感じでしょう?

<引出ロボの状態>
・引出が開いてるのか?閉まっているのか?
・引出の数
・引出の色
・引出の名前


なんてのがありますね。他にもあるかもしれません。これがこの引出ロボ(オブジェクト)の全容になりますね。
この引出ロボの機能を「メソッド」と呼んでいます。また、引出ロボの状態を「プロパティ」と呼んでいます。

エクセルでロボを置き換えてみると・・・


エクセルでロボを「シート」に置き換えてみましょう。シートロボです(笑)シートロボには・・・

今度はシートロボ。
f:id:drumer2sh:20131106122034p:plain

<シートロボの機能>
・シートをコピーする
・シートを削除する
・シートを選択する
・シートを移動する

という機能があって・・・

<シートロボの状態>
・シートの名前
・シートのインデックス
・シートを表示する?しない?

などがありそうですね。他にもエクセルで置き換えるといろんなロボ(オブジェクト)がありそうです。このように、エクセル自体が実は様々なロボ(オブジェクト)の集合体であるということになります。わかるでしょうか?いろんな小さいロボが、エクセルを動かしているわけです。(笑)

エクセルは実はいろんなロボが集まってできている。。。
f:id:drumer2sh:20131106122033p:plain


これでオブジェクト(ロボ)のメソッド(機能)とプロパティ(状態)がどんなものか?が分かったでしょうか?じゃあこのロボ(オブジェクト)を作ってみましょう。

クラスはオブジェクトの設計図


ロボを作るには設計図がいります。ファーストガンダムの第1話で出てくるアレです。「同じだ!」ってやつ。プログラミングの世界ではロボの設計図があればどんなロボでも一発で作成できます。この設計図のことを「クラス」と呼んでいます。クラスにはこのロボはどんな機能を持っていてどんな状態を持っているのか?を書いておきます。

設計図(クラス)を書くことでそのロボを簡単に作ることができるようになります。
ちょっと簡単に設計図を書いてみましょう。先ほどの例の引出ロボを具体例にしてみます。


引出ロボの設計図(クラス)

クラス 引出ロボ

引出の開閉状態
引出の数
引出の色
引出の名前


機能 引出に何かをしまう

 引出にしまう処理

機能 引出から何かを取り出す

 引出から取り出す処理

機能 引出の位置を移動する。

 引出を移動する処理

機能 引出を別の引出にコピーする。

 引出をコピーする処理

機能 引出を削除する。

 引出を削除する処理


これで設計図は完成です。まず状態の一覧を書いています。その後で機能の一覧です。これだけです。まずはこんな感じなんだなぁと思ってください。意外と簡単だと思いませんか?ただ、状態(プロパティ)と機能(メソッド)を書いただけです。

設計図からロボを作ると「インスタンス」に進化する!


設計図ができれば後は魔法のことば「New」を使うとロボ(オブジェクト)を作成できます。非常に簡単です。いつでもどこでも設計図さえ書いてしまえばロボは何体でも作れるのです。
ここで、ちょっと質問です。何体でも引出ロボを作れるのならそれはどうやって区別したらいいのでしょうか?

簡単です。「ロボに特別な名前をつければいい」のです。

一言で引出ロボと言っても「何をしまうのか?」が明確ではありません。例えば本かもしれないし、洋服かもしれない。はたまたその他いろんなものをしまうかもしれない。
そう、「引出ロボ」は設計図だけでは動かないし、実際に作る時にも何か役割を持って作られるわけです。では洋服をしまうための洋服引出ロボを作成します。Newを使って。。。

洋服引出ロボ=New 引出ロボ


いじょ。

・・・

・・・

・・・

拍子抜けですか?しかしこれだけです。この1文でもう洋服引出ロボはできました。じゃあ本引出ロボは?やっぱり同じです。

本引出ロボ!出撃!
f:id:drumer2sh:20131106122031p:plain

本引出ロボ=New 引出ロボ

これで本引出ロボができました。このように洋服引出ロボも本引出ロボも同じ「引出ロボ」ですが、名前が違います。持っている機能(メソッド)や状態(プロパティ)は同じですね。

このようにNewで作成したロボを「インスタンス」と呼んでいます。

引出ロボ:オブジェクト

で、その引出ロボの設計図(クラス)を使って作った・・・

洋服引出ロボ:インスタンス
本引出ロボ:インスタンス

ということです。これがオブジェクトとインスタンスの関係です。専門的に書くと、オブジェクトはクラスにその設計図が書かれていて、Newすることでインスタンスとしてそのオブジェクトを生成することができます。オブジェクトは1つですが、インスタンスはたくさん作ることができるのです。とても便利ですよね。これが「オブジェクト指向」の素敵なところです。

なぜなら、設計図をまた違うところで持って行ってもまったく同じロボを作成できるんですから。設計図がなかったら同じロボを作るにはまたゼロからつくらなければいけません。非常に大変です。しかし設計図があれば簡単に同じロボがまた別のところで作ることができるのです。

オブジェクト指向と言われている言葉をまるっとすげーざっくり説明するとこんな感じになります。

では、先ほどと同じようにエクセルに置き換えてみましょう。

エクセルに置き換えると・・・


前回と同じくシートロボ(オブジェクト)で考えると簡単です。だってシートは3枚ありますよね?それぞれ同じ機能(メソッド)と機能(プロパティ)を持っていますが、それぞれは独立していて別物です。つまりこのSheet1~3まではシートオブジェクトの「インスタンス」ということがわかると思います。

つまり、シートロボが最初は3体いることになるわけです(笑)

シートロボが3体・・・
f:id:drumer2sh:20131106122034p:plainf:id:drumer2sh:20131106122034p:plainf:id:drumer2sh:20131106122034p:plain

まとめると・・・

あえてカタカナ語の方で書きますと・・・
オブジェクトとはメソッドとプロパティで構成されており、クラスを作成することでいつでもオブジェクトを作成することができる。クラスによってNewされたオブジェクトは「インスタンス」と呼ばれる。


いかがでしょうか?オブジェクトの説明でこんな風に書かれていても絶対に理解はできないと思いますが、今までの説明を読んだ後に見るとなんとなくその内容がイメージできるのではないでしょうか?

同じことを、さっきの言葉でまた説明しなおしますと・・・

ロボ(オブジェクト)は機能(メソッド)と状態(プロパティ)で構成されており、設計図(クラス)を作成することでいつでもロボ(オブジェクト)を作成することができる。
設計図(クラス)によって作成(New)された洋服引出ロボや本引出ロボは「インスタンス」と呼ばれる。

ですね。最初はこのように理解してもらえるといいと思います。
エクセルマクロにはこんなロボたちが沢山います。そしてエクセルを自動で動かすためにはロボに指令を出す必要があるわけです。正しく指令を出さないとロボは動きません。これが「プログラミング」なのです。
そして、ちゃんと「どのロボ」なのか?をエクセルロボ自身が分かるように書いてあげないと命令が宙に浮いてしまうわけです。
あれ?この指令はどのロボのだ?となってしまいます。ですから、、、

動かすロボ(オブジェクト)を正しく指定できればエクセルマクロは超簡単

というわけです。


今日はここまで。


かしこ。