[[20180802175648]] 『VBA ユーザーフォームのフォーカスについて』(TAKA) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBA ユーザーフォームのフォーカスについて』(TAKA)

ユーザーフォームについての質問です。

フォーム上にいくつかのTextBoxやComboBox、ListBoxなどを配置しています。
タブオーダでTextBox1が最初に来るようにセットしているのですが、実際に開くとカーソルがなく入力できません。

マウスでクリックすれば入力できるので、TextBoxに問題があるわけではなさそうです、、

また、開いてカーソルが見えていない状態でタブキーを押すと、タブオーダ上で次に設定されているTextBox2にカーソルが現れます。

Initializeで、TextBox1.SetFocus としても、 TextBox1.TabIndex = 0 としてもだめでした。、、

どなたか分かる方教えていただけたら幸いです。

必要ないかもしれませんが、TextBox1にはAfterUpdateでマクロが入っているので、そのコードも以下に提示します。T8というのはTextBox1につけたオブジェクト名です。

Private Sub T8_AfterUpdate()

    Call SheetSET
    If Len(T8) = 9 Then
        If Daicho.AutoFilterMode Then Daicho.Range("A1").AutoFilter
        Daicho.Range("A1").AutoFilter Field:=8, Criteria1:=T8.Value
        If WorksheetFunction.Subtotal(3, Daicho.Range("H:H")) > 1 Then
            '編集・削除
            CommandButton2.Caption = "変  更"
            With Worksheets.Add
                Daicho.Range("A1").CurrentRegion.Copy .Range("A1")
                Daicho.Range("A1").AutoFilter
                Lr = .Cells(Rows.Count, "H").End(xlUp).Row
                ReDim LST(2 To Lr, 1 To 19)
                LST = .Range(.Range("A2"), .Cells(Lr, "S")).Value
                Application.DisplayAlerts = False
                .Delete
                Application.DisplayAlerts = True
            End With
            With ListBox1
                .ColumnCount = 19
                .ColumnWidths = _
                "0;35;25;25;25;25;35;75;115;95;40;40;45;60;60;55;25;35;95"
                .List = LST
                .ListIndex = 0
            End With
        Else
            '新規入力
            CommandButton2.Caption = "新  規"
            Daicho.Range("A1").AutoFilter
            ListBox1.Clear
            With S324
                Set Fc = .Range("D:D").Find(T8.Value)
                If Fc Is Nothing Then
                    MsgBox "3-24に存在しない受注番号です。", vbInformation
                Else
                    T10 = Trim(.Cells(Fc.Row, "I").Value) '機種
                    T11 = Trim(.Cells(Fc.Row, "L").Value) '車台番号
                    T9 = Trim(.Cells(Fc.Row, "Z").Value) '使用者名
                    TextBox11 = .Cells(Fc.Row, "F").Value '担当ID
                End If
            End With
        End If
    Else
        If T8 <> "" Then MsgBox "受注番号が正しくありません", vbExclamation, "文字数Check"
    End If
End Sub

< 使用 Excel:Excel2013、使用 OS:Windows10 >


 こんばんは ^^
TextBox1.SetFocus 
を
何処でもいいので例えばTextBox2にフォーカスを設定後
TextBox1にフォーカスを設定してもだめでしょうか。

 TextBox2.SetFocus 
 TextBox1.SetFocus 

 過去そんな経験をしたことがあります。
違ってましたらお許しを。。。
(隠居じーさん) 2018/08/02(木) 18:19

隠居じーさんさん、回答ありがとうございます。
それもやってみましたがだめでした、、、
(TAKA) 2018/08/02(木) 18:39

Initializeではなく
同じパターンで
Activateでもだめでしょうか

(隠居じーさん) 2018/08/02(木) 18:42


隠居じーさんさんありがとうございました!
Activateなら出来ました!

Activateで出来るということは
開いたタイミングでアクティブになっていないということですよね、、
それなのにタブキーはフォーム上で動作する、、謎です、、

(TAKA) 2018/08/02(木) 18:56


よかったですね ^^
イベントの発生タイミングによるのでしょうね。
m(__)m
でわ

(隠居じーさん) 2018/08/02(木) 19:32


>隠居じーさんさん、回答ありがとうございます。
>それもやってみましたがだめでした、、、
(TAKA) 2018/08/02(木) 18:39

>Initializeで、TextBox1.SetFocus としても
>T8というのはTextBox1につけたオブジェクト名です。
>それなのにタブキーはフォーム上で動作する、、謎です、、
(TAKA) 2018/08/02(木) 18:56

原因はオブジェクト名を変更したので
Initializeで 、TextBox1.SetFocus を T8.SetFocusにする。
Activateは使用しない。

タブキーはフォーム上で動作して正解です。これは Windows の項目移動という機能です。
試しにディスクトップ画面にしてタブキーを押してみてください。項目移動の確認ができます。
気になった点
MsgBox の後に T8.SetFocus を記述したらどでしょう。

>Initializeではなく
>同じパターンで
>Activateでもだめでしょうか
(隠居じーさん) 2018/08/02(木) 18:42

なぜActivateにしたのでしょうか。
(HO) 2018/08/02(木) 22:33


こんばんは ^^
オブジェクト名の指摘に関してですが。
TAKA さんは、ここで回答も多数アップされており
VBAは私よりは、熟知されておられるかと
わたしのTextbox1をご自分のT8に読み替えてくださった可能性もあるのでは
ないでしょうか。

>>なぜActivateにしたのでしょうか。
Initializeは表示前に(ロード時)発生するイベントで
フォーカスの設定は出来ないと記憶していますが、違っているのでしたら
済みません。
詳しくご教授ください。

(隠居じーさん) 2018/08/02(木) 23:46


TAKAさん、HOさん、おはようございます。^^
先ほどから昔作成したフォームを使ったコード引っ張り出して調べたり
NET検索でInitialize調べたりしています。
当時、いろいろいじっていましたので。最初にフォ-カスさせたいテキストボックスの
タブインデックスが1になっていました。
ゼロにして
Initialize
Activate
双方には何も記述せず、実行すれば
最初にフォ-カスさせたいテキストボックスにフォ-カスされました。??;。。。mmmう!^^;;;
当時、TAKAさんもおっしゃっておられたように、これが出来なかったので
色々お聞きした結果昔、そのような事象があったとお聞きし
>>何処でもいいので例えばTextBox2にフォーカスを設定後
>>TextBox1にフォーカスを設定
を教えていただき
Initializeでは改善されず、
Activate
で設定すればうごいてくれましたので、そのまま使っていました。
詳細をご存知でしたら、是非、教えて下さい。
今から、勉強の為、新規でフォーム作って、実験してみます。
^^;
でわ
m(__)m

(隠居じーさん) 2018/08/03(金) 08:49


HOさん回答ありがとうございます。
オブジェクト名はもちろんT8に置き換えています。

MsgBoxの後ということですが、
このコードはT8が空欄なら何もしないのでMsgBoxのところを通りません。

隠居じーさんさんありがとうございます。
私も実験しているのですが、

Private Sub UserForm_Activate()

    MsgBox "Test"
End Sub

これだと開いてからMsgBoxが表示されるの対して、

Private Sub UserForm_Initialize()

    MsgBox "Test"
End Sub

これだとMsgBoxが表示されてから、フォームが開きます。(メッセージボックスのOKボタンを押さないとフォームが表示されない)

なるほどと納得しかけたんですが

Private Sub UserForm_Initialize()

    TextBox1 = "ABC"
End Sub

これは出来てしまう。
本当に奥が深いですね、、、

納得して使いたいのでもっと勉強します、、

(TAKA) 2018/08/03(金) 10:40


 こんにちは ^^
下記のコードのままでも
Private Sub UserForm_Activate() か
Private Sub UserForm_Initialize()
にカーソルを合わせF5を押せば
Private Sub UserForm_Initialize()
に
Me.TextBox1.SetFocusを記述しても、
しなくても
TextBox1にフォーカスしますが
Sub main()
から呼び出すと、やはり
Private Sub UserForm_Activate()のコメントをはずせば
TextBox1にフォーカスしますです。
何かVBAでもアクティブコントロールにTextBox1オブジェクトを指定すれば(方法は解かりません^^;)
Initializeでも
出来るのでしょうか?
謎です。。。
引き続きモードが違う場合を実験してみます。^^
標準モジュール
Option Explicit
Sub main()
    UserForm1.Show vbModeless
End Sub

 フォームモジュール
Option Explicit
Private Sub CommandButton1_Click()
    Unload Me
End Sub
Private Sub UserForm_Activate()
    MsgBox "Activate"
    MsgBox "Label1 TabIndex= " & Me.Label1.TabIndex & Chr(13) & _
           "TextBox1 TabIndex= " & Me.TextBox1.TabIndex & "  TextBox1 TabStop= " & Me.TextBox1.TabStop & Chr(13) & _
           "TextBox2 TabIndex= " & Me.TextBox2.TabIndex & "  TextBox2 TabStop= " & Me.TextBox2.TabStop
    'Me.TextBox2.SetFocus
    'Me.TextBox1.SetFocus
End Sub
Private Sub UserForm_Click()
    MsgBox "Click"
End Sub
Private Sub UserForm_Initialize()
    MsgBox "Initialize"
    Me.Label1.TabIndex = 99
    Me.TextBox1.TabIndex = 0
    Me.TextBox2.TabIndex = 1
    Me.TextBox2.SetFocus
    Me.TextBox1.SetFocus
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    MsgBox "QueryClose"
End Sub
Private Sub UserForm_Terminate()
    MsgBox "Terminate"
End Sub
(隠居じーさん) 2018/08/03(金) 12:11

追記
オブジェクト名、変更なし
'ラベル 1個
'テキストボックス 2個
'コマンドボタン 1個
'の新規ユーザーフォーム作成
win10
Excel 2016
でした。 ^^

(隠居じーさん) 2018/08/03(金) 12:32


(TAKA)さんカーソルの件どうなりました。
(HO) 2018/08/03(金) 13:12

(TAKA)さんカーソルの件どうなりました。
(HO) 2018/08/03(金) 13:12
は無視してください。

(HO) 2018/08/04(土) 15:42


 報告、遅くなりました。 ^^
ご存知だとは思いますが
Option Explicit
Sub main()
    UserForm1.Show vbModal
End Sub
標準モージュール mainプロシジャーから
UserForm1.Show vbModal
で呼び出した場合はタブインデックスの順に
Private Sub UserForm_Activate()
Private Sub UserForm_Initialize()
双方
何も記述しなくてもフォーカス出来ます。@@!え。。。
でした。
(*^^*)簡単ですね。
隠居じーさん) 2018/08/03(金) 08:49を一部修正^^;
m(_ _)m
(隠居じーさん) 2018/08/05(日) 06:48

隠居じーさん
確認ですが、フォーカスの状態はどうなっていますでしょうか。

(HO) 2018/08/05(日) 14:16


追記
タブインデックスの順にカーソルが表示されるということですよね。
(HO) 2018/08/05(日) 18:44

隠居じーさんさんありがとうございました!!

UserForm1.Show vbModal

のときはフォーカス出来て、

UserForm1.Show 'vbModal

のときは標準モジュールから呼び出したときもWorkSheet_Openのタイミングで呼び出したときもフォーカスされていないので、原因はモードレスになっていたことのようです、、

VBA覚えて一年くらいですが、今更モーダルとモードレスの違いを知りました、、笑

ご丁寧にありがとうございました!勉強になりました!

(TAKA) 2018/08/06(月) 11:44


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.