20240422 エクセルVBAクラス備忘録 メイン文ひな形
<前書き>
エクセルVBAオブジェクト指向、初心者です。
VBA自体は、以前から使用していました。
オブジェクト指向というものがあることは、知っていましたが、ネットなどを見てもよく分からず、挫折した過去あり。
<以上前書き>
(素人なので間違っているかもしれません。汗。)
前回、メイン処理について、思ったことのメモの続きです。
前回、【自分なりのルール】を考えるということで、
●クラスを使う場合、なるべくメイン文で、クラスをインスタンス化する
(一度インスタンス化したデータをメイン文内で追えるようにしておく)
●そのインスタンス化したデータを利用して、他の処理につなげる場合は、functionでメイン文にデータを持ってくる。
(よく利用するデータは深いところで処理しない(処理してもfunctionでメインに戻す))
●そのインスタンス化したデータを利用しない場合(一度切りの処理・中間処理など)、メインに戻さないでよい。
(クラスメソッドでインスタンス化して、そこで終了)(インスタンスが消える処理すればなお良い)
とか、書きました。
以下に、メイン文の書き方を意識したひな形のようなコードを書きます。
(どんどんややこしくなります。)
(変数名もややこしくてすみません。)
<ひな形1>(基本形)
Sub メイン文ひな形1()
Dim vクラス_sub As クラス_sub
Set vクラス_sub = New クラス_sub
vクラス_sub.値_sub = "hello_sub"
Debug.Print vクラス_sub.値_sub
Dim vクラス_func As クラス_func
Set vクラス_func = New クラス_func
vクラス_func.判定_number = 6
Dim クラス_func_戻り値_main As Variant
クラス_func_戻り値_main = vクラス_func.割り算(vクラス_func.判定_number)
Debug.Print クラス_func_戻り値_main
End Sub
//////////////////////////////
'クラス_sub
Option Explicit
Private m値_sub As Variant
'let
Public Property Let 値_sub(p値_sub As Variant)
m値_sub = p値_sub
End Property
'get
Public Property Get 値_sub() As Variant
値_sub = m値_sub
End Property
//////////////////////////////
'クラス_func
Option Explicit
Private m判定_number As Variant
'let
Public Property Let 判定_number(p判定_number As Variant)
m判定_number = p判定_number
End Property
'get
Public Property Get 判定_number() As Variant
判定_number = m判定_number
End Property
Function 割り算(pクラス_func_引数) As Variant
割り算 = pクラス_func_引数 / 2
End Function
//////////////////////////////
メイン文で、クラス_subと'クラス_funcをインスタンス化して実行しています。
クラス_subは、戻り値なしで、メイン文には、引続き使用するデータはありません。
(うまく言えませんがDebug.Printするだけ。
まあ、vクラス_sub.値_subは持っているのですが。)
'クラス_funcは、functionで戻り値を使って、メイン文に値を戻しています。
(メイン文で宣言した、クラス_func_戻り値_mainを持ちます。
これで自由にメイン文で使用できます。)
=========================================================
<ひな形2>失敗?(あ、セッター通らない)
Sub メイン文ひな形2()
Dim vクラス_値 As クラス_値
Set vクラス_値 = New クラス_値
vクラス_値.判定_number = 6
Dim クラス_値_戻り値_main As Variant
クラス_値_戻り値_main = vクラス_値.判定_number 'funcではないが
Debug.Print クラス_値_戻り値_main
Dim vクラス_func As クラス_func
Set vクラス_func = New クラス_func
'メインに戻す
Dim クラス_func_戻り値_main As Variant
クラス_func_戻り値_main = vクラス_func.割り算(クラス_値_戻り値_main) 'propertyletは外部から入る時。これだと直接メソッドに入る・・・
Debug.Print クラス_func_戻り値_main
End Sub
/////////////////////////////////////
'クラス「クラス_値」
Option Explicit
Private m判定_number As Variant
'let
Public Property Let 判定_number(p判定_number As Variant)
m判定_number = p判定_number
End Property
'get
Public Property Get 判定_number() As Variant
判定_number = m判定_number
End Property
/////////////////////////////////////
'クラス「クラス_func」
Option Explicit
Private mクラス_値_戻り値 As Variant
'let
Public Property Let クラス_値_戻り値(pクラス_値_戻り値 As Variant) '通らない
mクラス_値_戻り値 = pクラス_値_戻り値
End Property
'get
Public Property Get クラス_値_戻り値() As Variant '通らない
クラス_値_戻り値 = mクラス_値_戻り値
End Property
Function 割り算(pクラス_値_戻り値) As Variant
mクラス_値_戻り値 = pクラス_値_戻り値
割り算 = mクラス_値_戻り値 / 2
End Function
//////////////////////////////////
ひな形2では、'クラス「クラス_値」というクラスを1個作りました。
「クラス_func」と「クラス_値」の二つのクラスを親子にして、メインから呼ぶための前段階として作りました。
(何も実装していませんが、「クラス_値」で、数字や文字判定などしてもいいかなとか思ったりしました。)
この段階では、「クラス_func」も「クラス_値」メインに直接入れて、インスタンス化しています。
でも、このコードだと、「クラス_func」のProperty Let クラス_値_戻り値、Property Get クラス_値_戻り値を通りません。
クラス_func_戻り値_main = vクラス_func.割り算(クラス_値_戻り値_main)
の「クラス_値_戻り値_main」は、メイン文のただの変数なので、セッターもゲッターも通らず、スルーです。
(あまり実例を知りませんが、ただの値が入る変数は、セッターやゲッターを通した方がいいのかなと思います。)
(中身が、コレクションや配列やシートなどのオブジェクトは、セッターやゲッターを通さなくてもいいのか??不明)
で、どうするか?
=========================================================
<ひな形3>(セッターを通すコード)
Sub メイン文ひな形3()
Dim vクラス_値 As クラス_値
Set vクラス_値 = New クラス_値
vクラス_値.判定_number = 6
Dim クラス_値_戻り値_main As Variant
クラス_値_戻り値_main = vクラス_値.判定_number 'funcではないが
Debug.Print クラス_値_戻り値_main
Dim vクラス_func As クラス_func
Set vクラス_func = New クラス_func
Dim クラス_func_戻り値_main As Variant
vクラス_func.クラス_値_戻り値 = クラス_値_戻り値_main
クラス_func_戻り値_main = vクラス_func.割り算(vクラス_func.クラス_値_戻り値)
Debug.Print クラス_func_戻り値_main
End Sub
////////////////////////////////////
'クラス「クラス_値」
Option Explicit
Private m判定_number As Variant
'let
Public Property Let 判定_number(p判定_number As Variant)
m判定_number = p判定_number
End Property
'get
Public Property Get 判定_number() As Variant
判定_number = m判定_number
End Property
//////////////////////////////////////
'クラス「クラス_func」
Option Explicit
Private mクラス_値_戻り値 As Variant
'let
Public Property Let クラス_値_戻り値(pクラス_値_戻り値 As Variant)
mクラス_値_戻り値 = pクラス_値_戻り値
End Property
'get
Public Property Get クラス_値_戻り値() As Variant
クラス_値_戻り値 = mクラス_値_戻り値
End Property
Function 割り算(pクラス_値_戻り値) As Variant
mクラス_値_戻り値 = pクラス_値_戻り値
割り算 = mクラス_値_戻り値 / 2
End Function
////////////////////////////////////
<ひな形3>では、
vクラス_func.クラス_値_戻り値 = クラス_値_戻り値_main
クラス_func_戻り値_main = vクラス_func.割り算(vクラス_func.クラス_値_戻り値)
として、割り算メソッドの引数をクラスの変数にしました。
上段の
vクラス_func.クラス_値_戻り値 = クラス_値_戻り値_main
で、Property Let クラス_値_戻り値を通り、
下段の
クラス_func_戻り値_main = vクラス_func.割り算(vクラス_func.クラス_値_戻り値)
で、Property Get クラス_値_戻り値を通った後、
Function 割り算を実行します。
まあ、セッターとゲッターを通したかっただけです。汗。
===================================================
<ひな形4>(クラスを子・孫にする)(メイン文(親)-クラス(子)-クラス(孫)にする)
階層としては、
・メイン文(親)
・子クラス(メイン文に子クラス「クラス_値」の結果を戻す)
・孫クラス(孫「クラス_func」の結果は、子クラス「クラス_値」に返す)
Option Explicit
Sub メイン文ひな形4()
Dim vクラス_値 As クラス_値
Set vクラス_値 = New クラス_値
vクラス_値.判定_number = 6 '・・・①
Dim クラス_値_戻り値_main As Variant
クラス_値_戻り値_main = vクラス_値.処理_func(vクラス_値.判定_number) '・・・③
Debug.Print クラス_値_戻り値_main '・・・⑨
End Sub
///////////////////////////////////
'クラス「クラス_func」
Option Explicit
Private mクラス_値_戻り値 As Variant
'let
Public Property Let クラス_値_戻り値(pクラス_値_戻り値 As Variant) '・・・⑥
mクラス_値_戻り値 = pクラス_値_戻り値
End Property
'get
Public Property Get クラス_値_戻り値() As Variant '・・・⑦
クラス_値_戻り値 = mクラス_値_戻り値
End Property
Function 割り算(pクラス_値_戻り値) As Variant '・・・⑧
mクラス_値_戻り値 = pクラス_値_戻り値
割り算 = mクラス_値_戻り値 / 2
End Function
/////////////////////////////////////
'クラス「クラス_値」
Option Explicit
Private m判定_number As Variant
'let
Public Property Let 判定_number(p判定_number As Variant) '・・・②
m判定_number = p判定_number
End Property
'get
Public Property Get 判定_number() As Variant '・・・④
判定_number = m判定_number
End Property
Function 処理_func(p判定_number As Variant) As Variant '・・・⑤
Dim vクラス_func As クラス_func
Set vクラス_func = New クラス_func
vクラス_func.クラス_値_戻り値 = p判定_number
処理_func = vクラス_func.割り算(vクラス_func.クラス_値_戻り値)
End Function
////////////////////////////////////////
番号を振った順①~⑨に実行します。
「クラス_値」(子)で、「クラス_func」(孫)を呼んでいますが、結果は、functionでメイン文(親)に戻しています。
素人なので、間違ってたらすみません。汗
追記:
変数の名づけ方は、本当に分かっていない。
ドメインオブジェクトは、プロパティやコレクションなど「変数の型」を定義した入れ物(タイ焼きの型)だと思った方がいいか。
その他のつなぎのオブジェクト(クラス)は、メソッドとかが入っているツール。