web-dev-qa-db-ja.com

テキストボックスがアクティブになったら、その内容を選択する方法は?

TextBox1TextBox2だけがあるこの単純なユーザーフォームがあります。両方にテキストを入力します。 TextBox2にフォーカスが置かれている(カーソルが置かれている)と仮定します。 TextBox1をクリックすると、このコントロールのテキスト全体が強調表示(選択)されます。したがって、私はこのコードを使用します:

Private Sub TextBox1_Enter()
    With TextBox1
        .SetFocus
        .SelStart = 0
        .SelLength = Len(.Text)
    End With
    MsgBox "enter event was fired"
End Sub

ロードされる最後にMsgBoxがあります。これは、イベントが機能することを意味します。ただし、テキストは強調表示されません。これを修正する方法は?

Enterイベントを使用しますが、MouseDownイベントを使用したくないのは、TextBox1がプログラムでアクティブになったときにもコードが動作する必要があるため、Enterイベントが最適な選択であると感じるため両方の場合において! MouseDownイベントのもう1つの欠点は、TextBox1を2回クリックすると、最初のクリックでフォーカスが設定され、その後変更されなかったため、テキスト全体が強調表示されなくなることです。同じコントロールを2回クリックしました。そのため、この場合、カーソルを正常に動作させたい(テキストにマークを付けたままにしたくない)。

更新
TextBox1を1回クリックすると、次の結果が得られるはずです。 enter image description here
もう一度クリックすると、ハイライトが削除され、クリックした場所にカーソルが置かれます。

14
ZygD

これ以上に簡単なことはできないと思います...

_Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    With TextBox1
        .SelStart = 0
        .SelLength = Len(.Text)
    End With
End Sub
_

テキストボックスをクリックするか、タブで移動するかどうかにかかわらず、必要なことを行います。テキストの選択を解除するには、矢印キーを使用します。

説明

コードをデバッグすると、_.SetFocus_と言っていても、テキストボックスに焦点が合っていないことがわかります。 _.SetFocus_はTextBox1_Enter()では機能せず、残りのコードを機能させるにはフォーカスが必要です。したがって、私の代替...

代替

また、このバージョンが好きかもしれません:)これは、TextBoxでマウスを使用する制限を克服します

_Dim boolEnter As Boolean

Private Sub TextBox1_Enter()
    boolEnter = True
End Sub

Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
    If boolEnter = True Then
        With TextBox1
            .SelStart = 0
            .SelLength = Len(.Text)
        End With
        boolEnter = False
    End If
End Sub
_
23
Siddharth Rout

Pff、しばらくかかりました。実際には、コードは機能しますが、クリックイベントが発生する前にテキストが強調表示されます。そのため、ボックスをクリックすると、コードによって作成された選択が即座に上書きされます。遅延選択を使用しましたが、それは機能しますが、少し嫌です...

テキストボックスのコード:

Private Sub TextBox1_Enter()
  Application.OnTime Now + TimeValue("00:00:01"), "module1.SelectText1"
End Sub

Private Sub TextBox2_Enter()
  Application.OnTime Now, "module1.SelectText2"
End Sub

{+ TimeValue( "00:00:01")}部分がなくても動作することに注意してください。ただし、理論的には動作しない場合があります。うーん、考え直して、それをそのままにしておきます。それが問題を引き起こすことはないだろう。

Module1のコード:

Sub SelectText1()
  UserForm1.TextBox1.SelStart = 0
  UserForm1.TextBox1.SelLength = Len(UserForm1.TextBox1.Text)
End Sub

Sub SelectText2()
  UserForm1.TextBox2.SelStart = 0
  UserForm1.TextBox2.SelLength = Len(UserForm1.TextBox2.Text)
End Sub

これがあなたにも役立つことを願っています。興味深い問題。 :)乾杯!

5
vacip

その後のmousedownイベントとmouseupイベントにより選択が多少リセットされるため、Enterイベントでテキストを選択/強調表示することができませんでした。

あなたが望むものを達成するための最も適切な方法はこれだと思います:

' if you want to allow highlight more then once, reset the  variable LastEntered prior to call SelectTboxText:
'       LastEntered = ""
'       SelectTboxText TextBox2


Dim LastEntered As String


' Button to select Textbox1
Private Sub CommandButton1_Click()
    SelectTboxText TextBox1
End Sub

' Button to select Textbox2
Private Sub CommandButton2_Click()
    SelectTboxText TextBox2
End Sub

Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    SelectTboxText TextBox1
End Sub


Private Sub TextBox2_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
     SelectTboxText TextBox2
End Sub


Public Sub SelectTboxText(ByRef tBox As MSForms.TextBox)

    If LastEntered <> tBox.Name Then

        LastEntered = tBox.Name

        With tBox
            .SetFocus
            .SelStart = 0
            .SelLength = Len(.Text)
        End With

    End If

End Sub

したがって、テキストボックスの1つをプログラムでアクティブ化するたびに、サブSelectTboxTextを呼び出す必要がありますが、これは本当に面倒なIMOではありません。例として、このために2つのボタンを作成しました。

4
Thomas G

これは、@ vacipが投稿した内容を多少強化したものです。利点は、新しいテキストボックスごとにモジュールに個別のメソッドを追加する必要がないことです。

ユーザーフォームの次のコード:

'===== User Form Code ========

Option Explicit

Private Sub TextBox1_Enter()
    OnTextBoxEnter
End Sub

Private Sub TextBox2_Enter()
   OnTextBoxEnter
End Sub

Private Sub TextBox3_Enter()
   OnTextBoxEnter
End Sub

次のコードはモジュールに入れます:

'===== Module Code ========

Sub SelectAllText()
    SendKeys "{HOME}+{END}", True
End Sub

Sub OnTextBoxEnter()
   Application.OnTime Now + 0.00001, "SelectAllText", Now + 0.00002
End Sub
1
Pradeep Kumar
Private Sub UserForm_Initialize()                                                                
    TextBox1.SetFocus
    TextBox1.SelStart = 0
    TextBox1.SelLength = Len(TextBox1.Text)
End Sub   

これをフォームのコードに追加します

0
Gordon

私はこれがかなり古くなっていることを知っていますが、私の立場にある誰かを助けるためにここに残しています。

私が欲しいのは:

  • 初めてボックスをクリックした場合:すべてのテキストを選択
  • 後でクリックした場合:マウスがある場所にカーソルを置き、マウスを使用してサブストリングを選択できるようにする

まず、TextBoxにタブ移動するときは「すべてのテキストを選択する」がデフォルトの動作であり、TextBoxをクリックするときは「カーソルをここに置く」がデフォルトの動作であるため、マウスが何であるかだけを考慮する必要があります。やっています。

これを行うために、アクティブコントロールを追跡できますが、マウスがTextBoxの上を移動している間(つまり、クリックの前)

コード

Private m_ActiveControlName As String

Private Sub Text1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    m_ActiveControlName = Me.ActiveControl.Name
End Sub

Private Sub Text1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    If m_ActiveControlName <> Me.Text1.Name Then
        Call Text1_Enter   'we don't have to use Text1_Enter for this, any method will do
        Exit Sub           'quit here so that VBA doesn't finish doing its default Click behaviour
    End If
End Sub

Private Sub Text1_Enter()
    With Text1
        .SelStart = 0
        .SelLength = Len(.Text)
    End With
End Sub
0
Luke