Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
元のコントロールにsetfocusしたい
投稿日時: 19/08/10 21:45:18
投稿者: naniwa

テキストボックスやコンボボックスなどを多数配置したユーザーフォーム(フォーム1)があります。
フォーム1を一旦 Hide で非表示にしてフォーム2を呼び出し、フォーム2を Unload してフォーム1を再表示させたときに、カーソルがあったテキストボックスまたはコンボボックスに Setfocus したいのですが、カーソルが表示されないため、すぐに入力することができません。
 
Unload フォーム2
フォーム1.textbox1.Setfocus
フォーム1.Show
 
どの部分を修正すればよろしいでしょうか。
よろしくお願い致します。

回答
投稿日時: 19/08/10 22:27:48
投稿者: WinArrow
投稿者のウェブサイトに移動

SetFocus
は、当該ユーザーフォームがアクティブでない場合は、実行時エラーになります。
 
仕掛け
Userform1側
コマンドボタンで、Userform2に遷移すると仮定して
 
モジュールレベルで遷移する直前のコントロールを保持する変数を定義します。
Private myCtrl As MSForms.Control
 
CommandButton1のTakeFocusOnClick プロパティを「False」に設定します。
 
Private Sub CommandButton1_Click()
    Set myCtrl = Me.ActiveControl
    Me.Hide
    UserForm2.Show
End Sub
 
Userform1がアクティブになったとき、直前のコントロールをSetfocus
 
Private Sub UserForm_Activate()
    If Not myCtrl Is Nothing Then
        myCtrl.SetFocus
        Set myCtrl = Nothing
    End If
    Me.Repaint
End Sub
 
 
Useform2側
Private Sub CommandButton1_Click()
    Unload Me
    UserForm1.Show
End Sub
 
こんな感じでいかがでしょうか?

回答
投稿日時: 19/08/11 11:50:18
投稿者: simple

質問者さんへ。
すでに適切な回答が示されています。単なる蛇足です。
 
>CommandButton1のTakeFocusOnClick プロパティを「False」に設定します。
ここがポイントでしょうか。
プロパティウインドウで一度設定しておけばOKです。
 
こうしておけば、いったんHideしたときにも
Hideする前のFocusがある位置は、ボタンクリックに影響されずそのままなはずで、
再度Showしたときに、それがそのままの状態で再現されるのではないでしょうか。
(UserForm1のInitialize処理は動作しませんから心配は不要です。)

投稿日時: 19/08/11 21:03:33
投稿者: naniwa

望んでいた動作が実現しました!
ようやく次へ進めます。
WinArrow様、simple様、本当にありがとうございました。