20240614エクセルVBAクラス備忘録基本的なこと?分かっていないこと
<前書き>
エクセルVBAオブジェクト指向、初心者です。
VBA自体は、以前から使用していました。
オブジェクト指向というものがあることは、知っていましたが、ネットなどを見てもよく分からず、挫折した過去あり。
<以上前書き>
(素人なので間違っているかもしれません。汗。)
今回は、コードは書いていません。
ここ最近、クラス、オブジェクト指向をやってきて、思ったこととしたことの?備忘録(未確認・未確定メモ)です。
(素人なので間違っているかも。汗)
*********************************************
タイトルに、基本的なことと書いたが、「基本的なことも分からない」という感じです。汗。
感謝
youtube「ひとりごとワンダーランド」様
(不都合あれば削除いたします。)
●●●●●●●●●●●●書く順番
クラスを作成する際、標準モジュールや、ユーザーフォーム、または親クラスで、
インスタンス化のコードを書こうとすると、、候補が出てくる。(インテリセンス機能。)
→そう考えると、コード作成は、先に(子)クラスから書いた方がいいか。当たり前か。
(参考)
関係ないが、下記のように、変数の宣言と使っている変数名が違っていても、コンパイルエラーにならない。
(単純に、MaxLengthプロパティを通らないため、効かない。)
Option Explicit
Private mClass1() As Class1
Private Sub CommandButton1_Click()
mClass(vCount).MaxLength = 20
End Sub
当たり前だが、mClass1() (vCount).MaxLength = 20 と書く。
●●●●●●●●●●●●スコープについて(例)(深く理解しないまま勝手に書いてます)
標準モジュール
dim vインスタンス変数 as クラス名
set vインスタンス変数 = NEW クラス名
クラス
private m変数1 as 【オブジェクト以外名(stringとか)】
Public Property Let 変数1(p変数1 As string)
m変数1 = p変数1
End Property
Public Property Get 変数1() As string
変数1 = m変数1
End Property
上記は、public letを通って、親モジュールから変数がやってくる。
返す時は、public getを通って、親モジュールに変数を返す。
private m変数2 as 【オブジェクト名(rangeとかcollectionとか)】
のオブジェクトを扱う場合は、setを使う。
プロパティ以外に、subやfunctionが使えるが、親から呼ばれるのは、public sub public function。
privateが付いている場合は、このクラス内で使われるメソッド。
上記は当たり前のことを書いている。
親から呼ばれる時は、publicで呼ばれ、(内部はprivateを使い、)
親に返す時は、publicで返す。カプセル化(隠蔽化)の仕組み。
(参考)上記だが、個人的には、コードのpublicを上に、privateをコードの下に集めたい。
しかし、宣言は上にしか書けない。下記はエラーになる。順番は大事。
Option Explicit
Property Set TextBoxRef(pTextBox As MSForms.TextBox)
Set mTextBox = pTextBox
End Property
Public Property Let MaxLength(pMaxLength As Long)
mMaxLength = pMaxLength
End Property
Private WithEvents mTextBox As MSForms.TextBox
Private mMaxLength As Long
Private Sub mTextBox_Change()
If VBA.IsNumeric(mTextBox.Value) = True Then
MsgBox "数値の入力は出来ません", vbCritical
End If
If Len(mTextBox.Value) > mMaxLength Then
MsgBox "入力する最大文字数は" & mMaxLength & "です。", vbCritical
End If
End Sub
変数の宣言は上に置かなくてはならない。当たり前だが。
publicとprivateの混在がややこしく見える・・・。
●●●●●●●●●●●●with eventsについて(コードウィンドウの(ボックスの)使い方)
コードウィンドウの「オブジェクトボックス」、「イベントボックス」。
今まであまり意識してなかったが、with eventsを、
Private WithEvents mTextBox As MSForms.TextBox
のように設定すると、
コードウィンドウの左側の「オブジェクトボックス」の一覧に、
自分の宣言したオブジェクトが表示され、
右側の「イベントボックス」に、左記のオブジェクトが使用できるイベント一覧が出る。
今まで、手続き型では、
左側の「オブジェクトボックス」は、(general)で、
右側の「イベントボックス」には、subなどが表示されていた。
(参考)
mTextBoxは、オブジェクトブラウザでも健作できるようになる。
+++++++++++++++++++++++++++
以上が分かったこと。で、何が分からないのか?
<どこをオブジェクト指向で書けばいいのか(どう書けばいいのか分からない)>
今、何となくですが、表データの取り込みや各データのクラスへのまとめ方(personやpersonsなど)までは
クラスでできます。汗。
でも、その先、ユーザーフォームで言えば、
コマンドボタンごと?
スクロールバー?
テキストボックスの連動?
動きのあるもの?分岐するもの?関連・連動するもの?
なんかをどう書けばいいのか悩んでいます。
おそらく、そもそもスクロールバーなどすでにオブジェクトとして用意してあるものは、
そのまま利用すればいいと思います。
でも、そのままコードを書こうとすると、どうしても手続き型で、
「この値がこの場合は、こうする」とか、
従来のコードになってしまいます。
違うかもしれませんが、
「スクロールバー1_新規」
とか、いろんなイベントを持たせたらいいのか???
どうまとめようか、試行錯誤です。
(今後の参考(具体的ではないですが考え方))
ユーチューブ「ゆるコンピュータ科学ラジオ」様を見せていただきました。(感謝)
(不都合あれば削除いたします。)
上記動画と全く関係ないかもしれないメモ。(無関係なこと書いてます。)
オブジェクト指向の命令:例「魔法使いが攻撃する」
→MPを減らす、相手と自分の素早さを比較する、とか(手続き型で)書かない。
(データ・命令をひとまとめ)
オブジェクト指向は、パラダイムシフト(考え方の大幅な変更)の一つであり、
コンピュータのプログラム・システムが変わったのではない。
オブジェクト指向は、手続き型(構造化)プログラミングより、実在世界の考え方に近くして、
プログラミングを分かりやすくしようとしたもの。
(従来の手続き型では、sub などの組合せ、
(エドガー・ダイクストラさんの)
順次(sequence)部分プログラムを順々に実行する。
選択(selection)条件式が導出した状態に従い、次に実行する部分プログラムを選択して分岐する。
反復(repetition)条件式が導出した特定の状態の間、部分プログラムを繰り返し実行する。
・・・の上に、もう一段階、実在社会のようなまとめ方(クラス)をかませたようなものか。
→だから、まわりくどく感じるのか???
クラスの特徴・・・カプセル化、継承、多態性(ポリモーフィズム)
①カプセル化(情報隠蔽)・・・これは、VBAでもできる。でも、簡単な使い方のみならば「構造体」(type)でいいのでは・・・。
(ものをまとめるだけならtypeでもできる。ふるまいをまとめるにはクラス必要か???)
②継承・・・extend とか 人間、戦士、魔法使いとか。VBAではできない?委譲ならできる?overrideとかもある。
人間で設定して、子クラスに戦士、魔法使い、等設定する方法か。
別の例では、親(肉食べる)子(焼肉食べる)(しゃぶしゃぶ食べる)
(他にオーバーロード(相手でふるまい変わる?とかもある。)
→継承を使いこなすには、一段レベルが高いか。VBAでできない???
③多態性(ポリモーフィズム)・・・何が主体でも作動(戦う)。
例
戦士が戦う
魔法使いが戦う
でなくて、
「人間戦う」の命令で、「戦士が戦う」とか、勝手に割り振ってくれる。
(勝手に番地に飛べる。)
その他
抽象化 「鳥の定義」きつつき、ペンギン(飛べない)は?
VBAでできないのか?imprementsでできる???
→多態性を使いこなすには、一段レベルが高いか。VBAでできない???
ユーチューブの話にも出てきたが、パラダイムシフトで、考え方が変わると(使えるけど)使われなくなること(命令)もある。
データや命令のやり取りは、構造化プログラミングの前のgoto文時代と実際は変わりがない。
goto文時代
↓
構造化プログラミング時代(書き方変える。ifとかfor使う書き方。)
↓
オブジェクト指向プログラミング時代(書き方変える。一段クラスをかませる?(保守性・使用性・管理性向上?))
(内容は、goto文時代と変わらない。命令やデータの番地・アドレスに行くだけ。)
オブジェクト指向で一段かませると、構造化プログラミングを書く必要(似たもの)があるので、まどろっこしくなる。(①のせい)
(かなり上達すれば、②③が使えて、いいものになるのかも。)
いつか、「腑に落ちる日」が来るのかな。
その他
オブジェクト指向は、「参照透過性」、結果が分かりづらいため、「関数型」プログラミング(言語)があるそうだ・・・。汗。
エンジニアも非エンジニアもつらいね。