[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ユーザーフォーム内の複数のchangeイベント』(ななし)
Private Sub TextBox1_Change()
TextBox1.Value = Format(TextBox1.Value, "###,###")
End Sub
上の内容をユーザーフォーム内のTextBox1からTextBox30まで行いたいのですが
コードが長くなってしまうので省略する方法を教えてください
< 使用 Excel:Excel2013、使用 OS:Windows10 >
(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
汎用クラス(clsBPCA)を使えば更に楽
http://addinbox.sakura.ne.jp/Bpca_Common.htm
(AddinBox_角田) 2022/01/08(土) 21:17
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.