- この記事では
- メソッドを定義しよう
- 住所の都道府県名を返すメソッドの仕様
- メソッドの定義方法
- 住所の都道府県名を返すメソッドの実装
- これでGodExcelオブジェクトはひとまず完成
- 最後に
- GodExcelクラスの完成形
この記事では
- VBAのクラスモジュールの使い方を解説しています。
- メソッドの定義方法を解説しています。
- この記事はクラスモジュールの実践的な使い方を学びたい人に向けて書いています。
- シリーズものです。その1はこちら→挫折した人のためのVBAクラスモジュール入門_その1 - 適材適所。
メソッドを定義しよう
前回はメソッドについてお話しました。
今回はGodExcelオブジェクトに二つのメソッドを実装して、GodExcelオブジェクトを完成させたいと思います。
実装するメソッドは前回例であげた 「住所の都道府県名を返すメソッド」にします。
住所の都道府県名を返すメソッドの仕様
まずはメソッドの簡単な仕様を確認しましょう。
住所には必ず都道県名が含まれているという前提とします。
例えば、住所が「東京都足立区1-1」であれば「東京都」と返すこととします。、戻り値のデータ型は文字列(String)です。
メソッド名は「getPrefName」とします。
メソッドの定義方法
そういえば、メソッドの定義方法について全く触れていませんでした。
メソッドは関数だ、と前回ちょこっとお話しました。
通常、関数であれば、Functionステートメントで定義します。
クラスモジュールでも定義方法は全く同じです。
では実際に作ってみましょう。
住所の都道府県名を返すメソッドの実装
これはクラスモジュールというよりはVBAの実装方法なのでやり方はいくらでもありますが、私はこんな風に実装してみました。
Public Function getPreName() As String '最初に都道府を調べる Select Case True Case InStr(Address, "東京都") > 0 getPreName = "東京都": Exit Function Case InStr(Address, "大阪府") > 0 getPreName = "大阪府": Exit Function Case InStr(Address, "京都府") > 0 getPreName = "京都府": Exit Function Case InStr(Address, "北海道") > 0 getPreName = "北海道": Exit Function End Select '県を調べる Dim index As String: index = InStr(Address, "県") If index <> 0 Then getPreName = Left(Address, index) Else getPreName = "" End If End Function
これをクラスモジュールに定義してあげることで、外部プログラムはこのようにメソッドを呼び出すことができるようになります。
Sub sampleTest() Dim god As GodExcel Set god = New GodExcel `このように呼び出します Debug.Print god.getPreName End Sub
メソッドは、GodExcelオブジェクトの変数にドットでつないで呼び出します。
メソッドは、関数なのでもちろん引数をとることも可能です。
これでGodExcelオブジェクトはひとまず完成
GodExcelオブジェクトはこれで一応完成です。
この完成をもって「挫折した人のためのクラスモジュール入門シリーズ」も終わりにします。
クラスモジュールを使って、ワークシートの情報をオブジェクトにする方法を10回に分けて解説してきました。
クラスモジュールの使い方、意味など、なんとなくでも感じていただければ幸いです。
ここで紹介した使い方は、クラスモジュールの使い方の一つの例です。そして、特にExcelでクラスモジュールを使う際にはこの手法は効果的です。
最後に
クラスモジュールを使うことで、VBAのプログラムは堅牢で柔軟なものにすることができます。
これをきっかけに、他のサイトや、書籍などを使ってさらに学習の幅を広げていただければと思います。
このシリーズでは、わかりやすい説明を心がけるため、クラスモジュールの文法について深く説明はしませんでした。
またオブジェクト指向についての考え方も、触りの部分しか触れることができませんでした。VBAで使うことが可能な多態性やインターフェースなどの、興味深いトピックが残されています。
もし、反響があれば、続編を書いていきたいと思います。
また別の記事で、私が日ごろ参考にさせていただいているサイトや書籍を紹介したいと思います。
最後にGodExcelクラスの完成コードを載せて終わりにします。
GodExcelクラスの完成形
'プロパティ Private pNameFurigana As String Private pNameKanji As String Private pBirthDay As Date Private pPostalCode As String Private pAddress As String Private pMailAddress As String Private pWorkPlace As String Private pProffsion As String Const NAME_FURI_RNG As String = "B6:U6" Const NAME_KAN_RNG As String = "B8:U8" Const BIRTH_Y_RNG As String = "B12:E12" Const BIRTH_M_RNG As String = "F12:G12" Const BIRTH_D_RNG As String = "H12:I12" Const POST1_RNG As String = "B16:D16" Const POST2_RNG As String = "F16:I16" Const ADR_RNG As String = "B18:U19" Const MAIL_RNG As String = "B22:U23" Const WORK_PLACE_RNG As String = "B26:N26" Const PROFFESION_RNG As String = "P26:U26" Public Property Get NameFurigana() As String NameFurigana = pNameFurigana End Property Public Property Get NameKanji() As String NameKanji = pNameKanji End Property Public Property Get BirthDay() As Date BirthDay = pBirthDay End Property Public Property Get PostalCode() As String PostalCode = pPostalCode End Property Public Property Get Address() As String Address = pAddress End Property Public Property Get MailAddress() As String MailAddress = pMailAddress End Property Public Property Get WorkPlace() As String WorkPlace = pWorkPlace End Property Public Property Get Proffsion() As String Proffsion = pProffsion End Property Private Sub Class_Initialize() pNameFurigana = getItem(Range(NAME_FURI_RNG)) pNameKanji = getItem(Range(NAME_KAN_RNG)) pBirthDay = DateSerial(getItem(Range(BIRTH_Y_RNG)), _ getItem(Range(BIRTH_M_RNG)), _ getItem(Range(BIRTH_D_RNG))) pPostalCode = getItem(Range(POST1_RNG)) & getItem(Range(POST2_RNG)) pAddress = getItem(Range(ADR_RNG)) pMailAddress = getItem(Range(MAIL_RNG)) pWorkPlace = getItem(Range(WORK_PLACE_RNG)) pProffsion = getItem(Range(PROFFESION_RNG)) End Sub Private Function getItem(aRng As Range) As String Dim recString As String Dim i As Long For i = 1 To aRng.Count Dim r As Range: Set r = aRng.Item(i) recString = recString & r.Value Next i getItem = recString End Function Public Function getPreName() As String '最初に都道府を調べる Select Case True Case InStr(pAddress, "東京都") > 0 getPreName = "東京都": Exit Function Case InStr(pAddress, "大阪府") > 0 getPreName = "大阪府": Exit Function Case InStr(pAddress, "京都府") > 0 getPreName = "京都府": Exit Function Case InStr(pAddress, "北海道") > 0 getPreName = "北海道": Exit Function End Select '県を調べる Dim index As String: index = InStr(pAddress, "県") If index <> 0 Then getPreName = Left(pAddress, index) Else getPreName = "" End If End Function