こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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
以上お力添えお願いいたします。

投稿日時 - 2013-10-15 21:43:37

QNo.8307193

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

こんにちは。

クラスモジュールを別途設けて、イベントの記述を一つに纏める、
ということになりますが、
残念ながら、クラスモジュールでは、_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
' ' =================================

投稿日時 - 2013-10-16 07:13:46

あなたにオススメの質問