- 締切済み
EXCEL VBA フォームコード簡素化
EXCEL VBAのフォームにテキストボックスを複数作成しております。 下記のように複数のテキストボックスで同じ処理を行うのですが コントロール→ループか何かで簡素化できないでしょうか? Private Sub TextBox17_Exit(ByVal Cancel As MSForms.ReturnBoolean) TextBox17.Value = Format(TextBox17.Value, "0.00") End Sub Private Sub TextBox18_Exit(ByVal Cancel As MSForms.ReturnBoolean) TextBox18.Value = Format(TextBox18.Value, "0.00") End Sub Private Sub TextBox19_Exit(ByVal Cancel As MSForms.ReturnBoolean) TextBox19.Value = Format(TextBox19.Value, "0.00") End Sub Private Sub TextBox20_Exit(ByVal Cancel As MSForms.ReturnBoolean) TextBox20.Value = Format(TextBox20.Value, "0.00") End Sub Private Sub TextBox21_Exit(ByVal Cancel As MSForms.ReturnBoolean) TextBox21.Value = Format(TextBox21.Value, "0.00") End Sub Private Sub TextBox22_Exit(ByVal Cancel As MSForms.ReturnBoolean) TextBox22.Value = Format(TextBox22.Value, "0.00") End Sub 以上お力添えお願いいたします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- cj_mover
- ベストアンサー率76% (292/381)
こんにちは。 クラスモジュールを別途設けて、イベントの記述を一つに纏める、 ということになりますが、 残念ながら、クラスモジュールでは、_Exit イベントを扱えません。 どう工夫するか、という話になります。 ”簡素化”というテーマに副う意味では、 疑似的な方法として、_Exit イベントの代りに、 _KeyDown イベントにしてみては如何でしょう。 TextBox に対して、Enter キー または Tab キー が押されたら 処理するように書いてみました。 実際には、マウスの操作で他のコントロールにフォーカスを移動させる こともあるでしょうけれど、これも含めてしまうと、 ”簡素”と呼べるようなものにはなりません。 ひとまず、試してみて、仕様について再検討してみてください。 マウスの操作をトラップするアイディアはあります。、 ユーザーフォームすべてのコントロール(今回対象になっているTextBox以外すべて) について、_MouseDown イベント から、 現在フォーカスのあるコントロールのタブインデックス(等)を常に監視することで、 他のコントロールにフォーカスが移ったことをチェックする、 というようなことです。 一部、_MouseDown イベントが用意されていないコントロールもありますし、 どの種類のコントロールがあるか、把握しないと何とも言えないです。 ユーザーフォームには、TextBoxしかない、っていう条件なら、 比較的簡単に書ける気はします。 同じ処理をするイベントプロシージャの列車を作らない、という点に絞って考えるなら、 ”簡素化”という方向は見いだせると思います。 妥協点をどこら辺に設定するか、といったところになると思います。 以下、サンプルです。 ユーザーフォームモジュールに現に書かれた各種イベントプロシージャがある筈ですから、 イベントの重複や二次的な呼び出しなどには注意して下さい。 試すなら、今あるモジュール全体を一旦コメントブロックしてからの方がいいかも知れません。 17 To 22 という記述が2カ所、TextBox#の数字範囲を指しています。書き換え可。 クラスモジュールはVBEのメニューバー[挿入]→[クラスモジュール]を選びます。 ユーザーフォーム読み込み時に、クラスモジュールが機能するよう設定します。 ' ' UserForm モジュール ' 8307193 Excel2010で動作確認 ' ' ================================= Option Explicit Private clsTextBoxes() As Class1 Private Sub UserForm_Initialize() Dim i As Long ReDim clsTextBoxes(17 To 22) For i = 17 To 22 Set clsTextBoxes(i) = New Class1 clsTextBoxes(i).SetTBX Controls("TextBox" & i) Next i End Sub ' ' ================================= ' ' Class1 モジュール ' 8307193 ' ' ================================= Option Explicit Private WithEvents myTextBox As MSForms.TextBox Sub SetTBX(ByVal tbx As MSForms.TextBox) Set myTextBox = tbx End Sub ' ' ●ココ↓が一括されたイベントプロシージャ● Private Sub myTextBox_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = vbKeyReturn Or KeyCode = vbKeyTab Then myTextBox.Value = Format(myTextBox.Value, "0.00") End Sub ' ' =================================