none
モーダルなフォームを閉じた直後のフォーカス設定について RRS feed

  • 質問

  • 以下のように、モーダルなフォームを閉じた後にSetFocusを実行しても
    フォーカスをセットできません。どのようにすれ改善できるのでしょうか。

    '-------------------------------------------------------------------

                           

    '   フォームAのKeyDownイベント
    '-------------------------------------------------------------------
    Private Sub txtTest_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

        Dim frmB As formB

        'ctrl+Space
        If (Shift = 2) And (KeyCode = vbKeySpace) Then

            Set frmB = New formB
            Call frmB.Show(1)
            Set frmB = Nothing

            Call Me.txtTest.SetFocus 'フォーカスをセットできない
        End If

    End Sub 

    ■補足

    ・Excel2010です。

    ・ユーザーフォームAはモードレスです。


    • 編集済み raito sato 2015年3月5日 7:43 補足
    2015年3月5日 5:57

回答

  • たしかにformAがモードレスだと現象が発生しますね。

    少し調べた感じだと以下のような感じでみなさん無理やり回避しているようです。

    Private Sub txtTest_KeyDown(ByVal keyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        Dim frmB As formB
        If (Shift = 2) And (keyCode = vbKeySpace) Then
            Set frmB = New formB
            Call frmB.Show(1)
            Set frmB = Nothing
            Call Me.CommandButton1.SetFocus '★適当なコントロールに先にSetFocusしとく
            Call Me.txtTest.SetFocus
        End If
    End Sub
    http://www.h3.dion.ne.jp/~sakatsu/Excel_Tips07.htm

    ※もうちょっとスマートな方法はないのだろうか。

    2015年3月5日 9:34
    モデレータ

すべての返信

  • こんにちは。

    こちらはVBAフォーラムですが、環境を記載してください。
    ちなみにExcel2010で確認してみましたが問題なくフォーカスセットされました。
    2015年3月5日 6:32
    モデレータ
  • こんにちは。

    Excel2010です。

    2015年3月5日 7:27
  • ということは他の条件に依存するのでしょうかね。

    ちなみに私はWindows7 SP1 32bitで確認しました。
    Office Professional Plus 2010です。

    また、txtTestテキストボックスにはKeyDown以外のイベントも実装されていますか?
    2015年3月5日 8:06
    モデレータ
  • KeyDown以外のイベントは実装していません。


    なお、フォームA(frmBの呼び出し側)がモーダルの場合はフォーカスをセットできます。

    モードレスの場合はフォーカスがセットできない状況です。

    2015年3月5日 9:10
  • たしかにformAがモードレスだと現象が発生しますね。

    少し調べた感じだと以下のような感じでみなさん無理やり回避しているようです。

    Private Sub txtTest_KeyDown(ByVal keyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        Dim frmB As formB
        If (Shift = 2) And (keyCode = vbKeySpace) Then
            Set frmB = New formB
            Call frmB.Show(1)
            Set frmB = Nothing
            Call Me.CommandButton1.SetFocus '★適当なコントロールに先にSetFocusしとく
            Call Me.txtTest.SetFocus
        End If
    End Sub
    http://www.h3.dion.ne.jp/~sakatsu/Excel_Tips07.htm

    ※もうちょっとスマートな方法はないのだろうか。

    2015年3月5日 9:34
    モデレータ
  • ご回答いただいた方法で実現できました。

    ありがとうございました。

    2015年3月11日 5:37