tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルエンターKeyでFocus移動
記事No14253
投稿日: 2009/11/13(Fri) 07:49
投稿者ケイ
いつも楽しく拝見させています。
時折、質問させて頂いてるケイと申します。環境:WInXP(SP2)

本日はExcel2003_VBAにおいてですが、ここでいいのでしょうか?
もし、まずければ、お手数お掛けしますが削除してください。

【準備】
UserFormに
・TextBox1 (TabIndex:0,TabStop:True)
・TextBox2 (TabIndex:1,TabStop:True)
・CommandButton1 (TabIndex:2,TabStop:True)
・Label1 (TabIndex:3,TabStop:False)
4つのコントロールを配置します。


【質問】
下記のコードで[CommandButton1]を押すと、Label1にTextBox1の内容を表示後、
正常にTextBox1へフォーカスセットされるのですが、
TextBox1にフォーカスがある時にエンター(vbKeyReturn)を押してLabel1に
TextBox1の内容を表示させた場合、TextBox2にフォーカスがセットされてしまいます。
(TabStopがTrueの次のTabIndexのコントロールにフォーカス移動してしまいます。)

これはエンターKeyを押すことによる当然の動きなのでしょうか?
エンター(vbKeyReturn)を押し、処理後TextBox1へフォーカスセットする方法を
ご教授お願い致します。
(尚、
・[Tab]キー押下による全コントロールのフォーカス移動は必須(Label1除く)
・現在時刻をTextBox1に入れているのは、いちいち先生方に違う文言を入れる手間を
 省いて頂く為で、実際には時刻を入れるプログラムではありません。)

            記

Option Explicit
'---------------------------------------------------------------
Private Sub UserForm_Activate()
    Me.TextBox1.Text = Now
    Me.TextBox1.SetFocus
End Sub
'---------------------------------------------------------------
Private Sub CommandButton1_Click()
    Me.Label1.Caption = Me.TextBox1.Text
    Me.TextBox1.Text = Now
    Me.TextBox1.SetFocus
End Sub
'---------------------------------------------------------------
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, _
                             ByVal Shift As Integer)
    If KeyCode = vbKeyReturn Then
        Call CommandButton1_Click
    End If
End Sub
'---------------------------------------------------------------


★ちなみにVB6(SP5)では、少し勝手が違いますが上の様なことはないです〜
参考までに・・・・
Option Explicit
'---------------------------------------------------------------
Private Sub Command1_Click()
    Me.Label1.Caption = Me.Text1.Text
    Me.Text1.Text = Now
    Me.Text1.SelStart = Len(Me.Text1.Text)
    Me.Text1.SetFocus
End Sub
'---------------------------------------------------------------
Private Sub Form_Load()
    Me.Text1.Text = Now
End Sub
'---------------------------------------------------------------
Private Sub Form_Resize()
    Me.Text1.SetFocus
End Sub
'---------------------------------------------------------------
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = vbKeyReturn Then
        Call Command1_Click
    End If
End Sub
'---------------------------------------------------------------

以上、どうぞ宜しくお願い致します。

[ツリー表示へ]
タイトルRe: エンターKeyでFocus移動
記事No14254
投稿日: 2009/11/13(Fri) 08:35
投稿者花ちゃん
> '---------------------------------------------------------------
> Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, _
>                              ByVal Shift As Integer)
>     If KeyCode = vbKeyReturn Then
>         Call CommandButton1_Click
>     End If
> End Sub

多分、Return キーを押した事になっているので、エクセルのオプションの設定で
設定されている方向に移動しているのではないでしょうか?
(VB6.0 の場合は、テキストボックス上でReturn キーを押しても移動しない)

試しては、いませんが下記のように変更して見たらどうでしょうか?
(Return キーをキャンセルする)
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  If KeyAscii = vbKeyReturn Then
    KeyAscii = 0
        Call CommandButton1_Click
    End If
End Sub


因みに通常は、VB6.0 の場合でも、KeyDown イベントでは処理せず、KeyPress イベントを
使用します。(移動しない代わりにBeep 音が鳴りませんか。)

[ツリー表示へ]
タイトルRe^2: エンターKeyでFocus移動
記事No14255
投稿日: 2009/11/13(Fri) 09:10
投稿者ケイ
花ちゃんさん、お返事ありがとうございます。
いつも本サイトを拝見し勉強させていただいています。
よいサイトの運営お疲れ様です。ありがとうございます。

早速、試させて頂きましたが、残念ながら、エンターKeyでは
TextBox1_KeyPressイベントが発生しませんでした。

投稿した後も試行錯誤し、下のコードで、このサンプルでは問題解決しました。
しかし、要点を掻い摘んでこのサンプルを作ったつもりだったのですが、
実際のプログラムに改善コードをコーディングしても肝心な実際プログラムでは
問題解決しませんでした。
もう一度、サンプルの見直しを行うつもりです。

取り急ぎ、サンプルでは解決したことをお知らせしておきます。

Option Explicit
'↓宣言追加
Private unLostFocus As Boolean
'---------------------------------------------------------------
'↓プロシージャー追加
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Cancel = unLostFocus
    unLostFocus = False
End Sub
'---------------------------------------------------------------
'↓プロシージャー変更
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, _
                             ByVal Shift As Integer)
    If KeyCode = vbKeyReturn Then
        Call CommandButton1_Click
        unLostFocus = True     '←追加
    End If
End Sub
'---------------------------------------------------------------
その他のコードは投稿時と同じです。

[ツリー表示へ]
タイトルRe^3: エンターKeyでFocus移動
記事No14256
投稿日: 2009/11/13(Fri) 09:52
投稿者花ちゃん
> 早速、試させて頂きましたが、残念ながら、エンターKeyでは
> TextBox1_KeyPressイベントが発生しませんでした。

失礼しました。VBA では動作が違うようですね。
(ヘルプの記載も間違っているようですね。)

下記のように、KeyCode = 0 を追加して Return キーを無効にして見て下さい。
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, _
                             ByVal Shift As Integer)
    If KeyCode = vbKeyReturn Then
        KeyCode = 0                 '追加
        Call CommandButton1_Click
    
    End If
End Sub


ヘルプより抜粋

KeyPress イベントは、次のいずれかのキーを押すと発生します。
印刷可能キーボード文字
標準のアルファベット キーと Ctrl キーの組み合わせ
特殊文字キーと Ctrl キーの組み合わせ
Enter キー
BackSpace キー

KeyPress イベントは、次のいずれかの条件では発生しません。
Tab キーを押したとき
Enter キーを押したとき
方向キーを押したとき
コントロール間でフォーカスの移動を引き起こすキーを押したとき

[ツリー表示へ]
タイトル【解決】Re^4: エンターKeyでFocus移動
記事No14260
投稿日: 2009/11/13(Fri) 12:59
投稿者ケイ
花ちゃんさん、検証ありがとうございました。
「苦戦していた昨日1日が何だったんだろう」って思う感じの
1行追加で解決!!
やっぱり、このサイトはスゴイです。花ちゃんさんサイコーです。
大変でしょうけど、いつまでも楽しいサイトの運営をお願いします。
この度はVBAについての質問をして申し訳ございませんでした。

> 下記のように、KeyCode = 0 を追加して Return キーを無効にして見て下さい。
>     If KeyCode = vbKeyReturn Then
>         KeyCode = 0                 '追加
>         Call CommandButton1_Click
>     End If

[ツリー表示へ]