[VBA] - Comportement étrange de la chaine si vbTab ou vbCrLf
Bonsoir,
Je souhaite renseigner du texte dans une TextBox, en autorisant les sauts de lignes et les tabulations.
Tout fonctionne bien, sauf qu'à certains moments, la tabulation ou le saut de ligne semble considéré comme un saut de ligne.
Ou bien le saut de ligne précédent est répété, je ne sais pas trop.
Je joins un fichier, si vous voulez voir son comportement, je vous propose d'écrire ceci :
> saut de ligne
> tabulation
> saut de ligne
> tabulation
> saut de ligne
> tabulation
Là, à la troisième tabulation, la textbox va ajouter un saut de ligne. Savez-vous ce qui cause cela ?
J'espère que j'ai été complet.
Merci de votre attention !
À plus tard :)
Erreur de ma part. Effectivement comportement étrange et aléatoire.
Bonjour,
J'ai modifié le code comme ceci :
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
key = KeyCode: cib = 0
pos = Me.TextBox1.SelStart
Select Case key
Case 13
KeyCode = 0: cib = 1
Me.TextBox1.text = InsertAtPosition(Me.TextBox1.text, cib, pos)
Case 9
KeyCode = 0: cib = 2
Me.TextBox1.text = InsertAtPosition(Me.TextBox1.text, cib, pos)
End Select
End Sub
Private Function InsertAtPosition(ByVal Otext As String, ByVal IText As Byte, ByVal position As Long) As String
Dim a&, i&, first$, second$, x$
InsertAtPosition = "": first = "": second = ""
Select Case IText
Case 1
x = Chr(13): a = 1
Case 2
x = vbTab: a = 1
End Select
i = 1
If position - i > 0 Then
Do While Mid(Otext, position - i, 1) = vbLf
i = i + 1
If position - i = 0 Then Exit Do
Loop
' Do While Mid(Otext, position - i, 1) = vbTab
' i = i + 1
' If position - i = 0 Then Exit Do
' Loop
End If
first = Left(Otext, position + i + a - 1)
second = Mid(Otext, position + i) '+ a
'Sheets("Accueil").Cells(1, 1) = first
'Sheets("Accueil").Cells(2, 1) = second
InsertAtPosition = first & x & second
End Function
Mais toujours sans succès...
vbLf, ou vbClRf(ou d'autre je ne sais pas) sont des associations de caractères.
vbCrLf = CR (Carriage Return) + LF (Line Feed)
Ce qui doit être compté comme 2 caractères. Mais même lorsque j'essaie de faire cela, j'ai toujours des soucis dans le fonctionnement.
La position n'est pas bien calculée.
Essayez de mettre à True la propriété .TabKeyBehaviour. Ca ne règlera que le pb des tabulations, mais ce sera toujours ça de pris.
La combinaison des touches Ctrl et Enter permet les retours chariots dans une TBox. J'ai essayé de les simuler avec SendKeys, mais walou !
VBA n'est malheureusement pas VB 6.0 ou +.
Bonjour,
En effet, .TabKeyBehaviour = true n'a pas vraiment changé le comportement de la textbox.
J'ai résolu mon souci en convertissant les tabulations et saut de lignes en d'autres caractères "@" et "_", qui seront interdits à la saisie.
Voici le code :
Option Explicit
Dim pos&, key&, i&, selen&, TxtInit$
On vérifie la touche qui a été pressée et on traite les "tab" ou "entrée".
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
key = KeyCode: cib = 0
pos = Me.TextBox1.SelStart
selen = Me.TextBox1.SelLength
TxtInit = Me.TextBox1.text
Select Case key
Case 13
KeyCode = 0: cib = 1
Me.TextBox1.text = InsertAtPosition(Me.TextBox1.text, "_", pos)
Case 9
KeyCode = 0: cib = 2
Me.TextBox1.text = InsertAtPosition(Me.TextBox1.text, "@", pos)
End Select
End Sub
Fonction pour convertir les tabulations et saut de lignes existants en symboles.
On ajoute le caractère correspondant, à la position à laquelle se trouve le curseur dans la textbox.
Puis, on reconvertit les symboles dans leur valeur initiale.
Private Function InsertAtPosition(ByVal Otext As String, ByVal IText As String, ByVal position As String) As String
Dim a&, first$, second$, text$
InsertAtPosition = "": first = "": second = ""
Otext = Replace(Replace(Otext, vbTab, "@"), vbCrLf, "_")
first = Left(Otext, position)
second = Mid(Otext, position + 1)
InsertAtPosition = first & IText & second
InsertAtPosition = Replace(Replace(InsertAtPosition, "@", vbTab), "_", vbCrLf)
End Function
À chaque changement dans TextBox1, on recalcule la position du curseur (sinon il se retrouve en fin de chaine) en fonction de l'entrée (supprimer, delete, inser, les copier-coller, etc.).
Private Sub TextBox1_Change()
Dim o&
o = Len(Me.TextBox1.text) - Len(TxtInit)
If o < 0 Then o = 0
Select Case key
Case 8
If pos > 0 Then
If selen = 1 Then Me.TextBox1.SelStart = pos - 1 Else Me.TextBox1.SelStart = pos
Else
pos = 0
End If
Case 13
If selen <= 1 Then Me.TextBox1.SelStart = pos + 1 Else Me.TextBox1.SelStart = pos
Case 46
Me.TextBox1.SelStart = pos
Case Else
Me.TextBox1.SelStart = pos + o
End Select
End Sub
La seule situation qui n'est pas traitée pour le moment, c'est dans le cas où une chaine est sélectionnée, et qu'on appuie sur tab ou entrée.
Corrigée.
Bonne journée !