適材適所

パソコン作業の自動化・効率化のための情報を発信するブログ(VBA,PowerShellなど)

挫折した人のためのVBAクラスモジュール入門_その10(最終回)

この記事では

メソッドを定義しよう

前回はメソッドについてお話しました。

今回は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