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:
Si vous cliquez à nouveau, la surbrillance sera supprimée et le curseur sera placé à l'endroit où il a été cliqué.
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
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é!
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.
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
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:
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