Excel (VBA)

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

 
(Windows 11 Home : Excel 2016)
UserForm TextBox 作業後も入力可能状態にしておきたい。
投稿日時: 24/05/02 16:28:31
投稿者: taichi

お試し用で
UserForm 上に TextBox1 とCommandButton1 を配置しています。
 
Private Sub CommandButton1_Click()
 End
End Sub
 
Private Sub TextBox1_AfterUpdate()
    ActiveCell= TextBox1
    ActiveCell.Offset(1, 0).Select
    TextBox1.Value = Empty
    TextBox1.SetFocus <−−−これが有効にならない。
End Sub
毎回、TextBox1をクリックしないと入力できない状態です。
因みにCommandButton1.TabStop = True です。
よろしくお願いいたします。
 

回答
投稿日時: 24/05/02 16:57:43
投稿者: hatena
投稿者のウェブサイトに移動

具体的にはどのような動作をご希望ですか。
 
ユーザーフォーム上にはテキストボックスとコマンドボタンが一つずつしかない。
 
テキストボックスで入力後にEnterキーやTabキーを押してもコマンドボタンにフォーカス移動させたくない。
コマンドボタンはマウスクリックで実行できるようにしたい。
 
ということでしょうか。
 
だとしたら、

CommandButton1.TabStop = False

でいいと思いますが。
 
上記がご希望と違うのなら、どのような動作にしたいのか具体的に説明してください。

回答
投稿日時: 24/05/02 17:15:42
投稿者: hatena
投稿者のウェブサイトに移動

ひょっとすると下記のようなことがご希望のことでしょうか。
 
ユーザーフォームを開いた直後は、テキストボックス、コマンドボタン間をTabキーなどのキー操作でフォーカス移動できるようにしておきたい。
 
テキストボックスで入力したら、キー操作ではコマンドボタンに移動しないようにしたい。
コマンドボタンの実行はマウスクリックのみでしたい。クリック後はキー操作でフォーカス移動できるようにしたい。
 
だとしたら、
 

Private Sub CommandButton1_Click()
    Msgbox "クリックしました!"
End Sub

Private Sub CommandButton1_Enter()
    CommandButton1.TabStop = True
End Sub

Private Sub TextBox1_Change()
    CommandButton1.TabStop = False
End Sub

回答
投稿日時: 24/05/02 17:26:22
投稿者: Suzu

hatenaさん が既におっしゃっていますが
コントロールの並びや、希望の動作が判らないと、なんともですが・・
何となく、連続入力をしたいって事かしら?
 
 
AfterUpDateではなく、BeforeUpDate の Cancel を使う
 
Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
  If Len(Me.TextBox1) = 0 Then
  Else
    ActiveCell = TextBox1
    ActiveCell.Offset(1, 0).Activate
    Me.TextBox1.Value = Empty
    Cancel = True
  End If
End Sub
 
でも。。。
スキルが高いユーザーになると
「こんな事するなら、フォームなど使用せずワークシートに入力した方が楽」
と言います。
 
連続入力なんて、入力対象のうち、数か所は同じ値になりがちですから。
「列の配置や列の非表示を使い、差異がある部分を入力後、同じ値の部分はオートフィル の方が楽」と。。

回答
投稿日時: 24/05/02 21:43:25
投稿者: WinArrow

セルへの連続入力を所望するならば、
入力する(予定する)セル範囲を選択しておいて、
入力の都度、[Enter]で下のセルにカーソルが移動します。
   
ユーザーフォームを使う方法で、
若し、入力したデータを戻って修正する場合は、どのようにするのかな?

投稿日時: 24/05/02 22:18:43
投稿者: taichi

 hatena さん Suzu さん WinArrow さん ありがとうございます。
 
説明不足で申し訳ございません。
■ 実際の作業は学年(1-6)用のComboBox1 と 各学年での番号をTexBox1 の
組み合わせ入力することによりデータシート[年(B列) 番号(C列) 名前(D列) .....]
から参加児童の名前を参加記録シート(日付毎)に 1-012 日本 太郎 のように記録していきます。
多い日は200人近く、少ない日は20人ほどと一定ではありません。参加カードからの記録が
終わってから初めて何人参加だったのかが分かるようになります。
 
■ やりたいことは、学年ごとに1-6年の順に記録していくときに、TexBox1を入力した番号を
  Enterキーで確定させた後もTexBox1 次々と番号入力できるようにしたいのです。
 
□ いただいたコードをお試し用UserFormで試してみましたが、今のところ目的は達成
  できていません。
 TextBox1_AfterUpdate()の中に書き込んだ状態では
 CommandButton1.TabStop = False ではUserFormが開いている状態では、何も動きなしで、
 閉じた時点(×印で)で、セルへの記入や、セル移動が行われました。
 
 よろしくお願いいたします。

回答
投稿日時: 24/05/03 04:58:41
投稿者: hatena
投稿者のウェブサイトに移動

taichi さんの引用:
■ やりたいことは、学年ごとに1-6年の順に記録していくときに、TexBox1を入力した番号を
  Enterキーで確定させた後もTexBox1 次々と番号入力できるようにしたいのです。

 
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If TextBox1.Value = "" Then Exit Sub
    If KeyCode = vbKeyReturn And Shift = 0 Then
        KeyCode = 0
        
        '転記処理
        Debug.Print "年:"; ComboBox1.Value, "番号:"; TextBox1.Value '動作確認用
        
        TextBox1.Value = ""
    End If
End Sub

回答
投稿日時: 24/05/03 10:53:00
投稿者: WinArrow

シンプルに
TextBox1_Exitイベントを使う案は如何ですか?
 
参考コード

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If Me.TextBox1.Text <> "" Then
        Range("A" & Rows.Count).End(xlUp).Offset(1).Value = Me.TextBox1.Text
        Me.TextBox1.Text = ""
        Cancel = True
    End If
End Sub

投稿日時: 24/05/03 14:12:20
投稿者: taichi

hatena さん WinArrow さん コードありがとうございます。
 
文章では説明し難いので参加記録シートの様式を書きました。
※スペースではプレビューが崩れるのでスペースの代わりに□を利用しています。
 
 A列|B列 |□C列 □|D列 |□E列 □|F列 |□G列 □|H列 |□I列 □|・・・・・・・・・・・・・|AF列| AG列 □|
----+----+--------+----+--------+----+--------+----+--------+-------------+----+--------+-
日付|□□11:30□□|□□12:00□□|□□12:30□□|□□13:00□□|・・・・・・・・・・・・・|□□18:30□□|
----+----+--------+----+--------+----+--------+----+--------+-------------+----+--------+-
4/5 |1-05|豊臣秀吉|□□|□□□□|1-06|斎藤道三|1-06|斎藤道三|・・・・・・・・・・・・・|4-18|大内義隆|
4/5 |3-20|高山右近|□□|□□□□|1-10|浅井長政|3-99|織田信長|・・・・・・・・・・・・・|6-05|大谷吉継|
4/5 |□□|□□□□|□□|□□□□|1-80|明智光秀|5-10|直江兼続|・・・・・・・・・・・・・|□□|□□□□|
4/5 |□□|□□□□|□□|□□□□|2-05|西郷従道|□□|□□□□|・・・・・・・・・・・・・|□□|□□□□|
4/5 |□□|□□□□|□□|□□□□|2-13|島津義久|□□|□□□□|・・・・・・・・・・・・・|□□|□□□□|
4/5 |□□|□□□□|□□|□□□□|6-08|大友宗麟|□□|□□□□|・・・・・・・・・・・・・|□□|□□□□|
----+----+--------+----+--------+----+--------+----+--------+-------------+----+--------+-
□□|□□|□□□□|□□|□□□□|□□|□□□□|□□|□□□□|・・・・・・・・・・・・・|□□|□□□□|
UserForm1.Show vbModeless で使用しています。
一日の参加時間帯は11:30から18:30までの30分刻みで時間帯を設定しています。
各時間帯は年-番号、児童名の2列を使用します。12:00の時間帯(D・E列)は参加者が一人もいない
状況です。児童名はDGet関数を使ってComboBox1.Value と TextBox1.Value で検出しています。
入力ミスに対するエラー処理はしています。
 
【問題点】
4/5の最後の行番号を120であるとして、4/6の記録をする際に、B121を選択後、年=4,番=13を
入力すれば、B121に4-13 C121に北条早雲 が入ります(この部分はコード化済)。
ActiveCell.Offset(1,0).Selectを記述しています。
TextBox1(番)に入力可能である状態にしたいのですが、再度TextBox1を選択しないと
入力できない状態なので面倒です。
                  よろしくお願い致します。
 

回答
投稿日時: 24/05/03 18:17:31
投稿者: WinArrow

時間帯判断は、人手ということですか?
 

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    With Me.TextBox1
        If .Text <> "" Then
            ActiveCell.Value = .Text
            ActiveCell.Offset(1).Select
            .Text = ""
            Cancel = True
        End If
    End With
End Sub

 

投稿日時: 24/05/03 22:39:42
投稿者: taichi

WinArrow さん コードありがとうございます。
 
>時間帯判断は、人手ということですか?
はい、そのとおりです。実際はUserForm上に→のCommandButtonを配置していて、
次の時間帯にセル移動 4/6ならどの時間帯も行番号=121から記録開始できるようにしています。
 
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    With Me.TextBox1
        If .Text <> "" Then
            ActiveCell.Value = .Text
            ActiveCell.Offset(1).Select
            .Text = ""
            Cancel = True
        End If
    End With
End Sub
ActiveCellに代入後、ActiveCell.Offset(1).Select まではいいのですが、
その後でTextBox1に内に縦線がある状態(入力受け入れ準備)の状態にならず、
TextBox1を毎回クリックしてから入力せざるを得ない状態です。
試し用UserForm(vbModeless)ではコントロールはComboBox1(学年入力用),
TextBox1(番号入力用),CommandButton1(終了)だけの配置だけです。

回答
投稿日時: 24/05/03 23:07:17
投稿者: WinArrow

>その後でTextBox1に内に縦線がある状態(入力受け入れ準備)の状態にならず、
 
そのようなことは、どこに書いてありますか?
 
表のレイアウトでは、B列とC列に分けてかかれっていますよね?
 
そもそも
>TextBox1に内に縦線がある状態
って何?
 
テイストボックスには、どのように入力し、それをどこのセルの代入するの?

投稿日時: 24/05/03 23:23:57
投稿者: taichi

【自己報告】
 
Private Sub TextBox1_AfterUpdate()
    ActiveCell =TextBox1
    ActiveCell.Offset(1, 0).Select
    TextBox1.Value = Empty
End Sub
 
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Cancel = True
End Sub
と分けて記述すると、TextBox1にフォーカスが当たったままになりました。
ただ、
Private Sub CommandButton1_Click()
 End
End Sub
が効かなくなりました。UserForm右上のXからは終了できました。

回答
投稿日時: 24/05/03 23:26:59
投稿者: WinArrow

テキストボックスには、番号と氏名を入力すると考えてよいのですね?
番号:半角2桁で、3桁目以降は氏名(全角)
 
レイアウト説明のような「-」を入れるのは自分で工夫してください。
 

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    With Me.TextBox1
        If .Text <> "" Then
            ActiveCell.Value = Me.ComboBox1.Value
            ActiveCell.Offset(, 1).Value = Left(.Text, 2)
            ActiveCell.Offset(, 2).Value = Mid(.Text, 3)
            ActiveCell.Offset(1).Select
            .Text = ""
            Cancel = True
        End If
    End With
End Sub

投稿日時: 24/05/04 10:41:47
投稿者: taichi

WinArrow さん 何度もありがとうございました。
 
コード試しました。動きは希望通りに次々と入力可能になりました。