t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBA Classモジュールを活用する

今回はベテランVBA使いの方にもあまり活用されていないと思われるClassモジュールの活用について。

現在発売されている書籍でもClassモジュールについての説明がほとんど無く、パーフェクト○○とか、完全○○とか書かれた網羅系の書籍をあたると一番最後の方に申し訳程度に掲載されているくらいだ。

またその説明も、「使い方」に終始しており「使いどころ」については触れられていない。
そこで今回は、Classモジュールの何が便利なのか、例を挙げて紹介する。

※使い方については他のWebサイトなどでも検索できるのでそちらを当たってください。
※2016年末に重い腰を上げてようやく「使い方」に関する入門を書きましたのでご参照ください。
thom.hateblo.jp

私の記事ではないけど、こちらもおススメ!
ateitexe.com


実は先日、このような動画を作った。

このマクロの中で、Classモジュールを活用している。

このマクロの動作を大ざっぱに説明すると、VBAからIEを操作して各カテゴリページを開き、各商品の情報を商品コレクションに格納する。
それから商品コレクションをFor Eachで回しながらセルに転記している。

Webから取得したばかりの商品情報は、次のように余計なテキストがくっついている。

表示名 = "【大阪クンテープ道頓堀本店】大人気!タイ料理5点セット【送料無料】 【冷凍】"
価格表記 = "3,402円(税抜 3,150円、税 252円)"

これを、こうしたい。

商品名 = "大人気!タイ料理5点セット"
価格 = "¥3,402"

そこで作ったのがこちらの「商品」クラス

Public 表示名 As String
Public 価格表記 As String
Public カテゴリー As String

Public Property Get 価格() As String
    価格 = Replace(価格表記, ",", "")
    価格 = Val(価格)
End Property

Public Property Get 税別価格() As Long
    税別価格 = Int(CCur(価格) / 1.08)
End Property

Public Property Get 名称() As String
    名称 = Replace(表示名, vbNewLine, "")
    Dim re As New RegExp
    re.Pattern = "【[^【]*】"
    re.Global = True
    名称 = re.Replace(名称, "")
    名称 = Trim(名称)
    Set re = Nothing
End Property

中身は気にしなくて良い。ポイントは、Propertyが3つともGet(取得専用)であるということ。
※ホントは価格表記や表示などは書込み専用にするのが望ましいが、そのへんは省略した。

こうすると何が良いかというと、メインのマクロを、以下のように超シンプルに書けるようになる。

'商品の作成
Dim x As 商品
Set x = New 商品

'商品の設定
x.表示名 = "【大阪クンテープ道頓堀本店】大人気!タイ料理5点セット【送料無料】 【冷凍】"
x.価格表記 = "3,402円(税抜 3,150円、税 252円)"

'商品の読み取り
Debug.Print x.名称
Debug.Print x.価格

ただ表示名と価格表記をセットして、代わりに名称と価格を読み取っただけであるが結果は見事に整形されて次のようになる。

大人気!タイ料理5点セット
3402

あとは金額をセル側の書式でいじれば完成。
今回の説明では使わなかったが、税別価格もプロパティとして用意してあるので応用が利く。

他の例を挙げると、顧客クラスを作って生年月日を格納すると年齢プロパティで情報を取得できるし、未成年かどうかというプロパティを作ることもできる。

オブジェクトのことはオブジェクトにやらせる。そうすればメインコードはよりスッキリして処理の流れを追いやすくなる。

クラスモジュールを扱っているVBA

残念ながら日本の書籍ではまともにクラスモジュールを扱っているものは殆ど無い。
洋書なら以下の本が詳しいのでおススメである。

VBA Developer's Handbook

VBA Developer's Handbook

(絶版書のため価格高騰。しかし1000ページ超あり、日本語書籍とは比べものにならないくらい情報満載なので購入する価値はあると思う。)


日本語の書籍では、以下の本がクラスモジュールに少しページを割いている。

そこが知りたい!Excel VBAプロの技 Excel97/2000/2002/2003対応!

そこが知りたい!Excel VBAプロの技 Excel97/2000/2002/2003対応!

(絶版書のため価格高騰。)

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。