01-VBA

クラスの利用方法|Excel VBA (Part.1) | 現役エンジニア&プログラミングスクール講師

目標

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の利用ではないので必須ではありませんが、あらゆるオブジェクトにつける癖をつけておくのが望ましいです。

今回の内容は以上となります。次回はカプセル化やクラス内特有のプログラムについての記事になっています。

初心者も実践で通用!「VBA・VBS」おすすめ書籍5選 | 現役エンジニア&プログラミングスクール講師「VBA・VBS」初心者の方が実践業務の中でそれらを活用しt活躍できるために必要な知識を習得できる書籍を紹介しています。ページの下部には「おすすめのITスクール情報」「おすすめ求人サイト」について情報を掲載中。...

ブックマークのすすめ

「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。

「お気に入り」の登録・削除方法【Google Chrome / Microsoft Edge】「お気に入り」の登録・削除方法【Google Chrome / Microsoft Edge】について解説している記事です。削除方法も掲載しています。...
【パソコン選び】失敗しないための重要ポイント | 現役エンジニア&プログラミングスクール講師【パソコン選び】失敗しないための重要ポイントについての記事です。パソコンのタイプと購入時に検討すべき点・家電量販店で見かけるCPUの見方・購入者が必要とするメモリ容量・HDDとSSDについて・ディスプレイの種類・バッテリーの持ち時間や保証・Officeソフト・ウィルス対策ソフトについて書いています。...
RELATED POST
01-VBA

Excel VBA の エラー処理(Part.1)| 現役エンジニア&プログラミングスクール講師

2022年12月26日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

Excel VBA の「コメント」と「一括コメント」| 現役エンジニア&プログラミングスクール講師

2022年12月12日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

ExcelVBAのCellsプロパティ | 現役エンジニア&プログラミングスクール講師

2022年8月18日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

印刷機能|Excel VBA (Part.1)【PageSetupプロパティ/PrintPreviewメソッド/PrintOutメソッド】編 | 現役エンジニア&プログラミングスクール講師

2022年12月5日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

印刷機能番外|Excel VBA (Part.2)【「=」「:=」Withステートメント】編 | 現役エンジニア&プログラミングスクール講師

2022年12月6日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site
01-VBA

ダイアログボックス|Excel VBA (Part.1)【MsgBox】基本文法編 | 現役エンジニア&プログラミングスクール講師

2022年12月2日
プログラミング学習 おすすめ書籍情報発信 パソコン初心者 エンジニア希望者 新人エンジニア IT業界への就職・転職希望者 サポートサイト Programming learning Recommended schools Recommended books Information dissemination Computer beginners Prospective engineers New engineers Prospective job seekers in the IT industry Support site