[[20191129184939]] 『VBA フォーカスのあるテキストボックスに入力した』(雨男) ページの最後に飛ぶ

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

 

『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


>Key0〜Key9のテンキーボタン

ラベルにしたらどうでしょうか。
で、クリックで、ActiveControlがTextBoxなら値をわたす。

 Private Sub Key0_Click()
    TenKey "0"
 End Sub

 Private Sub Key1_Click()
    TenKey "1"
 End Sub

(マナ) 2019/11/29(金) 22:33


ラベルでもいいのですが、
コマンドボタンでも、TakeFocusOnClickプロパティをFalseに設定しておけば、フォーカス移動しないので同じようにできますね。

 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


タブストップもFalseにしておいた方かいいですね。

 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


hatenaさん

 >コマンドボタンでも、TakeFocusOnClick と TabStop をFalseに設定しておけば
 >フォーカス移動しないのでラベルと同じコードでいけます。

 ありがとうございます。勉強になります。
  
 

雨男さん

 BJさんのコメントと同じかもしれませんが
 マウスクリックでなく、キーボード(テンキー)入力では
 なぜだめなのでしょうか?

(マナ) 2019/11/30(土) 11:27


hatenaさん、丁寧な解説ありがとうございます。
マナさんもありがとうございます。理解できました。

>マウスクリックでなく、キーボード(テンキー)入力では
>なぜだめなのでしょうか?

大した理由ではないですが、単純に、マウスだけで動作を完結させたかったためです。
会社を選択して、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.