[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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
(隠居じーさん) 2018/08/02(木) 18:42
Activateで出来るということは
開いたタイミングでアクティブになっていないということですよね、、
それなのにタブキーはフォーム上で動作する、、謎です、、
(TAKA) 2018/08/02(木) 18:56
(隠居じーさん) 2018/08/02(木) 19:32
>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
>>なぜActivateにしたのでしょうか。
Initializeは表示前に(ロード時)発生するイベントで
フォーカスの設定は出来ないと記憶していますが、違っているのでしたら
済みません。
詳しくご教授ください。
(隠居じーさん) 2018/08/02(木) 23:46
(隠居じーさん) 2018/08/03(金) 08:49
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
(隠居じーさん) 2018/08/03(金) 12:32
(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
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.