[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 :)

11test-txtbox1.xlsm (24.42 Ko)

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 !

Rechercher des sujets similaires à "vba comportement etrange chaine vbtab vbcrlf"