#617 更新前処理キャンセル時にテキスト全体を範囲選択するには? フォーム、VBA

テキストボックスのデータの更新時にその内容をチェックし、もし指定条件に反する場合に更新させないようにするには、「BeforeUpdate/更新前処理」イベントプロシージャを利用します。

このイベントプロシージャ内で入力データをチェックし、もし更新をキャンセルしたい場合には、イベントプロシージャの引数である「Cancel」に”True”を代入することで、Enterキーなどを押しても次のコントロールにフォーカスが移動しないようにすることができます。

その一例が次のようなコードです。ここではテキストボックス「テキスト0」の値が数値かどうかを「IsNumeric」関数でチェックし、数値でないときは警告メッセージを表示し、更新をキャンセルしています。

Private Sub テキスト0_BeforeUpdate(Cancel As Integer)

  If Not IsNumeric(Me!テキスト0) Then
    Beep
    MsgBox "数値を入力してください!", vbOKOnly + vbExclamation
    Cancel = True
  End If

End Sub


上記の処理においては、その特性として「Cancel = True」でプロシージャを抜けたあと、テキストボックス内のカーソルは末尾など特定の位置にくるようになっています。そのため、1文字ずつ修正する場合はよいのですが、先頭からあらためて再入力したいような場合には、カーソルを移動させるなどのユーザー操作が必要となります。





そこで、次のようにプログラムを変更することで、キャンセル時にテキスト全体を範囲選択した状態にすることができます。それによってDELETEキーでまとめて全文字を削除したり、1文字目から再入力することができるようになります(全体が範囲選択された状態で1文字キーインするとそれまでの入力値がクリアされその1文字だけ入力された状態になります)。

Private Sub テキスト0_BeforeUpdate(Cancel As Integer)

  If Not IsNumeric(Me!テキスト0) Then
    Beep
    MsgBox "数値を入力してください!", vbOKOnly + vbExclamation
    With Me!テキスト0
      .SelStart = 0
      .SelLength = Len(.Value)
    End With
    Cancel = True
  End If

End Sub


なおここでは、テキストボックスの「SelStart」プロパティに「0」を代入することによってカーソル位置を先頭にしています。また「SelLength」プロパティにその入力文字数を指定することによって入力値分の長さ全体を範囲選択するようにしています。

実行結果:
| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved