2017-07-14 12 views
1

Excel VBAユーザーフォームに10個のテキストボックスがあり、別のプログラムで別の作業を行うためにウィンドウから離れて戻ると、最後に使用していたテキストボックスにフォーカスします。Excel VBA - 最後のユーザーフォームを保存するテキストボックスカーソルフォーカス

これは経験豊かな人には明らかな質問ですが、どこでもこのトピックに関するよくある質問は見つかりません。誰かが私を適切な答えに導くことができれば、私に検索可能なトピック、または良いコードを与えてください。私はスポンジです、私は何かを取るでしょう。

ありがとうございました! -Chris

+0

現在クリックされているテキストボックスに集中したいですか? –

+0

私はこれを簡単に行う方法はないと考えています。フォーカスを正しいコントロールに戻すために必要なGotFocusイベントはありません。 APIへのディップとSetwindowHooksEx + HCBT_ACTIVATEの使用は、おそらく1つの方法でしょう。 –

答えて

0

カーソルフォーカスはVBAではイベントではないため、やりにくいです。 BUT_Changeイベントを使用し、最後に変更したTextboxを覚えておいてください。

最後に変更されたTextBoxの名前には、モジュール内にパブリック変数が必要です。したがって、次回にフォームがアクティブになったときは、簡単なselect caseを使用して、フォームの対応する名前に.SetFocusを使用することができます。以下のコードは2つのテキストボックスで動作します。

形式では:モジュールで

Option Explicit 

Private Sub TextBox1_Change() 
    strLastTb = "TextBox1" 
End Sub 

Private Sub TextBox2_Change() 
    strLastTb = "TextBox2" 
End Sub 

Private Sub UserForm_Activate() 

    Select Case strLastTb 
    Case "TextBox1" 
     TextBox1.SetFocus 
    Case "TextBox2" 
     TextBox2.SetFocus 
    End Select 

End Sub 

:一般的に

Option Explicit 

Public strLastTb As String 

、あなたがTextBox&Digitを連結する関数を作成することができ、そうあなた場合は、数百行を記述する必要はありません50 TextBoxesがあります。そしてそれはより良く見えるだろう。

+0

'Change'は明らかにボックスにフォーカスがあったことを意味しますが、ボックスにフォーカスがあって変更されなかった場合、' strLastTb'は正しくありません。 –

+0

残念ながら、別のアプリケーションに切り替えると、Activateは沈んでいません。 –

+0

@ Mat'sMug&Alex K. - そうですね、私は同じことを考えていたので、答えを編集しました。しかし、ほぼ同じです:) – Vityata