【VBA中級】UserFormカーソルSetは、共通Moduleでソース記述を減らそう

【VBA中級】UserFormカーソルSetは、フィールド毎に書いてはソース記述が増えるだけ


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実務の効率化において、ご参考お役立てになれば幸いです。


全国対応!お気軽にお問い合わせください