Mutable_Yunの業務改善ブログ

業務改善や生産性向上のブログです。自動化の手段として、VBAやRPAの勉強に役立つ解説をしています。

VBA クラスモジュールの使い方を超簡単に日本語のクラス名で具体的に解説する② Propertyプロシジャを作る

エクセルVBAのクラスモジュールを日本語のクラス名で、徹底的に簡単に解説するシリーズの2回目です。

この記事は初段です。
レベルについてはExcel VBAの実力(レベル)を定義してみる 初心者~三段をご参照ください。

目次

この記事の狙い

この記事ではクラスモジュールでクラスを生成する際にプロパティプロシジャを使えるように解説することが目的です。 VBA クラスモジュールの使い方を解説する① で作成したクラスモジュールに手を加えてクラスの内容を充実させていきます。

Propertyプロシジャとは

そもそもPropertyとは何か

Propertyプロシジャについていろいろと調べてもよく分からない理由は、そもそもPropertyとは何かが曖昧だからです。そこで、まずPropertyとは何かを確認します。

Propertyとはデータのことです。データとは文字列とか数値と言った値やひとまとまりの値の集まりである配列などです。

Propertyプロシジャはデータの取り扱いを決める手順

つまり、Propertyプロシジャとは、データ(=文字列や数値や配列と言った値を)を取得したり、設定したりといった取り扱いの方法を決めるプロシジャです。

Propertyプロシジャを実際に作ってみる

実際にコードを見た方が分かるので、具体例を見て行きましょう。現在アクティブなシートのA1セルに文字列が入っています。

現在のシートの状況:A1セルに「abc」という文字列が入っている
A1セルに「abc」という文字列が入っている

前回作ったメソッド

お約束通り、極限に分かりやすくする為に、プロシジャ名などは日本語で作成していきます。
まず、 VBA クラスモジュールの使い方を解説する① で作成したクラスモジュールの中身を再掲します。クラス名は「A列の値を操作するクラス」です。

'これは「A列の値を操作するクラス」というクラスモジュールの中のコードです
Public Function A列の文字を受け取って表示するメソッド()
    
    Dim 文字列を受け取る変数_str As String
    文字列を受け取る変数_str = Cells(1, 1)

    A列の文字を受け取って表示するメソッド = 文字列を受け取る変数_str
    
End Function

現在は「A列の値を操作するクラス」には、このFunctionプロシジャで書かれたひとつのメソッドしかありません。このモジュールを改善していきます。

Property Getステートメントを追加する

Property Getステートメントとは

プロパティプロシジャの一つ目はProperty Getステートメントで作成しますこのPropertyプロシジャは値を取得するときに使います。ここがややこしいところなので注意です。VBAのクラスの使い方をちょっと復習しておきましょう。

クラスモジュールはオブジェクトの持つメソッドを記述する為にある、仕様書とか設計図でした。使うときは、標準モジュールで、クラスに書かれたメソッドを使えるようにインスタンスを生成します。インスタンスを生成するとは、「オブジェクトを自分で作る」と言うのと同じです。

そして、「値を取得する」とは、標準モジュールから見てです。標準モジュールがオブジェクトを利用するので、「標準モジュールから見て取得する」のはオブジェクトから見ると値を渡している事になります。ここがややこしいポイントです。いまからクラスモジュールにGetと書くのですが、オブジェクトが取得する側で無いので気をつけましょう。

Property Getステートメントを実際に書く

「A列の文字を受け取って表示するメソッド」のFunctionプロシジャの下に、下記のコードを追加します。コピペでは無く、自分で書きましょう!

'これは「A列の値を操作するクラス」というクラスモジュールの中のコードです
Property Get A列の値を受け取る()

End Property

End Propertyが補完入力されます。次にこの中身を追記します。一行だけですけどね。

'これは「A列の値を操作するクラス」というクラスモジュールの中のコードです
Property Get A列の値を受け取る()

    A列の値を受け取る = Cells(1, 1)
    
End Property

できました。初めてのPropertyプロシジャの完成です。せっかくプロパティプロシジャを作ったのですから、A列の文字を受け取って表示するメソッドを書き換えておきましょう。

'これは「A列の値を操作するクラス」というクラスモジュールの中のコードです
Public Function A列の文字を受け取って表示するメソッド()
    
    Dim 文字列を受け取る変数_str As String
    '文字列を受け取る変数_str = Cells(1, 1)  ←ココをコメントアウトした
    文字列を受け取る変数_str = A列の値を受け取る ’ココにプロパティプロシジャ!
    A列の文字を受け取って表示するメソッド = 文字列を受け取る変数_str
    
End Function

イメージがわいてきましたか?クラスモジュールの中にCells(1, 1)がいきなり出てきたら「なんでA1のセル?」となりますよね。「1」などの普通の数値などの値をリテラルと言うのですが、後から見たときに分かりにくくなるのがリテラルの難点です。そこでProperty
プロシジャに分かりやすい名前をつけて値を取得したのです
。そしてこれこそがPropertyプロシジャの意義です。いきなりセルの番地が出てくるより「A列の値を受け取る」の方が分かりやすいですよね!

実際に使う:インスタンスを生成して、プロパティの値を受け取る

今回、標準モジュールは前回から一切変更していません。再掲します。

'これは標準モジュールに記載してあるプロシジャです
Sub クラスを使う標準モジュール()

    Dim A列の値を操作するオブジェクト As A列の値を操作するクラス
    Set A列の値を操作するオブジェクト = New A列の値を操作するクラス
    
    MsgBox A列の値を操作するオブジェクト.A列の文字を受け取って表示するメソッド
    
End Sub

実行を押すと、MsgBoxにA1セルの値が表示されます。F8でステップイン実行してプログラムの流れを確認しましょう。

Property Letステートメントを追加する

Property Letステートメントとは

Property Letステートメントはデータを設定します。Getの逆です。標準モジュールから見て、設定する、ですね。クラスから見ると受け取るように見えるのでコチラも要注意です。イメージを掴むために例を挙げます。

’これは標準モジュールでプロパティに値を設定するコードの例です
Range("A1").Interior.ColorIndex = 3

これはInteriorクラスのColorIndexプロパティに3を設定してA1セルを赤くするコードですね。プロパティに値を設定するとはこういうことです。標準モジュールで値を設定するので、クラス側はその値を受け取る為の変数が必要となります。具体的に見て行きましょう。

Property Letステートメントを実際に書く

先ほど作ったPropertyプロシジャの下に以下のコードを追加します。

'これは「A列の値を操作するクラス」というクラスモジュールの中のコードです
Property Let B列に値を設定する(設定する値を一時的に代入する為の変数 As String)
    
    Cells(1, 2) = 設定する値を一時的に代入する為の変数

End Property

「設定する値を一時的に代入する為の変数」という変数をカッコ内に書いています。Functionプロシジャみたいですね。標準モジュールで設定した値はこの変数に代入されることになります。そしてその変数を使ってA2セルに代入するという手順が記述されています。

実際に使う:インスタンスを生成して、プロパティに値を設定する

プロパティに値を設定するコードを標準プロシジャに追記します。

’これは標準モジュールのプロシジャです
Sub クラスを使う標準モジュール()

    Dim A列の値を操作するオブジェクト As A列の値を操作するクラス
    Set A列の値を操作するオブジェクト = New A列の値を操作するクラス
    
    MsgBox A列の値を操作するオブジェクト.A列の文字を受け取って表示するメソッド
    
    A列の値を操作するオブジェクト.A列に値を設定する = "Hello" '←ココを追記した
    
End Sub

A列の値を操作するオブジェクト.A列に値を設定する = "Hello" の部分が、

Interior.ColorIndex = 3

と同じ構造になっている事が分かると思います。実行すると、メッセージボックスにA1セルの値が表示され、A2セルにHelloと入力されます。

以上でPropertyプロシジャの説明を終わります。引き続き頑張ってクラスモジュールを使いこなす為の知識を増やしていきましょう。