Excel VBAでオブジェクト指向プログラミング 簡単なネットショッピングをモデルとして
こんにちは、けえるです。この記事ではExcel VBAを使ってオブジェクト指向プログラミングをやってみようと思います。
今回はECサイトでのショッピングを例とします。商品を選び、ショッピングカートに入れ、ショッピングカートの合計金額が表示される。このようなプログラムをExcel VBAで実現してみようと思います。まずは今回例で使うクラス図(フィールドとメソッドを省略しています。またシンプルなクラス図にしています。揺さぶりをかけると色々出てくるかもしれませんがご了承ください)を示します。
上のクラス図は、商品クラスであるItem、注文クラスであるOrder、さらに注文を入れるショッピングカートクラスのShoppingCartでできています。
まずはOrder(注文)クラスと、Item(商品)クラスの関係をみていきます。OrderからみてItemの多重度は0..1となっているので、OrderはItemを一つ持つことができます。次にItemからみてOrderの多重度は0..*となっているので、Itemは複数のOrderを持つことになります。一つのItemは複数の注文に登場する可能性があるためこのようにしています。
次にShoppingCartからみて注文は複数あります。故にOrder側の多重度は0..*とし、OrderからみてShoppingCartは一つであるとします。
クラス図より関連端名を-Item、-ordersとしています。これは、OrderクラスにはprivateなItemというフィールドが存在し、ShoppingCartクラスにはprivateなordersというフィールドが存在する事を示しています。
ここまで出来たらExcel VBAで標準モジュールとクラスの構成を組み立てます。下にモジュールの構成を示します。
まずメインメソッドを書くモジュールとして、標準モジュールにMdlを作成します。さらにクラスモジュールに、Itemクラス、Orderクラス、ShoppingCartクラスを作成します。それではItemクラスのプログラムから見ていきます。
Itemクラスにはフィールドとして、商品の名前を保持するname、値段を保持するpriceを定義しています。どちらもprivateで修飾し、アクセサメソッドである、セッターとゲッター(17行目から31行目)でフィールドにアクセスするようにします。次にOrderクラスを見ていきます。
OrderクラスはフィールドにItem型のitem。商品の個数を保持するInteger型のqtyを定義します。ここでも同様に15行目から29行目でフィールドへのアクセサメソッドを定義します。また商品の値段と個数から、合計金額を出すgetTotalメソッドを定義します。次はShoppingCartクラスを見ていきます。
ShoppingCartクラスでは複数の注文(order)を扱います。そのためcollection型のフィールドordersを定義します。ここでvbaの場合フィールドでインスタンスを生成できないため、コンストラクタ(Class_Initialize)でcollectionオブジェクトを生成しordersにセットしています。さらにaddメソッドを定義することにより、order(注文)をordersに複数格納することができます。
さらに23行目から34行目で、複数の注文から合計金額を算出するgetTotalメソッドを定義します。
これで、Itemクラス、Orderクラス、ShoppingCartクラスの準備は完了です。それでは標準モジュールMdlで実際に動かしてみたいと思います。
まず6行目から19行目でItem型のapple、banana、orangeを定義します。そしてそれぞれのインスタンスを生成し、セッターを使い商品名と値段をセットします。
次に21行目から34行目でorder型のorder1、order2、order3のインスタンスを生成します。そして商品であるapple、banana、orangeをセットします。さらに商品の個数もセットします。
ここで注文である、order1、order2、order3をShoppingCartにセットする必要があります。そのため、36行目から41行目でShoppingCart型のインスタンスを生成し、addメソッドを呼び出し、order1、order2、order3をShoppingCart型のcartに追加します。これでショッピングカートに注文を入れることができました。
最後に、43行目から46行目でShoppingCartクラスのgetTotalメソッドを呼び出し、MsgBox関数で画面に表示しています。
今回は身近にあるExcelを用いて、オブジェクト指向プログラミングをしてみました。VBAはオブジェクト指向を完璧にサポートしていないため、多少無理があるのはご了承ください。
こちらの記事が皆様のExcel VBAプログラミングの参考になれば幸いです。ここまで読んでくれた方々ありがとうございました。