Mutable_Yunの業務改善ブログ

業務改善や生産性向上のブログです。自動化の手段として、VBAやRPAの勉強に役立つ解説をしています。

VBA 誰でもできる上級者を突き抜けるオブジェクト指向の考え方

VBAで自動化ツールを作っていると、あまり難しいことを考えなくても作業を進めることができます。しかし、オブジェクト指向という考え方を頭の片隅におくと、プログラミングのレベルが上がると思います。

初段~二段くらいになると思います。今回はオブジェクト指向について考えていきます。
この記事は上級~初段です。
レベルについてはExcel VBAの実力(レベル)を定義してみる 初心者~三段をご参照ください。

目次

オブジェクト指向とは

そもそもオブジェクト指向とはどのようなモノでしょうか。ウィキペディアによると、下記の記述があります。

オブジェクト指向は、プログラミング・パラダイムとして誕生した知識体系である。そのデータ(変数またはプロパティ)とコード(関数またはメソッド)のセットを基本要素にして物事を解析する考え方 
オブジェクト指向 - Wikipediaより抜粋2019/9/28)

プログラミング・パラダイムはプログラミングの考え方という事。VBAでは初めて勉強したとき、変数は値を入れておくモノでした。プロパティはセル(本当はRange)の幅や書式の設定のこと、と教わると思います。それは間違いではありませんが、その頭で読むとこのウィキペディアの説明はよく理解出来ません。

また、変数はどのプログラミング言語でも同じ意味ですが、プロパティ、メソッド、関数はプログラミング言語によって微妙に意味が違っているように思うことがあると思います。

ここでは、一旦VBAで勉強したプロパティはセルの色、メソッドはオブジェクトに対する命令というのは忘れましょう。そして、頭に入れるべきは下記です。

  • オブジェクトは携帯電話のようなモノ。機能がある。例えば電話をかける。メールを受信する。

何かの機能を提供するモノがオブジェクトです。具体的な例については、
VBAのクラスを使う① クラスを使うためのオブジェクトとメソッドの前提知識 - Mutable_YunのVBA上達&業務改善ブログをご参照下さい。

オブジェクト指向とはこのオブジェクトをうまく活用していくと言うことです。今まで、標準モジュールに記載するSubプロシジャの役割は、シートをコピーしたりブックを開いたりと言った作業を記述する事でした。

でも、それらの実態はオブジェクトを使っての操作です。オブジェクトの操作ではなく、オブジェクトの機能を使っている。携帯電話がオブジェクトの例でした。携帯電話の持っている通話機能を使って、電話をかける、と言う事です。

そして、電話をかけるためには相手先の電話番号が必要ですね。これが、変数です。電話をかける相手は場合によって変わるので変数でないと困りますね。

携帯電話の電話番号を受け取る用の変数に電話番号という値を入れて、通話ボタンを押す。この通話ボタンを押す、と言うところが実行部分です。そうすると、携帯電話の機能によって通話が可能になると言うわけです。

ウィキペディアの解説を携帯電話に置き換えて考えると、オブジェクトとはこの通話機能や電話番号を入れておく変数や、押すと通話が始まるボタンを一つの携帯電話というオブジェクトとしてプログラミングをする考え方、となります。

それでは、元に戻って標準モジュールのプロシジャの役割についてもう一度考えてみましょう。

オブジェクト指向を頭に入れた時の標準モジュールの役割

オブジェクトは機能を提供する携帯電話のようなモノでした。それでは、標準モジュールの役割は何でしょうか。

ズバリ、携帯電話を使うことです。分かりましたでしょうか。

これまで、オブジェクト指向を取り入れていなかったときは、携帯電話がなかったので、電話する操作をすべて標準モジュールに書いていました。電源入れて、電話番号入力して、通話ボタンを押すって感じですね。

オブジェクトとして携帯電話というモノを作る事ができれば、それらの機能(例えば電話番号を入力する)はオブジェクトが持っています。なのでそのオブジェクトを呼び出して携帯電話の中に用意されている変数に入れるための電話番号を入れれば良いのです。

オブジェクト指向を取り入れたプログラミングのイメージ

これまでのプログラミングとオブジェクト指向を取り入れたプログラミングのイメージを比較するとこんな感じです。*イメージです!当たり前ですが動きません

Sub これまでのプログラミング()
 ’イメージなのでざっくり

 携帯電話を取り出す
 パスワードをいれてロックを解除する
 通話機能のボタンを押す
 電話番号を入力する
 通話のボタンを押す

End Sub

はい。そのままですね。それではオブジェクト指向を取り入れます。

手順としてはまず携帯電話の説明書を作ります。これをクラスと言います。携帯電話の説明書と言っても使い方の説明書ではありません。携帯電話がどういう動作をするのかの説明書です。この例だと携帯電話の設計図と言った方が分かりやすいかもしれません。

'**ここはVBAではクラスモジュールに書く。クラスモジュール名は「携帯電話」**
Public パスワード As Long
Public 電話番号 As Long

Sub 携帯電話の通話機能()
 Const 正しいパスワード As Long = 12345

 パスワード入力画面.Show

 パスワード = パスワード入力画面.Value   

 If 入力された値 <> 正しいパスワード Then
   MsgBox "パスワードが正しくありません"
   End
 End if

 電話番号 = InputBox()

 電話をかける(電話番号)

End Sub

イメージですよ。突っ込みどころはいろいろあると思いますが、こういう手順を持っている、と思って下さい!

次に、標準モジュールにSubプロシジャを記載していきます。

’**これは標準モジュールに書く。標準モジュールは手順を書く**
Sub 電話をかける()
 
 Set 私の携帯電話 = New 携帯電話 ’携帯電話クラスの「私の携帯」オブジェクトを生成
  私の携帯電話.携帯電話の通話機能 ’ 私の携帯電話が持っている、携帯電話の通話機能のSubプロシジャを実行

End Sub

標準モジュールがめちゃくちゃシンプルになりました。携帯電話の機能と電話をかけるという作業を分けた感じです。

この、クラスによって定義されたSubプロシジャ(を持つオブジェクト)のことをVBAではメソッドと言います。

(余談:オブジェクト指向の他言語でも考え方は同じ。ただし、呼び方が違うことがあるので注意。たとえばJavascriptではクラス(のようなモノ)によって定義された関数をメソッドという、という感じ。ここで言う関数はVBAで言えばSubプロシジャのこと。考え方は同じ。使う言葉が違う。他言語でいう「この単語」がVBAでいえば何のことなのか脳内変換しながら学ぶのが次の言語に言ったときのコツ)

今回は電話番号しか入力しませんでしたが、URLが入力されたらウェブブラウザで開く、電話番号が入力されたら通話する、など入力値によって処理を分けたいときは、変数の取り方をさらにPropertyプロシジャを使って別に作る事もできます。

今回はシンプルにオブジェクト指向を取り入れる事で、機能と機能を使うプログラムを分けて書く事を学びました。

ウィキペディアの説明がより厳密ですが、ウィキペディアの説明より分かりやすければ、このブログが役立った、と言う事ですね!