重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

VBA チェックボックスをオーバーラップしたインスタンスのCaptionを出力したい



VBAの初心者で、勉強しています。最近ようやくクラスの定義方法が分かってきました、が深くは分かっていません。

次のようにクラスモジュール MyClass を作成しました。

------------------------- クラスモジュール MyClass --------------------------
Option Explicit

Private WithEvents myChkBox As MSForms.CheckBox

Public Sub SetCtrl(new_ctrl As MSForms.CheckBox)
Set myChkBox = new_ctrl
End Sub

Private Sub myChkBox_Click()
 ' クリックされたときの処理
End Sub
-------------------------------------------------------------------------------


次に、チェックボックスが配置されたUserFormのコードに

Set myCol = New Collection

Dim c As Control
Dim o As Variant

For Each c In Me.Controls
If TypeName(c) = "ChckBox" Then
Set o = New MyClass_ChkBox
Call o.SetCtrl(c)
myCol.Add o
Set o = Nothing ★今回の質問とは関係ありませんが、このNothingは必要ですか?
End If
Next

として、チェックボックスを先ほど定義したクラスでオーバーラップ(?)し、
コレクション myCol に格納しました。ここで myCol の内容を確認するために

For i = 1 To myCol.Count
Debug.Print TypeName(myCol.Item(i))
Next

とすると、TypeName は期待どおりに出力されました。
このとき、
    Debug.Print myCol.Item(i).Caption
のようにして、キャプションをDebug出力したいのですが、エラーになってしまいます。

標準のチェックボックスには Caption というプロパティがあるかと思いますが、
オーバーラップすると、Caption は引き継がれないのでしょうか。


上手く質問内容を説明できているか分かりませんが、詳しい方がいましたら是非教えてください。

A 回答 (2件)

自作クラス(MyClass)に以下を追加するとか。


property get Caption() as String
Caption = myChkBox.Caption
end property
    • good
    • 0
この回答へのお礼

回答ありがとうございます!

教えていただいたとおりに、ゲッターを記述したら、期待どおりにCaptionを表示することができました。Captionは継承されるけど、ゲッターを記述しないと取り出せないのですね。まだ、違和感があります(ゲッターを必要としなくてよいのではとも感じる???)が、実装ができてよかったです。

お礼日時:2025/04/15 22:33

>Captionは継承されるけど、ゲッターを記述しないと取り出せないのですね。


そもそもVBAのクラスには、継承という差分プログラミング機能が無いという。

色々面倒なら、保持しているCheckBoxインスタンスをそのままパブリック扱いにするという手も。
    • good
    • 0
この回答へのお礼

継承が無いのですか!…意外です。

>色々面倒なら、保持しているCheckBoxインスタンスをそのままパブリック扱いにするという手も。

このことについて、お時間ありましたら詳しく教えてください。


※教えて!gooが終了というニュースを知り困惑しています。AIにはできない便利な財産だと思うので。。。

お礼日時:2025/04/17 02:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A