前回から「Excel VBAのクラス」について勉強を開始ました。今回はその2回目です。
前回、簡単なクラスを作りましたが、それぞれについての詳しい解説はしませんでした。
今回はプロパティの設定に絞って勉強したいと思います (^^)
私でもわかるように少しづつ進めてくれているんですね。
よろしくお願いしますm(_ _)m
はじめに
前回使ったクラスモジュールのコードがこちらです。
'クラスモジュールのコード
'クラスの名前は Msg_sample です
Public Asa As String '朝というプロパティを定義
Public Sub Aisatu() '挨拶を表示するというメソッドを定義します
MsgBox Asa & "おはようございます。" '朝の挨拶を表示
End Sub
3行目のコード最初の部分「Public Asa As String」がクラスのプロパティです。
今回は、このプロパティ設定についての勉強です。
【この記事でわかることは】
・クラスのプロパティを設定する方法
クラスのプロパティを設定する
前回確認したオブジェクトブラウザーをもう一度確認してみましょう。
上の画像のとおり「Asa」はString型のプロパティとして設定されていることが確認できます。
クラスモジュールのプロパティ設定方法
クラスモジュール「Msg_sample」の宣言セクションに「Public Asa As String」と記述して、モジュールレベルの変数「Asa」プロパティを設定しています。
宣言セクションとは、モジュールの先頭から最初のSubプロシージャまたはFunctionプロシージャまでの間のことです。この宣言セクションで変数を宣言すると、モジュールレベルの変数になります。
モジュールレベルの変数は、モジュール内で共通して使用可能の変数です。
一方、プロシージャ内で宣言して使う変数は、プロシージャレベルの変数です。プロシージャ内でのみ使える変数です。
そして、クラスモジュールの宣言セクションで宣言した変数が、そのクラスのプロパティです。
パブリック変数として宣言する
モジュールレベルの変数を宣言する方法は2種類あります。
種類 | 使用ステートメント | 変数の適用範囲 |
---|---|---|
パブリック変数 | Public 変数名 As 型 | プロジェクト内すべて |
プライベート変数 | Private 変数名 As 型 | 宣言モジュール内限定 |
今回クラスモジュールで宣言しているのはパブリック変数です。
宣言したクラスのプロパティ「Asa」は、クラス内だけでなくプロジェクト内すべてモジュールで使えるということです。
試しに Private で宣言してみたら
宣言を Public から Private に変更してみたらどうなるのでしょうか。
プロパティに値を代入する部分でコンパイルエラーになってしまいます。
クラスのプロパティはプライベート変数ではダメだということがわかりました。
クラスのプロパティを設定する変数は、パブリック変数にする必要があるということです。
クラスのプロパティを追加する
「朝の挨拶」のプロパティを設定していますが、他の時間帯の挨拶も設定しておきましょう。
クラスモジュールにプロパティを追加します
クラスモジュールの宣言セクションに、Publicステートメントで追加するプロパティを入力します。
Option Explicit
'クラスモジュールのコード
'クラスの名前は Msg_sample です
Public Asa As String '朝というプロパティを定義
Public Hiru As String '昼というプロパティを定義
Public Ban As String '晩というプロパティを定義
Public Sinya As String '深夜というプロパティを定義
Public Sub Aisatu() '挨拶というメソッドを定義します
If Asa <> "" Then MsgBox Asa & "おはようございます。" '朝の挨拶を表示する
If Hiru <> "" Then MsgBox Hiru & "こんにちは。" '昼の挨拶を表示する
If Ban <> "" Then MsgBox Ban & "こんばんは。" '夜の挨拶を表示する
If Sinya <> "" Then MsgBox Sinya & "おやすみなさい。" '夜の挨拶を表示する
End Sub
・5~7行目が追加した各プロパティ「昼、夜、深夜」の記述です。
・9~12行目のメソッド部分にも、標準モジュールからの呼び出しに対応できるよう、Ifステートメントで各プロパティに分岐するよう手を加えました。
オブジェクトブラウザーを確認
追加したプロパティが定義できているかオブジェクトブラウザを確認してみます。
それぞれ問題なく設定できていますね。
標準モジュールのコードも変更
標準モジュールからクラスモジュールを呼び出すコードの例も変更します。
Option Explicit
'標準モジュールのコードサンプル
Sub MsgTest()
Dim Say As Msg_sample 'インスタンス化したクラスを入れる変数
Set Say = New Msg_sample 'クラスをNew(インスタンス化)する
Dim num As Long
re:
num = Application.InputBox( _
"呼び出す時間帯の番号を入力してください" & vbCrLf & _
"[キャンセル]又は「0」で中止!" & vbCrLf & _
"1=[朝]、2=[昼]、3=[晩]、4=[深夜]", "番号選択", Type:=1)
Select Case num
Case 0: Exit Sub
Case 1
Say.Asa = "朝の挨拶:" 'クラスのAsaプロパティに値を代入する
Case 2
Say.Hiru = "昼の挨拶:" 'クラスのHiruプロパティに値を代入する
Case 3
Say.Ban = "晩の挨拶:" 'クラスのBanプロパティに値を代入する
Case 4
Say.Sinya = "深夜の挨拶:" 'クラスのSinyaプロパティに値を代入する
Case Else
MsgBox "入力値が不正です!再指定してください。"
GoTo re
End Select
Say.Aisatu 'オブジェクトのメソッドを呼び出す
End Sub
・6行目に InputBox の戻り値を受ける変数(Long)を宣言しています。
・8行目で Application.InputBox (Type:=1)を使ってプロパティを番号で指定できるようにしました。
・12~25行目は、Select Case で Application.InputBox の戻り値を分岐する処理を追加しています。
・22~24行目で入力値が不正の場合、再入力させるために GoToステートメントを使っています。
問題なく動作できていますね。
まとめ(おわりに)
クラスについて2回目の勉強はここでおしまいです。
クラスのプロパティを設定する方法は理解できましたか?
基本的な部分はしっかり覚えてくださいね(^^)
はい!
モジュール変数をパブリックで宣言すればプロパティになるんですね(^^)
プロパティを増やしたらメソッドや呼び出す側も調整が必要なことがわかりました。
はい。そのとおりです。
基本的な部分の解説はまだまだ続きます。
次回はクラスのインスタンスを生成する方法かメソッドについて勉強しましょう(^^)/
わかりました。次回もよろしくお願いしますm(_ _)m
まとめと感想など
以上、エクセルVBAでクラスにプロパティを追加する方法を紹介しました。
今回おわかった大事なことはこちらです。
クラスについて学ぶことはまだまだたくさんあります。次の解説も是非ご覧ください。
Excel VBA クラスについての記事一覧
★★★ ランキング参加中! クリックしてね(^^)/ ★★★
過去記事のサンプルファイルをダウンロードできます
この記事のサンプル登録はありません。記事内のコードをご利用ください。
過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください