HOME > 即効テクニック > AccessVBA > ユーザーインターフェース > フィールドがアクティブな時インナーカーソルにする方法

即効テクニック

ユーザーインターフェース

フィールドがアクティブな時インナーカーソルにする方法

(Access 97)
● 概要 ●
テーブルやフォームのフィールド(コントロール)にフォーカスが移った際、デフォルトではデータ全体が選択されています。その時データの最後にインナーカーソル(キャレット)を表示する方法を説明します。


● 方法 ●
(1) データベース全体の設定を行う
    Access2000ではフォーカスにカーソルが移動した際の動作を、データベース全体にわたって設定することが出来ます。
    メニューバーの[ツール]−[オプション]を開き[キーボード]タブを開きます。
    その中の[フィールド移動時の動作]というオプショングループの値を [フィールドの最後に移動]にすれば、フィールドの移動時に自動的にデータの最後の部分にカーソルが入ります。

(2) コードをコントロールのEnter/フォーカス取得時イベントに記述するこの方法のメリットは特定のコントロールを選択して処理できる点です。
    逆にテーブルやクエリのデータシートビューではコードを記述できないため、この方法でカーソルをデータの最後に移動することは出来ません。


● サンプルコード ●
(2)-1 SendKeysステートメントの使用
Private Sub テキスト1_Enter()
    SendKeys "{F2}"
End Sub

(2)-2 SelStart、SelLengthプロパティの使用
Private Sub テキスト1_Enter()
    Me.テキスト1.SelStart = Me.テキスト1.SelLength
    'Me.テキスト1.SelStart = 255 でも良い
End Sub


● 動作確認 ●
新規フォームを作成し、テキストボックスを2つ作成します(それぞれ[テキスト1] [テキスト2])。そして、テキスト2のEnter/フォーカス取得時イベントに上記のコードを記述します。
フォームビューに変更し、テキストボックスに適当な値を入力して何度かフォーカスを移動させて見ます。
テキスト1では特に処理を行っていないので入力されたテキスト全体が選択されますが、テキスト2では入力した値の最後の部分にカーソルが移動していることを確認して下さい。


● 詳細 ●
サンプルコード(2)-1ではSendKeysステートメントを使用しています。これはフォーカスを取得したコントロール上で[F2]キーを押下すると、カーソルがデータの最後の部分に来ることを利用しています。 
非常に簡単な方法ですが、Access97の場合SecdKeysステートメントによってNumLockが解除されてしまうバグがありますので、この方法は使わないほうが良いでしょう。

 (2)-2の方ではSelStart、SelLengthというプロパティを使用しています。
SelStartプロパティはテキストボックス(コンボボックス)に入力されている値の、どの部分にカーソルがあるかということを示します。
SelLengthプロパティは、テキストボックス(コンボボックス)に入力されている値の内、選択されている文字数を示します。

ですから、サンプルではテキストボックス内の文字数をSelLengthプロパティによって取得し、そのままSelStartプロパティに代入しています。
パッと考えると最後から2番目の文字の部分にカーソルが来そうなものですが、SelStartプロパティは0から始まる(テキストエリアの先頭が0)なので、そのまま代入できるのです。
つまり、SelStartプロパティに0を代入することによって、常にテキストエリアの先頭にカーソルを持ってくることも出来ます。

また、SelStartプロパティにテキストエリアに入力されている文字数よりも大きな数を設定した場合、自動的に最後尾にカーソルが入ります。
これを利用して、テキストボックスやコンボボックスの入力最大数である255をSelLengthプロパティに代入しても同じ挙動を示します。