目標
VBAのクラスモジュールについて利用方法を理解できる
クラスをインスタンス化して利用する方法を理解できる
VBAのクラスの概要とクラスモジュールの利用方法
VBAのクラスの学習前に
クラスを学習する時には「オブジェクト指向」という概念を知ることも必要となりますが、この記事ではクラスモジュールを利用して「クラスを作ること」「クラスを利用すること」に焦点を当てて進めていきます。
クラスの概要
クラスとは
属性(値の入る変数)と機能(メソッド)をセットにして準備しておくプログラムのことです。準備しておくプログラムなのでそれ単体では基本的に動くことはありません。
クラスとして準備したプログラムはインスタンス化することで利用可能な状態(オブシェクト:下画像の緑の丸)になります。インスタンス化は実体化といわれます。イメージは変数にクラスのコピーが入った状態です。(実際には作成されたオブジェクトへの参照が入ります。)
クラスの利用方法
クラスモジュールの作成
クラスモジュールの作成「挿入」タブ内の「クラスモジュール」を選択します。
プロジェクトエクスプローラーにクラスモジュールが作成され「Class1」のシートが作成されます。
今回作成した「Class1」をダブルクリックするとClass1のエディタがコードウィンドウに表示されます。また左下にはClass1のプロパティウィンドウが表示されます。
以上でクラスモジュールの作成は完了です。続けて作成したクラスモジュールを編集していきます。
クラスモジュールの編集
プロパティウィンドウのオブジェクト名の変更をします。今回は「Car」と変更します。オブジェクト名は作成するクラスの名前で、そのクラスの型を意味します。
クラスモジュールにプログラムを記述します。解説については次回の記事を参考にしてください。この記事では「ひとまず作成」して「利用」してみます。
Option Explicit
'--------------------------------------------------------------------------------------------------------------------
'【属性の秘匿化】
Private this_carModel As String
Private this_carSheets As Integer
Private this_engineDisplacement As String
'--------------------------------------------------------------------------------------------------------------------
'【コンストラクタ】
Private Sub Class_Initialize()
Dim carModel As Integer
Dim carSheets As Integer
Dim engineDisplacement As Integer
carModel = InputBox("興味のある車のタイプを番号でしてください" & Chr(10) & "1:乗用車、2:ワゴン/SUV、3:ボックス")
carSheets = InputBox("シート数を入力してください")
engineDisplacement = InputBox("排気量を選択してください" & Chr(10) & "1:1600未満、2:1600以上~2800未満、3:2800以上")
Select Case carModel
Case 1
this_carModel = "乗用車"
Case 2
this_carModel = "ワゴン/SUV"
Case 3
this_carModel = "ボックス"
Case Else
this_carModel = "乗用車"
End Select
this_carSheets = carSheets
Select Case engineDisplacement
Case 1
this_engineDisplacement = "Small"
Case 2
this_engineDisplacement = "Middle"
Case 3
this_engineDisplacement = "Large"
Case Else
this_engineDisplacement = "Small"
End Select
End Sub
'--------------------------------------------------------------------------------------------------------------------
'【属性初期化の代用】
Public Function Init(carModel As String, carSheets As Integer, engineDisplacement As String) As Car
Set Init = Me
this_carModel = carModel
this_carSheets = carSheets
this_engineDisplacement = engineDisplacement
End Function
'--------------------------------------------------------------------------------------------------------------------
'【this_carModelのgetter】
Public Property Get carType() As String
carType = this_carModel
End Property
'【this_carModelのsetter】
Public Property Let carType(ByVal carModel As String)
this_carModel = carModel
End Property
'【this_carSheetsのgetter】
Public Property Get SheetsNum() As Integer
SheetsNum = this_carSheets
End Property
'【this_carSheetsのsetter】
Public Property Let SheetsNum(ByVal SheetsNum As Integer)
this_carSheets = SheetsNum
End Property
'【this_carSizeのgetter】
Public Property Get carSize() As String
carSize = this_engineDisplacement
End Property
'【this_carSizeのsetter】
Public Property Let carSize(ByVal carSize As String)
this_engineDisplacement = carSize
End Property
'--------------------------------------------------------------------------------------------------------------------
'【Carクラスの独自メソッド】
Public Sub searchFor()
Worksheets("sheet1").Range("A1").Select
If this_carModel = "乗用車" And this_carSheets <= 4 And this_engineDisplacement = "Small" Then
Range("A1").value = "ヤリス"
Range("B1").value = "パッソ"
ElseIf this_carModel = "乗用車" And this_carSheets <= 4 And this_engineDisplacement = "Middle" Then
Range("A1").value = ""
Range("B1").value = ""
MsgBox "お求めの物はございません。"
ElseIf this_carModel = "乗用車" And this_carSheets <= 4 And this_engineDisplacement = "Large" Then
Range("A1").value = ""
Range("B1").value = ""
MsgBox "お求めの物はございません。"
ElseIf this_carModel = "乗用車" And this_carSheets > 4 Then
Range("A1").value = ""
Range("B1").value = ""
MsgBox "お求めの物はございません。"
ElseIf this_carModel = "ワゴン/SUV" And this_carSheets <= 7 And this_engineDisplacement = "Small" Then
Range("A1").value = ""
Range("B1").value = ""
MsgBox "ワゴン/SUVはMiddle以上になっています。"
ElseIf this_carModel = "ワゴン/SUV" And this_carSheets <= 7 And this_engineDisplacement = "Middle" Then
Range("A1").value = "RAV"
Range("B1").value = "フォレスター"
ElseIf this_carModel = "ワゴン/SUV" And this_carSheets <= 7 And this_engineDisplacement = "Large" Then
Range("A1").value = "ラウンドクルーザー"
Range("B1").value = "アウトランダー"
ElseIf this_carModel = "ワゴン/SUV" And this_carSheets > 7 Then
Range("A1").value = ""
Range("B1").value = ""
MsgBox "お求めの物はございません。"
ElseIf this_carModel = "ボックス" And this_carSheets <= 9 And this_engineDisplacement = "Small" Then
Range("A1").value = "ライトエース"
Range("B1").value = ""
ElseIf this_carModel = "ボックス" And this_carSheets <= 9 And this_engineDisplacement = "Middle" Then
Range("A1").value = "タウンエース"
Range("B1").value = ""
ElseIf this_carModel = "ボックス" And this_carSheets <= 9 And this_engineDisplacement = "Large" Then
Range("A1").value = "ハイエース"
Range("B1").value = ""
ElseIf this_carModel = "ボックス" And this_carSheets > 9 Then
MsgBox "お求めの物はございません。"
End If
End Sub
ここまでで、最初のイラストにあった「準備したクラス」(赤い丸)部分の作成が完了です。このプログラムは単に準備されたものなので、このまま利用することはできません。
クラスをインスタンス化して利用する
ここから準備したクラスの複製(オブジェクト)を作成(インスタンス化)して利用してみたいと思います。インスタンス化をするためのプログラムを標準モジュールに記載します。
標準モジュールお準備します。
Module1が作成されるので次のようにプロシージャを入力します。
Option Explicit
Sub IsOperator()
Dim rentCar1 As Car
Set rentCar1 = New Car
rentCar1.searchFor
MsgBox "先ほど入力された情報は次の通りです" & Chr(10) & rentCar1.carType & Chr(9) & rentCar1.SheetsNum & Chr(9) & rentCar1.carSize
Set rentCar1 = Nothing
End Sub
ここでは次の2行によってクラスのインスタンス化が行われています。
Dim rentCar1 As Car ‘(Car型の入れ物「rentCar1」を宣言します)
Set rentCar1 = New Car ‘(宣言したrentCar1にCarのオブジェクトを代入します)
これによって変数「rentCar1」に準備したクラスのプログラムが全て複製されて入っているような状態になります。(実際には作成されたオブジェクトは別の場所に保管されていて、この変数はそのオブジェクトへの参照が入ります。)
続いて「rentCar1.searchFor」でrentCar1インスタンスのsearchForプロシージャを呼び出しています。
実行結果
Sheet1のセルに値が入力されます。
(インスタンスのsearchForプロシージャの動き)
メッセージボックスに入力ボックスから入力した内容が表示されます。
(呼び出し側のIsOperatorプロシージャの動き)
「Set rentCar1 = Nothing」で利用することのなくなったオブジェクトの後始末を行います。この後始末はCOMの利用ではないので必須ではありませんが、あらゆるオブジェクトにつける癖をつけておくのが望ましいです。
今回の内容は以上となります。次回はカプセル化やクラス内特有のプログラムについての記事になっています。
ブックマークのすすめ
「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。