読者です 読者をやめる 読者になる 読者になる

クラスモジュールを用いた自作クラスのプロパティについて

VBAクラス・モジュール

クラスモジュールの使い方を練習するため、遊び半分にプログラムしてみた。
高橋麻奈さんの『やさしいJava』に倣って、車オブジェクトを作るという体で。

f:id:akashi_keirin:20170107135025j:plain


とりあえず、Sheet1に、上の画像のような表を作る。
A、B列の1行目にはコマンドボタンを設置している。

まずは、「車クラス」の設計。

クラスモジュールを挿入し、「オブジェクト名」を「Car」にする。
f:id:akashi_keirin:20170107142247j:plain

クラスモジュールにコードを記述。


Option Explicit

Private Number_ As Integer
Private Name_ As String
Private Gas_ As Double
Private Speed_ As Integer

'Class Field
Public Property Let Number(ByVal New_Number As Integer)
    If CStr(New_Number) <> "" Then
        Number_ = New_Number
    End If
End Property

Public Property Get Number() As Integer
    Number = Number_
End Property

Public Property Let Name(ByVal New_Name As String)
    If New_Name <> "" Then
        Name_ = New_Name
    End If
End Property

Public Property Get Name() As String
    Name = Name_
End Property

Public Property Let Gas(ByVal New_Gas As Double)
    If New_Gas < 0 Then
        MsgBox "ガソリン量がマイナスて……。"
        MsgBox "ふざけるなボケーーー!", vbCritical
        MsgBox "     _________" & vbCrLf & _
        " /          \ " & vbCrLf & _
        "/ /・\  /・\    \" & vbCrLf & _
        "|   ̄ ̄    ̄     | ち~んw" & vbCrLf & _
        "|    (_人_)    |" & vbCrLf & _
        "|     \     |          |" & vbCrLf & _
        "\      \_|     /"
        End
    ElseIf New_Gas > 100 Then
        MsgBox "そんなにガソリンが入るかい、ボケ!", vbCritical
        MsgBox "     _________" & vbCrLf & _
        " /          \ " & vbCrLf & _
        "/ /・\  /・\    \" & vbCrLf & _
        "|   ̄ ̄    ̄     | ち~んw" & vbCrLf & _
        "|    (_人_)    |" & vbCrLf & _
        "|     \     |          |" & vbCrLf & _
        "\      \_|     /"
        End
    Else
        If CStr(New_Gas) <> "" Then
            Gas_ = New_Gas
        End If
    End If
End Property

Public Property Get Gas() As Double
    Gas = Gas_
End Property

Public Property Let Speed(ByVal New_Speed As Integer)
    If New_Speed < 0 Then
        MsgBox "スピードがマイナスて……。"
        MsgBox "ふざけるなボケーーー!", vbCritical
        MsgBox "     _________" & vbCrLf & _
        " /          \ " & vbCrLf & _
        "/ /・\  /・\    \" & vbCrLf & _
        "|   ̄ ̄    ̄     | ち~んw" & vbCrLf & _
        "|    (_人_)    |" & vbCrLf & _
        "|     \     |          |" & vbCrLf & _
        "\      \_|     /"
        End
    ElseIf New_Speed > 400 Then
        MsgBox "そんなスピード出るか、ボケ!", vbCritical
        MsgBox "     _________" & vbCrLf & _
        " /          \ " & vbCrLf & _
        "/ /・\  /・\    \" & vbCrLf & _
        "|   ̄ ̄    ̄     | ち~んw" & vbCrLf & _
        "|    (_人_)    |" & vbCrLf & _
        "|     \     |          |" & vbCrLf & _
        "\      \_|     /"
        End
    Else
        If CStr(New_Speed) <> "" Then
            Speed_ = New_Speed
        End If
    End If
End Property

Public Property Get Speed() As Integer
    Speed = Speed_
End Property

'Constructer
Private Sub Class_Initialize()
    Number_ = 0
    Name_ = "名無し"
    Gas_ = 0#
    Speed_ = 4
End Sub

'Class Method
Public Sub showCar()
    MsgBox "車・" & Name & "の" & vbCrLf & _
           "ナンバーは、" & Number & "、" & vbCrLf & _
           "ガソリンは、" & Gas & "リッターです。" & vbCrLf & _
           "本気を出せば、" & Speed & " km/hで走ります。"
End Sub

Public Sub runCar()
    If Me.Gas <> 0 Then
        MsgBox Name & "行きま~す!" & vbCrLf & _
            Me.Speed & " km/hでぶっ飛ばすぜ!" & vbCrLf & _
            "ぶおおおおおん!"
        If Me.Gas > Me.Speed * 0.1 Then
            Me.Gas = Me.Gas - Me.Speed * 0.1
        Else
            Me.Gas = 0
            MsgBox "ぷすん!……" & vbCrLf & _
               "ガソリンがなくなったようだ……。"
        End If
        MsgBox Me.Name & "のガソリン量が、" & Me.Gas & _
               "リッターになりました。"
    Else
        MsgBox Name & "行きま~す!" & vbCrLf & _
               Me.Speed & " km/hでぶっ飛ばすぜ!" & vbCrLf & _
               "ぷすん!……" & vbCrLf & _
               "ガソリンがないようだ……。"
    End If
End Sub


「Car」というオブジェクトに「Number」「Name」「Gas」「Speed」というプロパティを設置したわけだ。
「Number」を例に取ると、次のようなコードで実装していることになる。


Private Number_ As Integer    'クラス内での値受け渡し用変数
Public Property Let Number(ByVal New_Number As Integer)    '値設定用プロシージャ
    Number_ = New_Number
End Property
Public Property Get Number() As Integer    '値取得用プロシージャ
    Number = Number_
End Property

Carクラスを使うには、変数を宣言して、New演算子インスタンス化すれば良い。
以後、その変数をオブジェクトとして使用できる。

たとえば、標準モジュールの宣言セクションで、


Public car1 As Car    'Carクラス型の変数car1を宣言


と宣言し、プロシージャ内で、


    Set car1 = New Car


とすれば、以後「car1」をオブジェクトとして扱えるということ。

で、本題。
オブジェクトcar1のNumberプロパティに値を設定するときは、当然、たとえば
car1.Name = 1234
などとすれば良い。
で、大切なのは、このときにどんな処理が為されているか、という流れを理解しておくこと。

順を追って書いておこう。
【プロパティへの値の設定】

      car1.Name = 1234 が実行される→Property Let Name プロシージャに1234が渡される
      Property Let Nameプロシージャの仮引数New_Nameが1234を受け取る
      Private変数Name_に1234が代入される


【プロパティからの値の取得】
※たとえば、car1オブジェクトのNameプロパティをメッセージボックスに表示するとしよう。

      Msgbox car1.Name が実行される。
      car1のNameプロパティを取得するためにProperty Get Nameプロシージャに処理が移る
      Nameプロパティの値はPrivate変数Name_に入っているので、NameプロパティにName_の値(1234)を代入する
      car1.Nameの値として「1234」を得て、メッセージボックスには「1234」が表示される。


という流れで値を設定したり、取得したりしている。

値の設定と取得の際に、一旦Private変数を噛ますというのは一見無駄なようだが、使いようによってはいろいろ便利だったりする。