Digital_Neko

フリーランスプログラマー

Excel VBAでオブジェクト指向 買い物(ショッピング)をモデルとして

こんにちはOnoです。今回はExcel VBAでオブジェクト指向を体験して行きたいと思います。
日常での買い物を例にして、ShoppingCartクラス、Order(注文)クラス、Item(商品)クラス
でモデルを構成します。商品を注文し、ショッピングカートに入れて合計金額を出します。
早速ですがクラス図は下記になります。

買い物 クラス図

このクラス図では、OrderがItemクラスに対して注文します。Orderは一つのItemを登録することが
できるので、Item側の多重度は0..1とします。またItemは複数の注文に登場する可能性があるので、
Order側の多重度は0..*とします。そしてShoppingCartは複数のOrderを受けることができます。
そのため、Order側の多重度は0..*とします。さらにOrderに対してShoppingCartは1つなので、
ShoppingCart側の多重度は1とします。

そしてクラス図には関連端名で-itemと-ordersと記入してあります。これはitemをOrderクラスの
プライベートなフィールドとして定義し、ordersをShoppingCartのプライベートなフィールドと
して定義することを意味しています。ここまで来たらExcelVBAでプログラムを開始します。

クラスとモジュールの構成は下図になります。

プロジェクト構成

標準モジュールとして、Mdl、クラスモジュールとして、Item、Order、ShoppingCartを追加
します。まずはItemクラスから見ていきます。

Itemクラス

Itemクラスにはフィールドとして、商品の名前を表すname、値段を表すpriceを定義します。また
それぞれのフィールドに対して、アクセサメソッドであるゲッターとセッターを定義します。図では
17行から31行にかけてアクセサメソッドを定義しています。次にOrderクラスを見ていきます。

Orderクラス

Orderクラスにはitemと数量を管理するqtyというフィールドを定義します。それぞれのフィールドに
ゲッターとセッターを定義します。また数量と商品の値段から合計金額を出す、getTotalメソッドを
定義します。次にShoppingCartクラスを見ていきます。

ShoppingCartクラス

ShoppingCartには複数件の注文を入れることができるので、OrdersというCollectionを
フィールドに定義します。これはクラスが生成される時(コンストラクタ19行から21行)に
Collectionオブジェクトを生成します。そして注文をCollectionに格納するために、
addメソッド(15から17行目)を定義しています。つまりaddメソッドを使って注文を
ShoppingCartに入れます。これで複数件の注文を扱うことができます。

最後に、ShoppingCartに入っている商品の合計金額は、23から34行目のgetTotalメソッドで
算出しています。For Each構文を使いOrdersからOrderを一つずつ取り出し、OrderのgetTotal
メソッドを呼び出し、合計金額を算出します。これでクラスの準備は完了です。標準モジュール
Mdlで実際に動作させてみましょう。Mdlのプログラムは下記になります。

標準モジュールMdl

まず6行から19行で、Item型のインスタンスを生成し、それぞれのインスタンスに、名前と値段を
セットします。ここでは「Apple 100円」、「Banana 80円」、「Orange 120円」としました。

そして21行から、34行ではOrder型のインスタンスorder1、order2、order3を生成し、それぞれに
Item型のインスタンス、「apple」、「banana」、「orange」をセットします。同時に注文した
数量もセットします。

最後に36行、37行でShoppingCart型のインスタンスcartを生成し、39行から41行でcartに注文
をセットします。ここまできたら、44行でcartのgetTotalメソッドを呼び出します。そして、46行
でメッセージボックスに合計金額を表示します。

これで、ショッピングカートに商品を入れるモデルをExcelVBAで表現することができました。

今回はExcel VBAでオブジェクト指向を体験するプログラムを紹介しました。この記事が皆様の参考
になれば幸いです。