Microsoft Access 掲示板

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

9 コメント
views
4 フォロー
Public WithEvents コマンド As CommandButton
Public WithEvents テキスト As TextBox
Private Sub コマンド_Click()
テキスト.Value = IIf(テキスト.Value = "有", "無", "有")
End Sub
Private Sub Form_Load()
Static co As New Collection 'Class1保存用
Dim i As Integer
For i = 1 To 5
co.Add New Class1
Set co(co.Count).テキスト = Controls("テキスト" & i)
Set co(co.Count).コマンド = Controls("コマンド" & i)
Controls("コマンド" & i).OnClick = "[イベント プロシージャ]"
Next
End Sub

作動しますが汎用性を持たせたいのです。

Set co(co.Count).テキスト = Controls("テキスト" & i)
Set co(co.Count).コマンド = Controls("コマンド" & i)

テキストのところに、txtを含んだテキストボックスにイベントを発生させてるというような事はできますか?
例)txtテスト

コマンドボタンなら、cmdを含んだボタンをクリックすると、イベントが発生する
例)例)cmdボタン

ワイルドカードを利用して、色々ためしたのですが、出来ませんでした。

お手数ですが、ご教示をお願いします。

hideki
作成: 2021/09/15 (水) 21:56:46
通報 ...
1
りんご 2021/09/16 (木) 00:34:05 c564b@0e907

 正直、ExcelVBAはよくわかりませんが、ググってみました。 
 これは役に立ちませんか?アレンジすれば、いけるかも?

フォーム上のコントロールすべてをForEachステートメントでチェックし、コントロール名が"txt"で始まるもののみ値を空白に... - Yahoo!知恵袋
フォーム上のコントロールすべてをForEachステートメントでチェックし、コントロール名が"txt"で始まるもののみ値を空白にするカードになります。 "Combo*"も空白にしたいのですがどこに接続すれは良いのでしょうか?ForEachCtrlInMe.ControlsIfCtrl.NameLike"txt*"ThenCtrl.Value=""EndIfNextCtrlEndSub オブジェクト名を使う...
Yahoo!知恵袋

2
りんご 2021/09/16 (木) 00:38:30 c564b@0e907 >> 1

リンクがうまく貼れなかったようなので、飛べないときはググッて下さい。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13236877383

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

5
hideki 2021/09/17 (金) 13:17:57 49c85@96514

りんご様 回答ありがとうございました。
hatena様 いつもご教示ありがとうございます。

私の書き方が悪かったとおもいます。
図のように、コマンド51をクリックすると、テキスト0に、有、無が表示されるようにしたいのです。
テキスト0の名前は、txtテキスト0
コマンド51の名前は、cmdコマンド51です。

 cls.Init Me.Controls("cmd" & Mid(ctl.Name, 4)), ctl

色々試したのですが、作動しません。
できましたら、もう一度、コードのご教示をお願いします。
本当に申し訳ありません。画像1

6
hiroton 2021/09/17 (金) 13:34:07 36d08@f966d >> 5

テキスト0の名前は、txtテキスト0
コマンド51の名前は、cmdコマンド51です。

テキスト0の名前を、txt0
コマンド51の名前を、cmd0
に変更してみましょう

7

hirotonさんも指摘していますし、上の回答でも、下記のように仕様を提示してます。

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

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

もし、コントロールの名前を変更せずにということなら、下記のような仕様でどうでしょうか。
(こちらの仕様の方がコードがシンプルになるし、変更に強いコードになります。)

仕様
コマンドボタンのTagプロパティに関連付けるテキストボックス名を設定しておく。


コマンドボタン名「コマンド51」
テキストボックス名「テキスト0」
の場合、コマンドボタン「コマンド51」のTagプロパティに「テキスト0」と設定する。

クラスモジュール

Option Explicit

Private WithEvents コマンド As CommandButton
Private WithEvents テキスト As TextBox

'初期化メソッド 引数はコマンドボタン コマンドボタンのTagにテキストボックス名を設定しておく
Public Sub Init(objコマンド As CommandButton)
    Set コマンド = objコマンド
    Set テキスト = objコマンド.Parent.Controls(objコマンド.Tag)
    コマンド.OnClick = "[イベント プロシージャ]"
End Sub

Private Sub コマンド_Click()
    テキスト.Value = IIf(Nz(テキスト.Value) = "有", "無", "有")
End Sub

'自身を返すプロパティ
Public Property Get Self() As Variant
    Set Self = Me
End Property

フォームモジュール

Private Sub Form_Load()
    Static co As New Collection    'Class1保存用
    Dim ctl As Control
    For Each ctl In Me.Controls
        If ctl.ControlType = acCommandButton And ctl.Tag <> "" Then
            With New Class1
                .Init ctl
                co.Add .Self
            End With
        End If
    Next
End Sub
8
りんご 2021/09/18 (土) 20:28:33 c564b@0e907

 汎用性を持たせるのは凄い事だけど、貴方にしか保守出来なくなるのではないかと心配です。
>> 5
 AccessVBAで画像を作りたいのであれば、『テキストボックス配置、ボタン配置、クリック時イベント:[イベントプロシージャ]』、ここまでノーコードじゃダメなの?
 画像

9
hideki 2021/09/22 (水) 21:44:21 49c85@96514

hiroton様 回答ありがとうございました。
りんご様 仰る通りですね。ちょっと事情がありまして、質問しました。
hatena様 いつも素晴らしいコードありがとうございます。Tagプロパティは初めて知りました。

返信が遅れて申し訳ありません。
本当にありがとうございました。