web-dev-qa-db-fra.com

Comment sélectionner le contenu d'un champ de texte une fois activé?

J'ai ce Userform simple, où je n'ai que TextBox1 et TextBox2. J'entre du texte dans les deux. Supposons que le focus est sur (le curseur est dans) le TextBox2. Lorsque je clique sur TextBox1, je souhaite que tout le texte de ce contrôle soit mis en surbrillance (sélectionné). Ainsi j'utilise ce code:

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

Il y a une MsgBox à la fin qui est chargée, ce qui signifie que l'événement fonctionne. Cependant, le texte n'est pas en surbrillance. Comment régler ceci?

J'utilise l'événement Enter et je ne veux pas utiliser l'événement MouseDown, car j'ai besoin que le code fonctionne également lorsque le TextBox1 est activé par programme. Je pense donc que l'événement Enter est le meilleur choix, car il est déclenché dans les deux cas! Un autre inconvénient de l'événement MouseDown est le suivant: lorsque je clique pour la deuxième fois sur le TextBox1, je ne m'attends pas à ce que tout le texte soit mis en surbrillance, car le focus a été défini lors du premier clic et il n'a pas été modifié après avoir cliqué sur le bouton. même contrôle pour la deuxième fois; donc dans ce cas, je voudrais que le curseur agisse normalement (ne pas garder le texte marqué).

Mettre à jour
Lorsque je clique une fois sur le TextBox1, j’attends le résultat suivant: enter image description here
Si vous cliquez à nouveau, la surbrillance sera supprimée et le curseur sera placé à l'endroit où il a été cliqué.

13
ZygD

Je ne peux pas être plus simple que cela, je suppose ...

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

Que vous cliquiez sur la zone de texte ou que vous y insériez, il fera ce que vous voulez. Pour désélectionner le texte, utilisez les touches fléchées.

Explication

Si vous déboguez le code, vous verrez que même si vous avez dit .SetFocus, la zone de texte n'est pas active. .SetFocus ne fonctionne pas dans TextBox1_Enter() et vous devez avoir le focus pour que le reste du code fonctionne. Et donc mon alternative ...

Alternative

Vous pourriez aussi aimer cette version :) Cela permet de dépasser la limitation liée à l'utilisation de la souris dans la zone de texte

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
17
Siddharth Rout

Pff, m'a pris un moment. En réalité, votre code fonctionne, mais il met en surbrillance le texte AVANT que l'événement click se produise. Donc, si vous cliquez dans la case, la sélection créée par le code est automatiquement remplacée .. J'ai utilisé une sélection retardée, et cela fonctionne, même si c'est un peu dégoûtant.

Le code pour les zones de texte:

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

Notez que cela fonctionne même sans la partie {+ TimeValue ("00:00:01")}, mais cela pourrait théoriquement l'empêcher de fonctionner par moments. Hmm, à la réflexion, laissez simplement cela de côté. Je doute que cela puisse causer un problème.

Maintenant le code dans 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

J'espère que cela fonctionne pour vous aussi. Problème ineresting. :) À votre santé!

5
vacip

Je ne parvenais pas à sélectionner/mettre en surbrillance le texte dans l'événement Enter car les événements mousedown et mouseup qui suivaient réinitialisaient quelque peu la sélection.

Je pense que la manière la plus appropriée de réaliser ce que vous voulez est la suivante:

' 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

Ainsi, chaque fois que vous souhaitez activer l'un des champs de texte par programme, vous devez appeler le sous-conteneur SelectTboxText, qui n'est pas vraiment ennuyeux. J'ai fait 2 boutons pour cela à titre d'exemple.

4
Thomas G

Ceci est en quelque sorte une amélioration de ce que @vacip a publié. L'avantage que vous obtenez est que vous n'avez pas besoin d'ajouter une méthode distincte dans le module pour chaque nouvelle zone de texte.

Le code suivant dans votre formulaire d'utilisateur:

'===== 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

Le code suivant va dans un module:

'===== 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

Je sais que cela est bien dépassé, mais je laisse ceci ici au cas où cela aiderait quelqu'un dans ma position.

Ce que je veux c'est:

  • Si je clique sur la case pour la première fois: sélectionne tout le texte
  • Si je clique dessus une autre fois: place le curseur à l'emplacement de la souris et me permet d'utiliser la souris pour sélectionner une sous-chaîne

Tout d'abord, il est important de savoir que "Sélectionner tout le texte" est le comportement par défaut lors de la tabulation dans une zone de texte et que "Placez le curseur ici" est le comportement par défaut lorsque vous cliquez sur une zone de texte. Faire.

Pour ce faire, nous pouvons garder trace du contrôle actif, mais uniquement lorsque la souris se déplace sur notre zone de texte (c'est-à-dire avant le clic).

Code :

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