テキストボックス等でのフォーカス移動
                                                         玄関へお回り下さい。
Enterキーの入力でフォーカスを次に移動     (045) (046)
      1.SendKeys ステートメントを使ったやり方
Private Sub Text1_KeyPress(KeyAscii As Integer)
  If KeyAscii = vbKeyReturn Then
  'SendKeys ステートメントを使ったやり方
    KeyAscii = 0
    SendKeys "{TAB}"
  End If
End Sub


2.SetFocusを使ったやり方
Private Sub Text1_KeyPress(KeyAscii As Integer)
  If KeyAscii = vbKeyReturn Then
  'SetFocusを使ったやり方
    KeyAscii = 0
    Text2.SetFocus
  End If
End Sub


  配列の場合
Private Sub Text5_KeyPress(Index As Integer, KeyAscii As Integer)
'配列の場合
  If KeyAscii = vbKeyReturn Then
    KeyAscii = 0   '音をならさない
    '配列の数でMaxを設定し一番最初に移動する
    If Index = 2 Then Index = -1
    Text5(Index + 1).SetFocus
  End If
End Sub


3.コントロールの配列変数を使ったやり方(MS技術情報より)

'宣言セクションに
'コントロールの配列の場合の設定
Private Const logCtrNum = 5
Private ctrl(logCtrNum - 1) As Control
Private SetCtr       As Long

Private Sub Form_Load()
'コントロールの配列の場合の設定
  '移動させたい順に配列を確保
  Set ctrl(0) = Text1
  Set ctrl(1) = Text2
  Set ctrl(2) = Text3
  Set ctrl(3) = Text4
  Set ctrl(4) = Command1
End Sub


Private Sub Text1_KeyPress(KeyAscii As Integer)
  If KeyAscii = vbKeyReturn Then
  'コントロールの配列の場合の設定
    KeyAscii = 0
    SbSetFocus
  End If
End Sub


Private Sub SbSetFocus()
'コントロールの配列の場合の設定
  SetCtr = SetCtr + 1
  If SetCtr = logCtrNum Then
    SetCtr = 0
  End If
  ctrl(SetCtr).SetFocus
End Sub


Private Sub Command1_Click()
  SbSetFocus
End Sub


4.私の考えたやり方   (046)
'宣言セクション等に
Option Explicit   'SampleNo=046 WindowsXP VB6.0(SP5) 2002.05.10
Dim logActv As Long


Private Sub
sbActCtlTab()
  'アクティブコントロールのタブインデックスを取得
  '適時必要なコントロールを追加して下さい
  Select Case TypeOf Screen.ActiveControl Is Object
    'テキストボックスがアクティブ
    Case TypeOf Screen.ActiveControl Is TextBox
      logActv = Screen.ActiveControl.TabIndex
    'コマンドボタンがアクティブ
    Case TypeOf Screen.ActiveControl Is CommandButton
      logActv = Screen.ActiveControl.TabIndex
    Case Else
    'その他のコントロールがアクティブ
      logActv = 0
  End Select
  Select Case logActv
    Case 0
      Text2.SetFocus
    Case 1
      Text3.SetFocus
    Case 2
      Command1.SetFocus
    Case 3
      Text1.SetFocus
  End Select
End Sub


Private Sub List1_KeyPress(KeyAscii As Integer)
  sbActCtlTab
End Sub


Private Sub Text1_KeyPress(KeyAscii As Integer)
  If KeyAscii = vbKeyReturn Then
    KeyAscii = 0
    sbActCtlTab
  End If
End Sub


Private Sub Command1_Click()
  sbActCtlTab
End Sub


Private Sub Text2_KeyPress(KeyAscii As Integer)
  If KeyAscii = vbKeyReturn Then
    KeyAscii = 0
    sbActCtlTab
  End If
End Sub


Private Sub Text3_KeyPress(KeyAscii As Integer)
  If KeyAscii = vbKeyReturn Then
    KeyAscii = 0
    sbActCtlTab
  End If
End Sub


5.最近(流行?)のやり方
’テキストボックス等のコントロールに

Private Sub Text1_KeyPress(KeyAscii As Integer)
  If KeyAscii = vbKeyReturn Then
  'Enabled = False を利用した方法
    KeyAscii = 0
    'イベントが認識しない為にフォーカスが移動(移らない)
    Text1.Enabled = False
    'その後元に戻す
    Text1.Enabled = True
  End If
End Sub


おすすめ
別途
 APIを使ってEnterキーや↓の入力でフォーカス移動

1番のやり方は、簡単だが応答速度が鈍く、使用しているOSやIMEの種類等によって正常に動作しないこともあるので注意が必要。(MS技術情報より)、又機種によりNum Lock が ON、OFFする

2番の方法は各コントロールに個別に記述しなければならず、又処理が多い分、キーに対する応答性が低下する(MS技術情報より)

3番のやり方は上記の問題点をクリアしているが、マウス等でコントロール間を移動すると、次の移動先が前のコントロールの次に移動する

4番のやり方は3番の問題点を解決しているが、その他については未確認です、又、移動順序をタブインデックスで設定しておいて下さい。

1〜2番のやり方はコントロールが少なく、動作に問題がない場合に使用するようにして下さい

3番のやり方はMSのサポート技術情報にでていたやり方です。いずれにしても、Enter キーによるフォーカスの移動は、Windows の統一された操作感を損ねるものです。使用する場合には、慎重な検討を行わなければなりません。といった技術情報がMSのHPの方に出ています。

  http://support.microsoft.com/default.aspx?scid=kb;ja;407536

↑↓キーでフォーカスを移動する          (045)
   ↓キーを押すことでフォーカスを次に移動し↑で戻る

使用例

Private Sub Text3_KeyDown(KeyCode As Integer, Shift As Integer)
  Select Case KeyCode
    Case vbKeyUp
      Text2.SetFocus '↑での処理
      'SendKeys "+{TAB}"  '又は
    Case vbKeyDown
      Text4.SetFocus '↓での処理
      'SendKeys "{TAB}"  '又は
  End Select
End Sub




2002/05/10