TextBox1
とTextBox2
だけがあるこの単純なユーザーフォームがあります。両方にテキストを入力します。 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回クリックすると、次の結果が得られるはずです。
もう一度クリックすると、ハイライトが削除され、クリックした場所にカーソルが置かれます。
これ以上に簡単なことはできないと思います...
_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
_
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
これがあなたにも役立つことを願っています。興味深い問題。 :)乾杯!
その後の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つのボタンを作成しました。
これは、@ 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
Private Sub UserForm_Initialize()
TextBox1.SetFocus
TextBox1.SelStart = 0
TextBox1.SelLength = Len(TextBox1.Text)
End Sub
これをフォームのコードに追加します
私はこれがかなり古くなっていることを知っていますが、私の立場にある誰かを助けるためにここに残しています。
私が欲しいのは:
まず、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