エクセルVBAクラス備忘録 メイン文ひな形

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でメイン文(親)に戻しています。


素人なので、間違ってたらすみません。汗

追記:
変数の名づけ方は、本当に分かっていない。
ドメインオブジェクトは、プロパティやコレクションなど「変数の型」を定義した入れ物(タイ焼きの型)だと思った方がいいか。
その他のつなぎのオブジェクト(クラス)は、メソッドとかが入っているツール。