[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『VBA フォーカスのあるテキストボックスに入力したい』(雨男)
お世話になります。
フォーム(オブジェクト名 UserForm1 )にテキストボックスが3つあります。
テキストボックスのオブジェクト名はそれぞれTextBox1、TextBox2、TextBox3です。
他にコマンドボタンが11個あり、Key0〜Key9のテンキーボタンと、btnボタンがあります。
やりたいことは、テンキーのボタン(数字)を押すと、テキストボックスに数字が入力されるというものですが、テンキー入力を任意のテキストボックスに行う方法がわかりません。
Option Explicit
Sub TenKey()
Dim KeyNmb As String
KeyNmb = Right(UserForm1.ActiveControl.Name, 1)
With UserForm1 If .TextBox1.Value = "" Then .TextBox1.Value = KeyNmb ElseIf Len(.TextBox1.Value) = 1 Or Len(.TextBox1.Value) = 2 Then .TextBox1.Value = .TextBox1.Value & KeyNmb End If End With
End Sub
取り敢えず、標準モジュールに上記のコードを書いて、Callで呼び出すものを作ってみました。
素人考えの動くだけのコードですが、TextBox1に限定すれば0から9の数字を入れることができました。
完成としては、フォームを立ち上げたらTextBox1にフォーカスがあり(これはタブオーダーでできました。)、ナンバーキーをクリックしたらTextBox1に数字が入力。
btnをクリックすると、TextBox2にフォーカスが移動して、ナンバーキーもTextBox2に入力される。
もう一度btnを押すとTextBox3に移動する、というものを考えましたが、ナンバーキーを切り替える方法が思い浮かばず。
一番最初に書き忘れましたが、登録ボタンを作って、押すとテキストボックスの中身はクリア、ナンバーキーの入力もTextBox1に戻ることを考えています。
フォーカスに関しては、SetFocusを使ってできましたが、そのフォーカスのあるテキストボックスに入力を切り替えるにはどうすればよいのでしょうか。
ヒントなどいただければ幸いです。よろしくお願いします。
< 使用 Excel:Excel2016、使用 OS:Windows10 >
>フォーカスに関しては、SetFocusを使ってできましたが、そのフォーカスのあるテキストボックスに入力を切り替えるにはどうすればよいのでしょうか。
意味が解りません。 1度でも入力してみた事があるのでしょうか? 入力に関しては、テクストボックスのプロパティにあるIMEMODEでもいじっておけば良いんじゃないですか。 テンキーを使うなら意味が無いように思える。 (BJ) 2019/11/29(金) 21:17
>テンキー入力を任意のテキストボックスに行う方法がわかりません。
例えば、UserForm1の変数に任意のボックス番号を持たせるようにし、 その番号のテキストボックスを対象にする。
その変数名をactiveTbxNoとすると
Userform1のイニシャライズで、取りあえずそれに「1」をセットする。
btnボタンがクリックされたら、activeTbxNo に1を加えて、一つズレる様に塩梅します。 最後の番号まで来たら、また「1」に戻す。
1.つまり、UserForm1のモジュールに
Private activeTbxNo As Long
Private Sub UserForm_Initialize() activeTbxNo = 1 End Sub
Private Sub btn_Click() '次のテキストボックスにフォーカスさせる With UserForm1 Select Case activeTbxNo ’activeTbxNoを更新する Case 3 activeTbxNo = 1 Case Else activeTbxNo = activeTbxNo + 1 End Select
.Controls("TextBox" & activeTbxNo).SetFocus End With End Sub
2.標準モジュールのTenkeyプロシージャは、activeTbxNo を引数で受け取る形式に変えます。
Sub TenKey(ByVal activeTbxNo As Long) Dim KeyNmb As String
KeyNmb = Right(UserForm1.ActiveControl.Name, 1)
With UserForm1.Controls("TextBox" & activeTbxNo) If .Value = "" Then .Value = KeyNmb ElseIf Len(.Value) = 1 Or Len(.Value) = 2 Then .Value = .Value & KeyNmb End If End With End Sub
3.それに伴って、Tenkeyをコールするプロシージャは、引数も渡すように変更する 例えば、 ↓ Private Sub Key0_Click() TenKey activeTbxNo ’←どのテキストボックスか指定する引数を渡す End Sub
(半平太) 2019/11/29(金) 21:28
KeyNmb = Right(UserForm1.ActiveControl.Name, 1)
」というようにUserForm1限定のコードなら標準モジュールにではなく、UserForm1に記述するべきですね。
もし、他のフォームでも共通で使いたいということなら、ユーザーフォームを引数で渡すとか、さらに言えばクラスモジュールを使う、ということになりますが、それはまだ先の話だと思いますので、
とりあえずは、コードはすべてUserForm1に記述しましょう。
ユーザーフォームのモジュールレベルの変数で現在フォーカスのあるテキストボックス名を格納しておいて、それを利用するといいでしょう。
あと、Key0〜Key9のテンキーボタンのCaptionには 0〜9の数字が設定してあると思いますので、それを利用するといいでしょう。
コード例
Option Explicit Dim ActiveTextBoxName As String
Private Sub Key0_Click() Call TenKey End Sub
Private Sub Key1_Click() Call TenKey End Sub
Private Sub Key2_Click() Call TenKey End Sub
Private Sub btn_Click() Select Case Right(ActiveTextBoxName, 1) Case "1" Me.Controls("TextBox" & 2).SetFocus Case "2" Me.Controls("TextBox" & 3).SetFocus Case "3" Me.Controls("TextBox" & 1).SetFocus End Select End Sub
Private Sub TextBox1_Enter() Call GetActiveTextBoxName End Sub
Private Sub TextBox2_Enter() Call GetActiveTextBoxName End Sub
Private Sub TextBox3_Enter() Call GetActiveTextBoxName End Sub
Public Sub GetActiveTextBoxName() ActiveTextBoxName = Me.ActiveControl.Name End Sub
Sub TenKey() Dim KeyNmb As String KeyNmb = Me.ActiveControl.Caption With Me.Controls(ActiveTextBoxName) If .Value = "" Then .Value = KeyNmb ElseIf Len(.Value) = 1 Or Len(.Value) = 2 Then .Value = .Value & KeyNmb End If .SetFocus 'フォーカスはテキストボックスに戻しておく End With End Sub
(hatena) 2019/11/29(金) 21:33
ラベルにしたらどうでしょうか。
で、クリックで、ActiveControlがTextBoxなら値をわたす。
Private Sub Key0_Click() TenKey "0" End Sub
Private Sub Key1_Click() TenKey "1" End Sub
(マナ) 2019/11/29(金) 22:33
Option Explicit
Private Sub Key0_Click() TenKey "0" End Sub
Private Sub Key1_Click() TenKey "1" End Sub
Private Sub Key2_Click() TenKey "2" End Sub
Private Sub btn_Click() Select Case Right(Me.ActiveControl.Name, 1) Case "1" Me.Controls("TextBox" & 2).SetFocus Case "2" Me.Controls("TextBox" & 3).SetFocus Case "3" Me.Controls("TextBox" & 1).SetFocus End Select End Sub
Sub TenKey(KeyNmb As String) With Me.ActiveControl If .Value = "" Then .Value = KeyNmb ElseIf Len(.Value) = 1 Or Len(.Value) = 2 Then .Value = .Value & KeyNmb End If End With End Sub
Private Sub UserForm_Initialize() Dim i As Long
For i = 0 To 2 Me.Controls("Key" & i).TakeFocusOnClick = False Next Me.btn.TakeFocusOnClick = False End Sub
(hatena) 2019/11/29(金) 22:46
Private Sub UserForm_Initialize() Dim i As Long
For i = 0 To 2 With Me.Controls("Key" & i) .TakeFocusOnClick = False .TabStop = False End With Next With Me.btn .TakeFocusOnClick = False .TabStop = False End With End Sub
(hatena) 2019/11/29(金) 22:52
>意味が解りません。
BJさん、TextBox2.SetFocus のような形で、数字を入力したらフォーカスが移動するという意味で使用しました。私の知識が足らないため、わけのわかない説明になってしまったと思います。今回ユーザーフォームを勉強していてフォーカス、という言葉を知ったような者です。
>テンキーを使うなら意味が無いように思える。
これはキーボードのテンキーのことでしょうか。ユーザーフォーム上に作ったボタンを総称してテンキーと書いてました。勘違いでしたらすみません。
半平太さん、コードありがとうございます。コメントも付いていて動きがわかりやすいです。動かしてみたところ、希望通りに動作しました。使ったことがないイベントがほとんどでしたので、これを機会に勉強してみます。
>UserForm1限定のコードなら標準モジュールにではなく、UserForm1に記述するべきですね。
hatenaさん、アドバイスありがとうございます。今まで標準モジュールしか使ってこなかったからですかね。ユーザーフォームに記述するという発想(知識)がなかったです。
肝心のコードですが、動かすのは明日になります。何も考えずにWindowsをアップデートしてしまった……。
まだ全然読めてませんが、知らない書き方ばかりで勉強になります。
>ラベルにしたらどうでしょうか。
マナさん、ありがとうございます。正直、各コントロールの特徴?も全然知らない状態でした。ラベルだと何が変わるのか理解できてないので、そこから調べてみようと思います。本当にすみません……。
しばらく頂いたコードを研究してみます。改めて、ありがとうございました。
(雨男) 2019/11/29(金) 23:57
ラベルだと何が変わるのか理解できてないので、そこから調べてみようと思います。
今回の質問の要件は、
複数のテキストボックスがあり、アクティブなテキストボックスにボタンクリックで数字を入力していく、ということだと思います。
コマンドボタンだと、クリック時にフォーカスが自身に移動してしまうので、その前にアクティブだったテキストボックスをどこかに保存しておく必要があります。
私の最初のコードは、テキストボックスのEnter時にモジュールレベル変数に格納しています。
コマンドボタンクリック時に変数に格納したテキストボックスに代入して、フォーカスもテキストボックスに戻します。
ラベルだと、クリックしてもフォーカスが移動しないので、上記のように変数に格納する必要がなくなります。
また、コマンドボタンでも、TakeFocusOnClick と TabStop をFalseに設定しておけばフォーカス移動しないのでラベルと同じコードでいけます。
私の2番目の回答のコードがその例です。
(hatena) 2019/11/30(土) 09:07
>コマンドボタンでも、TakeFocusOnClick と TabStop をFalseに設定しておけば >フォーカス移動しないのでラベルと同じコードでいけます。
ありがとうございます。勉強になります。
雨男さん
BJさんのコメントと同じかもしれませんが マウスクリックでなく、キーボード(テンキー)入力では なぜだめなのでしょうか?
(マナ) 2019/11/30(土) 11:27
>マウスクリックでなく、キーボード(テンキー)入力では
>なぜだめなのでしょうか?
大した理由ではないですが、単純に、マウスだけで動作を完結させたかったためです。
会社を選択して、ID番号を打ち込んで…などの業務に使うものですが、会社を選択(ListBoxで20社程度ある)するところからマウスを使うので、それならマウスだけで完結できないかと考え、色々錯誤しているところです。
本当に大した理由ではないです。
おかげさまでひとまず動くコードを作ることができました。
頂いたコードを勉強しながら、組み込んでいきたいと思います。
皆様ありがとうございました。
(雨男) 2019/11/30(土) 11:50
だとしてもテンキー入力も想定しておく必要があるかもしれません。
(マナ) 2019/11/30(土) 16:48
たしかにそうですね。少し調べるだけですが、ListBoxを矢印キーで動かしたり、エンターでタブキーと同じ動きをさせるなどの動作ができるみたいですね。
マウスとキーボード、どちらでも完結できるよう挑戦してみます。
マナさんありがとうございました。
(雨男) 2019/11/30(土) 19:38
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.