#646 Enterキーでの次のタブ移動順を動的に変えるには? フォーム、VBA

Accessのフォームでは、コントロールの『タブストップ』プロパティを”いいえ”に設定することで、EnterキーやTabキーを押していったときにそのコントロールにフォーカス移動しないようにする(=スキップさせる)ことができます。

画面例:

このフォームでは、左半分にある4つのテキストボックスにはタブストップ”はい”、右半分の4つにはタブストップ”いいえ”を設定してあります。

もしすべてのコントロールがタブストップ”はい”であれば、EnterキーやTabキーを押したとき上図の@ → Gの順番でフォーカスが移動します。
しかし右半分のコントロールがタブストップ”いいえ”となっていますので、@ → Cを移動したあと、次は@に移動します。

■「表示価格」でEnterキーを押したとき(C → @の順でフォーカスが移動します)





一方、そのような設定をしても、それぞれのコントロールの「タブ移動順」プロパティの大小である「タブオーダー」は活きています。
そのため、マウスを使ってそこにフォーカス移動したあとにEnterキーやTabキーを押すと、必ず次のタブストップ”はい”のコントロールに移動します。

■「目標点」でEnterキーを押したとき(E → @の順でフォーカスが移動します)





このようなインタフェースにおいて、もし『タブストップ”いいえ”のコントロールからタブストップ”いいえ”のコントロールへ』移動させたいようなとき、たとえば上図で「発注点」にマウスでフォーカスを置いたあと、EnterキーやTabキーでD → E → F → Gのように移動させたいとき、それらのコントロールのイベントプロシージャで対応させることができます。
プログラムを使うため、タブオーダーを設定するダイアログのように簡単な操作では移動順を指定できませんが、タブストップが”いいえ”のコントロールも含めてタブ移動順を制御することができます。

それには、タブストップ”いいえ”のコントロールごとに次のようなイベントプロシージャを追加します。

Private Sub 発注点_KeyDown(KeyCode As Integer, Shift As Integer)

  If KeyCode = vbKeyReturn Or KeyCode = vbKeyTab Then
    Me!目標点.SetFocus
  End If

End Sub

Private Sub 目標点_KeyDown(KeyCode As Integer, Shift As Integer)

  If KeyCode = vbKeyReturn Or KeyCode = vbKeyTab Then
    Me!梱包単位.SetFocus
  End If

End Sub

Private Sub 梱包単位_KeyDown(KeyCode As Integer, Shift As Integer)

  If KeyCode = vbKeyReturn Or KeyCode = vbKeyTab Then
    Me!生産中止.SetFocus
  End If

End Sub

Private Sub 生産中止_KeyDown(KeyCode As Integer, Shift As Integer)

  If KeyCode = vbKeyReturn Or KeyCode = vbKeyTab Then
    Me!発注点.SetFocus
  End If

End Sub


ここでは「引数 KeyCode が vbKeyReturn または vbKeyTab であるとき」、すなわちそのコントロール上でEnterもしくはTabキーが押されたとき、それぞれの指定のコントロールにフォーカス移動します。

実行例:





「生産中止」では「商品コード」にフォーカスを戻すこともできますが、ここでは「発注点」に移動させています。それによって「タブ移動するグループ」と「タブ移動しないグループ」の2つのグループ内それぞれでサイクリックにフォーカス移動することになります。


※なお、より厳密な動作を考慮すると、CtrlやShiftなどの特殊キーが同時に押されていた場合、入力規則違反などでそこからフォーカスを他に移動できないなどのケースも考慮する必要があります。上記のIf文で書かれた部分はもっと複雑な条件分岐が必要となります。
| Index | Prev | Next |



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