Microsoft Access 掲示板

クラスモジュールについて / 3

9 コメント
views
4 フォロー
3
hatena 2021/09/16 (木) 04:30:20 修正

提示のクラスモジュールは、コマンドボタンとテキストボックスを持っています。つまり、コマンドボタンとテキストボックスが関連付けられていることになります。

この関連付けをどのように表現するかを決める必要がありますね。

例えば、
cmdホゲ と txtホゲ というように、先頭3文字でコントロールの種類、後の部分で項目名を表現するというような仕様にするとします。
こうすると下記のようなコードでいけます。

Private Sub Form_Load()
    Static co As New Collection    'Class1保存用
    Dim ctl As Control
    For Each ctl In Me.Controls
        If ctl.Name Like "txt*" Then
            co.Add New Class1
            Set co(co.Count).テキスト = ctl
            Set co(co.Count).コマンド = Me.Controls("cmd" & Mid(ctl.Name, 4))
            ctl.OnClick = "[イベント プロシージャ]"
        End If
    Next
End Sub
通報 ...
  • 4

    質問のコード、実際には動作しませんね。
    動作確認済みのコードかと思って回答コード書きましたが、これでは動きません。

    ctl.OnClick = "[イベント プロシージャ]" とイベントとVBAを関連付けるコードはクラスモジュール内に書かないと動かないです。
    サンプル作成して気が付きました。

    下記は動作確認済みです。

    クラスモジュール Class1

    POption Compare Database
    Option Explicit
    
    Private WithEvents コマンド As CommandButton
    Private WithEvents テキスト As TextBox
    
    `初期化メソッド
    Public Sub Init(objコマンド As CommandButton, objテキスト As TextBox)
        Set コマンド = objコマンド
        Set テキスト = objテキスト
        コマンド.OnClick = "[イベント プロシージャ]"
    End Sub
    
    Public Sub コマンド_Click()
        Debug.Print "クリック"
        テキスト.Value = IIf(Nz(テキスト.Value) = "有", "無", "有")
    End Sub
    

    フォームモジュール

    Private Sub Form_Load()
        Static co As New Collection    'Class1保存用
        Dim ctl As Control
        For Each ctl In Me.Controls
            If Left(ctl.Name, 3) = "txt" Then
                Dim cls As Class1
                Set cls = New Class1
                cls.Init Me.Controls("cmd" & Mid(ctl.Name, 4)), ctl
                co.Add cls
            End If
        Next
    End Sub