Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(指定なし : Excel 2016)
ユーザーフォームのテキストボックスの値をEnterで何度も入力し直したい。
投稿日時: 19/04/21 09:39:25
投稿者: ash14219

はじめまして。
excelVBAについて教えてください。
まだまだ勉強中の身ですので、分かりにくい所があったらごめんなさい。
 
 
現在、ユーザーフォームに挑戦中です。
フォームにはテキストボックスが一つ、ボタンが2つあります。
テキストボックスに値を入力し、ボタンを押したら、押されたボタンにより各処理をします。
 
と、ここまでは出来たのですが
テキストボックスに入力した値が間違っていた場合、またテキストボックスにカーソルをもっていき
値を消して入力、という手順が発生してしまいます。
 
これを、入力してEnterを押したあと、また値を入力したら上書きされるようにしたいです。
(ボタンを押す、という動きは、必ずマウスでするものとします。ボタンに関してEnterキーでの操作はしません)
 
頭の中のイメージとしては、excelシートの一つのセルだけロックを解除、
シートをロックされていないセルの選択のみチェックで保護し、値の入力をしたときの動作です。
※イメージしづらかったらごめんなさい。
 
Enterを押したらテキストボックスをセット…等、色々と試してみましたがつまずいてしまいました。
どうぞよろしくお願いします。

回答
投稿日時: 19/04/21 13:28:17
投稿者: WinArrow
投稿者のウェブサイトに移動

説明がいまいち理解できないところがあるが、
 
テキストボックスで[Enter]([Tab]でも同じ)を押すと
コマンドボタンに、カーソルを移動するけれど、
カーソルを移動する前にエラーチェックをしたい
勿論エラーがあったら、カーソル移動しないようにしたい
ということでしょうか?
 

回答
投稿日時: 19/04/21 21:45:43
投稿者: simple

私もされたいことがいまいち理解できていませんが、メモします。

引用:
テキストボックスに入力した値が間違っていた場合、またテキストボックスにカーソルをもっていき
値を消して入力、という手順が発生してしまいます。
これを、入力してEnterを押したあと、また値を入力したら上書きされるようにしたいです。
(ボタンを押す、という動きは、必ずマウスでするものとします。ボタンに関してEnterキーでの操作はしません)

Enterキーを押さなくても、テキストボックスへの入力は有効になっていて、
何度でも修正可能です。
消去する位の手間は掛けてもよいのでは?毎回毎回書き直すわけでもないでしょうし。
完全な入力にしてから、その状態でマウスでコマンドボタンをクリックすればよいのでは?
 
どうしても手で消すのは気に入らない、
ということであれば、テキストボックスをクリアーするボタンを追加するかです。
 
EnterKeyBehavior プロパティでコントロールしようとしてもできないようです。
HELP さんの引用:
True  Enter キーを押すと新しい行が作成されます。
False  Enter キーを押すとタブ オーダーの次のオブジェクトにフォーカスが移ります (既定値)。

HELP さんの引用:
EnterKeyBehavior プロパティと MultiLine プロパティは、密接に関連しています。
EnterKeyBehavior プロパティの設定値は、MultiLine プロパティに真 (True) が
設定されている場合に限り適用されます。
MultiLine プロパティに偽 (False) が設定されているときは、EnterKeyBehavior
プロパティの設定値に関係なく、Enter キーを押すとタブ オーダー次のコントロールに
フォーカスが移ります。

回答
投稿日時: 19/04/22 09:49:53
投稿者: Suzu

ash14219 さんの引用:
これを、入力してEnterを押したあと、また値を入力したら上書きされるようにしたいです。
(ボタンを押す、という動きは、必ずマウスでするものとします。ボタンに関してEnterキーでの操作はしません)

 
ご質問中の Enter は どのような動作をさせる為の Enter なのでしょうか。
 
1. テキストボックスに値を入力
   日本語入力の場合、値確定の為のEnter
 
2. 入力値確定後のカーソル移動の為の Enter
 
3. テキストボックスのVBAのイベント テキストボックス_Enter
 
思いつく目的としては上記3つなのですが。。
 
2/3に関しては、通常は、ほかのコントロールへカーソルが移動しているはずです。
ですので、その状態で「また値を入力したら」を行うと
別のコントロールへの値の入力がされ上書きにはなりません。
この動作を無効にしたいという事であれば、
 
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  If KeyCode = vbKeyReturn Then
    Me.TextBox1.SelStart = 0
    Me.TextBox1.SelLength = Len(Me.TextBox1.Text)
    KeyCode = 0
  End If
End Sub

 
1 の テキストボックス の 値確定の為の Enterの事でしょうか?
それを無効にすることはできません。
日本語を入力しないで良いテキストボックスなのであれば
IMEModeを日本語入力不可「3-fmIMEModeDisable」を選択しておけば日本語入力不可となりますので、
Enter確定させなくて済みます。

回答
投稿日時: 19/04/22 20:09:42
投稿者: だるま
投稿者のウェブサイトに移動

こんにちは ^d^
 

ash14219 さんの引用:

テキストボックスに入力した値が間違っていた場合、またテキストボックスにカーソルをもっていき
値を消して入力、という手順が発生してしまいます。
 
これを、入力してEnterを押したあと、また値を入力したら上書きされるようにしたいです。

 
こんな感じの事をやりたいのでしょうかね。
 
Private Sub CommandButton1_Click()
    If IsOK(Me.TextBox1.Text) Then
        MsgBox "ok"
    End If
     
    ReInput
End Sub
 
Private Sub ReInput()
    With Me.TextBox1
        .SetFocus
        .SelStart = 0
        .SelLength = Len(.Text)
    End With
End Sub
 
Private Function IsOK(V As String) As Boolean
    If IsNumeric(V) Then
        IsOK = True
    End If
End Function
 

回答
投稿日時: 19/04/22 21:40:26
投稿者: WinArrow
投稿者のウェブサイトに移動

「コマンドボタンをクリック時に、テキストボックスの内容をチェックして、
再入力が必要となった場合、テキストボックスにカーソルを移動させて、再入力させる」
という仕様より
 
TextBox1_Exitイベントを使うと
「テキストボックスの内容チェックし、問題があったときは、
次のコントロールへフォーカスしない」
ということが実現できます。
こちらの仕様の方がスマートではないでしょうか?

回答
投稿日時: 19/04/22 22:42:03
投稿者: hatena
投稿者のウェブサイトに移動

ash14219 さんの引用:
頭の中のイメージとしては、excelシートの一つのセルだけロックを解除、
シートをロックされていないセルの選択のみチェックで保護し、値の入力をしたときの動作です。

下記のコードで、ほぼ、同様の動作になると思います。
 
Option Explicit

Private Sub CommandButton1_Click()
    MsgBox "なんらかの処理"
End Sub

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Select Case KeyCode
    Case vbKeyTab, vbKeyReturn, vbKeyLeft, vbKeyUp, vbKeyRight, vbKeyDown
        Me.TextBox1.SelStart = 0
        Me.TextBox1.SelLength = Len(Me.TextBox1.Text)
        KeyCode = 0
    End Select
End Sub

Private Sub UserForm_Initialize()
    Me.CommandButton1.TakeFocusOnClick = False
End Sub

トピックに返信