[VBA]ExcelVBAでオブジェクト指向の継承 [Programming ExcelVBA]
[ポイント]
・ExcelのVBA(Visual Basic for Application)は、
完全オブジェクト指向言語(JavaやC#等)ほどではないですが、
オブジェクト指向によるプログラミングをサポートしています。
『オブジェクト指向』と言えば、
代表的な性質として以下の3つのキーワードがあります。
代表的な性質
[VBAのオブジェクト指向]
VBAのオブジェクト指向は、完全オブジェクト指向言語(JavaやC#等)のそれと比べると、
『子クラスのメソッドを経由して親クラスの変数やメソッドにアクセスできない』、
『子クラス内から親クラスの変数やメソッドにアクセスできない』等の制限事項がある。
[多態性(ポリモフィズム)]
『多態性(ポリモフィズム)』の説明で、
『動物』に『鳴く』メッセージを通知する例がよく挙げられる。
以下に、『多態性(ポリモフィズム)』を利用したサンプルコードを示す。
[クラス図]
[クラスの説明]
・Mammalクラス
哺乳類を表すクラス。
メソッドとして、Cry()を実装。
・Dogクラス、Catクラス、Crowクラス
イヌ、ネコ、カラスを表すクラス。各々のクラスはMammal(哺乳類)クラスを継承。
メソッドとして、Mammal_Cry()を実装。
([親クラス名]_[親クラスのメソッド名]で、親クラスのメソッドをオーバーライドできます。)
[多態性(ポリモフィズム)]
・Dogオブジェクト、Catオブジェクト、Crowオブジェクトを
Mammalオブジェクトの配列に格納する。
MammalオブジェクトのCrowメソッドを経由して、
Dogオブジェクト、Catオブジェクト、CrowオブジェクトのCrowメソッドを呼ぶ。
以下のサンプルでは、3つのMammalオブジェクトのCryメソッドを呼んでいるが、
実際に実行されるのは、Dog、Cat、CrowのMammal_Cryメソッドであることを示している。
同一のCryというメッセージをMammalオブジェクトに通知しているが、
受け取った各々のオブジェクト毎に異なった動作をしていることになる。(多態性(ポリモフィズム))
[サンプルコード]
[実行結果]
・ExcelのVBA(Visual Basic for Application)は、
完全オブジェクト指向言語(JavaやC#等)ほどではないですが、
オブジェクト指向によるプログラミングをサポートしています。
『オブジェクト指向』と言えば、
代表的な性質として以下の3つのキーワードがあります。
代表的な性質
継承 |
2つのクラス間で親子関係を持ち、子クラスが親クラスの性質を受け継ぐこと。 |
カプセル化 |
オブジェクト内部のデータを隠蔽したり(データ隠蔽)、オブジェクトの振る舞いを隠蔽したり、 オブジェクトの実際の型を隠蔽したりすることをいう。 |
多態性(ポリモフィズム) |
実行される処理の実体が、コールされたメッセージではなく、メッセージを受けたオブジェクトに よって決定される性質。 また、この性質を使って、 「同一のメッセージを使って、オブジェクトごとに異なった処理を行わせること」 |
[VBAのオブジェクト指向]
VBAのオブジェクト指向は、完全オブジェクト指向言語(JavaやC#等)のそれと比べると、
『子クラスのメソッドを経由して親クラスの変数やメソッドにアクセスできない』、
『子クラス内から親クラスの変数やメソッドにアクセスできない』等の制限事項がある。
[多態性(ポリモフィズム)]
『多態性(ポリモフィズム)』の説明で、
『動物』に『鳴く』メッセージを通知する例がよく挙げられる。
以下に、『多態性(ポリモフィズム)』を利用したサンプルコードを示す。
[クラス図]
[クラスの説明]
・Mammalクラス
哺乳類を表すクラス。
メソッドとして、Cry()を実装。
・Dogクラス、Catクラス、Crowクラス
イヌ、ネコ、カラスを表すクラス。各々のクラスはMammal(哺乳類)クラスを継承。
メソッドとして、Mammal_Cry()を実装。
([親クラス名]_[親クラスのメソッド名]で、親クラスのメソッドをオーバーライドできます。)
[多態性(ポリモフィズム)]
・Dogオブジェクト、Catオブジェクト、Crowオブジェクトを
Mammalオブジェクトの配列に格納する。
MammalオブジェクトのCrowメソッドを経由して、
Dogオブジェクト、Catオブジェクト、CrowオブジェクトのCrowメソッドを呼ぶ。
以下のサンプルでは、3つのMammalオブジェクトのCryメソッドを呼んでいるが、
実際に実行されるのは、Dog、Cat、CrowのMammal_Cryメソッドであることを示している。
同一のCryというメッセージをMammalオブジェクトに通知しているが、
受け取った各々のオブジェクト毎に異なった動作をしていることになる。(多態性(ポリモフィズム))
[サンプルコード]
| |
[ExcelVBA]Mammalクラス |
| |
[ExcelVBA]Dogクラス |
| |
[ExcelVBA]Catクラス |
| |
[ExcelVBA]Crowクラス |
| |
[ExcelVBA]呼び出し元 |
[実行結果]
Dim man(2) As Mammal
'イヌ、ネコ、カラスの
'オブジェクトを生成
Set man(0) = New Dog
Set man(1) = New Cat
Set man(2) = New Crow
のところを最初は読み飛ばしてしまい、その重大な意味を見落としておりました、、、宣言時には「Mammal」なのに、Set-New時には「Dog」になったり、「Cat」になったり都度変化ができる、ということですね。Implementsすごすぎます。お陰様でプログラミングの幅が拡げられそうです。わかりやすいご解説、誠にありがとうございました。<m(__)m>
by tusrezurenarupapa (2015-06-06 21:32)
とても勉強になりました!
by turezurenarupapa (2015-06-20 00:09)
他の言語でオブジェクト指向を学んだのですが、
VBAでクラスを作ることができなかったので
クラスの作成、使い方を学んだ後、継承を勉強させてもらいました。
EXCEL VBAでもクラスが作れそうになれたので、
この記事には大感謝です。
by よかみち (2018-12-19 11:25)
>他の言語でオブジェクト指向を学んだのですが、
>VBAでクラスを作ることができなかったので
>クラスの作成、使い方を学んだ後、継承を勉強させてもらいました。
⇒Implementsを利用すれば、
Javaや.NETでいうコンパレータを作ることができます。
Object型配列のソート機能に応用できるので、
ぜひ試してみてください。
by zebratch (2019-03-10 23:00)
vbaにこんな機能があったんですね。
オーバーライド側の命名規約は生涯好きになれそうもありませんが驚きました。
投稿された時に知りたかった。勉強不足過ぎますね。
余談ですが、会社でSalesforceの導入が検討されたのですが却下されました。
by 元プログラマ (2023-09-28 22:28)