UserForm入力チェックでエラーの場合、当該フィールドにカーソルSetするための記述。
フィールド数が増えた際に、個々のプロシージャで行うと膨大なソース量になってしまいます。
みなさん、こんにちは。セルネッツ竹本です。
今回は、「共通ModuleでカーソルSetのソース記述量を減らそう」をテーマに、解説をしたいと思います。
◆[Enter]キー押下で入力ミスが検知されたときのアクション
UserFormによっては、多くの入力フィールドがある場合もあります。
顧客管理や販売管理など、複数画面も普通にあります。
入力ミスが検知されたときの期待アクションは、以下のとおり。
1.当該フィールドにカーソルが止まり
2.原因と対策が警告メッセージ表示され
3.すぐさま訂正できる状態となる
ですが、上記1.をフィールドごとにプログラムでSetFocus記述すると、膨大な量になってしまいます。
‘※※※※※※※※※※※※※※※※※※※※
Sub カーソルSET_txt入力元B()
‘※※※※※※※※※※※※※※※※※※※※
With txt入力元B
.SelStart = 0
.SelLength = Len(txt入力元B)
.SetFocus
End With
End Sub
上記のような記述では、特定フィールド専用となってしまいます・・・。
◆入力フィールドへのカーソルSetは、「共通Module」に書く
フィールド数が増えても、そのフィールド名で個数分の記述をみかけることがあります。
「カーソルが止まれば良い」は正解ですが、これでは膨大なソース記述で溢れかえってしまいます。
こんなときは、以下のように共通Moduleを書きましょう。
【Point】以下はコンボボックスから値が選択され、[Enter]キー押下の瞬間です。
‘◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
Private Sub cmb1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
‘◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
‘[Enter]キー押下なら次へ or If KeyCode = 13
If KeyCode = vbKeyReturn Then Call M_カーソルSET共通処理(“txt入力元B“)
End Sub
以下が共通Moduleです。
「フィールド名」を渡すだけで、合致フィールドをUserForm上から探しあて、その場所に、カーソルが配置されます。
【Point】
For Each S_Obj In Controls は、Form上の全フィールドを一瞬で精査します。
これは可変設計ですので、1Moduleで全てのTxtフィールドを網羅できます。
‘◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
Sub M_カーソルSET共通処理(P_Obj名)
‘◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
Dim S_Obj As Object
For Each S_Obj In Controls
If S_Obj.Name = P_Obj名 Then ‘名前の一致するフィールドを探す
S_Obj.SelStart = 0 ‘ 選択する開始位置
S_Obj.SelLength = Len(ActiveControl.Value) ‘文字数分を選択する
S_Obj.SetFocus: Exit For ‘カーソルSetしたらLoopから抜け出す
End If
Next S_Obj
End Sub
◆大量ソースにしないスキルを磨こう
UserFormも他のModuleも同じ。記述は少なくシンプルに。
「ダイエット」記述は、技術力の指標にもなりますので、スキルを磨いて行きましょう。
今回のテーマは、「共通ModuleでカーソルSetのソース記述量を減らそう」について、解説を行いました。
本記事が、Excel実務の効率化において、ご参考お役立てになれば幸いです。