[[20220108090744]] 『ユーザーフォーム内の複数のchangeイベント』(ななし) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ユーザーフォーム内の複数のchangeイベント』(ななし)

Private Sub TextBox1_Change()
TextBox1.Value = Format(TextBox1.Value, "###,###")
End Sub

上の内容をユーザーフォーム内のTextBox1からTextBox30まで行いたいのですが
コードが長くなってしまうので省略する方法を教えてください

< 使用 Excel:Excel2013、使用 OS:Windows10 >


changeイベント クラスモジュール
で検索すれば関連記事があると思います。
(γ) 2022/01/08(土) 10:04

  (1)
 == class1 クラスモジュール ============  
 Public WithEvents tb As MSForms.TextBox

 Private Sub tb_Change()
     Me.tb.Value = Format(Me.tb.Value, "###,###")
 End Sub

 == UserForm1 モジュール =========
 Option Explicit

 Dim clsTxtEvent() As Class1

 Private Sub UserForm_Initialize()
     Dim i As Long
     ReDim clsTxtEvent(1 To 30)
     For i = 1 To 30
         Set clsTxtEvent(i) = New Class1
         Set clsTxtEvent(i).tb = Me.Controls("TextBox" & i)
     Next
 End Sub
 というものを書けば、一応動作します。
 (校内を全文検索してマッチした
[[20210127132207]]を参考にさせていただきました。)

 (2)
 しかし、Changeイベントだと、一文字入力するごとに感応するので、
 入力しにくいと思われます。
 こうした場合は、Exitイベント(そのテキストボックスから抜けるとき)を
 使うのがよいわけですが、
 残念ながら、クラス方式ではExitイベントを捕捉できない仕様のようです。
 感知できません。

 (3)
 したがって、多少手間でも遠回りでも、30個のコードを増殖させるのが現実的かと思います。
 ワークシート上に
 Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
     TextBox1.Value = Format(TextBox1.Value, "###,###")
 End Sub
 と書き、これを下にフィルコピーすれば、
 2か所のTextBoxの数値は自動でカウントアップしてくれるので、
 代入の左辺だけ、手作業でなおせば、OKです。(もっと気の利いた方法があるかも)

 参考にしてください。
(γ) 2022/01/08(土) 15:24

 クラス方式ではExitイベントを捕捉できないので
 KeyDownイベントを使ってみては如何でしょうか
 入力後Enterキーで実行します。

 == class1 クラスモジュール ============  
 Public WithEvents tb As MSForms.TextBox
 Private Sub tb_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = vbKeyReturn Then
        Me.tb.Value = Format(Me.tb.Value, "###,###")
    End If
 End Sub

(ピンク) 2022/01/08(土) 19:13


 なるほど。
 Key_Downは捕捉できるんですね。
 ありがとうございます。

 ちなみに、日和見案のコード増幅方法ですが、
 Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
     Call modify(TextBox1)
 End Sub
 のように変換処理を別のプロシージャにdelegateすれば、
 下にフィルコピーすることで、簡単に増幅ができますね。(気が利いているかどうか?ですが)
(γ) 2022/01/08(土) 19:27

〉クラス方式ではExitイベントを捕捉できない
API で可能です
http://addinbox.sakura.ne.jp/Bpca_Common.htm#C2CP

汎用クラス(clsBPCA)を使えば更に楽
http://addinbox.sakura.ne.jp/Bpca_Common.htm

(AddinBox_角田) 2022/01/08(土) 21:17


どうもありがとうございます。
皆さん、参照くださいまし。
(γ) 2022/01/08(土) 22:44

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.