エクセルVBAクラス指向備忘録小さいメモ (withevents思ったこと ・implements(スクロールバー依存関係解消)2本

20240729エクセルVBAクラス指向備忘録小さいメモ (withevents思ったこと  implements(スクロールバー依存関係解消)

<前書き>
エクセルVBAオブジェクト指向、初心者です。
VBA自体は、以前から使用していました。
オブジェクト指向というものがあることは、知っていましたが、ネットなどを見てもよく分からず、挫折した過去あり。
<以上前書き>

(素人なので間違っているかもしれません。汗。)


今回は、メモ2つです。
(1)witheventsで思ったこと

(2)implements(スクロールバー依存関係解消)
です。

注:(1)と(2)は関連なしです。

(1)は、忘れないためのただの一言感想。
(2)は、オブジェクト指向で考えた方がいいこと(できればやった方がいいこと)です。

----------------------------------------------------------------
(1)witheventsで思ったこと
・witheventsは、監視係だと思っています。
・クラスで使います。
参考?妄想?ですが、ユーザーフォームでの
Private Sub TextBox9_afterupdate()
などのイベントは、どこか知らないところ(MSFormsライブラリのtextboxクラス?)で、エクセルさんが、勝手にクラスを持ってくれて、
private withevents TextBox9 as TextBox
public sub TextBox9_afterupdate()
End Sub
とかやってくれているのかも(妄想かも。)。(イベントボックスに用意してくれている。)
良く分かりませんが、ユーザーフォームではwitheventsなしで監視できます。
(何も考えたことなかったけど。)

(2)は、オブジェクト指向で考えた方がいいこと(できればやった方がいいこと)です。
ユーザーフォームの「スクロールバー」についてです。
自分がよく使うのは、そこにテキストボックスがあり、スクロールバーとお互いに連動するものです。

①スクロールバーを直接動かす→テキストボックスの値が変動
②テキストボックスに値を直接入力→スクロールバーの値が変動
の2パターンでお互いに連動します。
自分は「手続き型」で作った場合、スクロールバーとテキストボックス間で、値の変更に伴うループになります。
簡単にするには、フラグを設ければいいと思っています。

でも、聞きかじりのオブジェクト指向では、「相互依存」はよくないらしい。
で、chatGPT様にimplementsで何とかできないか訊いてみました。

ここには詳しくは書きませんが、インターフェースを作って、その配下に、スクロールバーとテキストボックスのハンドラーを作る。
他に監視用のcontrollmadicator(仲介者)を設置。(全部クラス。スクロールバーとテキストボックスのハンドラーにはwithevents付き。
controllmadicatorは、witheventsないのはなぜだろう。)
↑controllmadicatorは、実はなくてもいい。chatGPT様によれば、「ControlMediatorを使用することで、初期化とイベント処理のロジックが分離され、コードがよりモジュール化され、可読性とメンテナンス性が向上します。」とのことでした。
よくよく見るとuserform1から外出ししただけ。(だから、controllmadicatorを削除して、内容をuserform1に書き込むこともできる。)
でも、機能の分離や可読性、機能の拡張性を考えたら、外出しした方がいいのかと思った。


とにかくインターフェースで、スクロールバーからでも、テキストボックスからでも、相互に直接依存することなく、並列だが、独立したハンドラーの設置になった。
(実際の動きをトレースすると、witheventsで結局、両方とも動くのだが、implementsしているからいいのか・・・。)
こんなのも分けた方がいいんだね。汗

 


まとめ:というか感想
オブジェクト指向って、いろんな細かな慣習的な規則がいろいろありそうな気がする。というかそういうルールの集まりなのか。
手続き型とは、格段に、やった方がいいルール・作法・解決法があるような気がする。