52 votes

Comment supprimer un saut de ligne dans une chaîne de caractères

Je veux supprimer le saut de ligne de la chaîne si ma chaîne se termine par un saut de ligne.

Sub linebreak(myString)
    If Len(myString) <> 0 Then
        If Right$(myString, 1) = vbCrLf Or Right$(myString, 1) = vbNewLine Then myString = Left$(myString, Len(myString) - 1)
    End If
End Sub

2 votes

vbCrLf y vbNewLine sont en fait constitués de deux caractères, ce qui signifie qu'ils doivent être remplacés par Right$(myString, 2)

1 votes

Niraj : Chris a tout à fait raison. @Chris : +1, veuillez l'afficher comme réponse :)

0voto

Nate Decker Points 11

Aucune des autres réponses (à une exception près, voir mon édition) ne traite le cas où il y a plusieurs retours à la ligne. Si l'objectif est de créer une fonction similaire à "Trim" qui supprime les retours à la ligne ainsi que les espaces, vous voudrez probablement qu'elle soit suffisamment robuste pour en supprimer autant qu'il y en a et pas seulement un. Je recommande également d'éviter d'utiliser les fonctions "Left" ou "Right" en VBA, car elles n'existent pas en VB.Net. Il peut être nécessaire à un moment donné de convertir une macro Office VBA en un complément COM VSTO ; c'est donc une bonne habitude d'éviter d'utiliser des fonctions qui n'existent que dans VBA.

Function RemoveTrailingWhiteSpace(s As String) As String
    RemoveTrailingWhiteSpace = s
    Dim StrLen As Long
    StrLen = Len(RemoveTrailingWhiteSpace)
    While (StrLen > 0 And (Mid(RemoveTrailingWhiteSpace, StrLen) = vbCr Or Mid(RemoveTrailingWhiteSpace, StrLen) = vbLf) Or Mid(RemoveTrailingWhiteSpace, StrLen) = " ")
        RemoveTrailingWhiteSpace = Mid(RemoveTrailingWhiteSpace, 1, StrLen - 1)
        StrLen = Len(RemoveTrailingWhiteSpace)
    Wend
End Function

Edit : Je dois préciser qu'il y a une autre réponse listée ici qui élimine les retours chariot et les espaces blancs des deux extrémités de la chaîne, mais elle semble beaucoup plus alambiquée. Cela peut être fait de manière assez concise.

0voto

Howd Points 11

Personne n'a jamais proposé de solution RegExp. En voici donc une :

Function TrimTrailingLineBreak(pText)
    Dim oRE: Set oRE = New RegExp: oRE.Global = True
    oRE.Pattern = "(.*?)(\n|(\r\n)){1}$"
    TrimTrailingLineBreak = oRE.Replace(pText, "$1")
End Function

Il capture et renvoie tout ce qui se trouve jusqu'à un seul ( {1} ) à la fin de la nouvelle ligne ( \n ), ou retour chariot et nouvelle ligne ( \r\n ), à la fin du texte ( $ )
Pour supprimer tous les sauts de ligne, modifiez {1} a * .
Et pour supprimer tous les espaces blancs de fin de ligne (y compris les sauts de ligne), utilisez oRE.Pattern = "(.*?)\s*$" .

0voto

Zhivenia Points 1

J'espère que cela suffira. Sinon, vous pouvez me poser la question directement.

Sub RemoveBlankLines()
    Application.ScreenUpdating = False
    Dim rngCel As Range
    Dim strOldVal As String
    Dim strNewVal As String

    For Each rngCel In Selection
        If rngCel.HasFormula = False Then
            strOldVal = rngCel.Value
            strNewVal = strOldVal
            Debug.Print rngCel.Address

            Do
            If Left(strNewVal, 1) = vbLf Then strNewVal = Right(strNewVal, Len(strNewVal) - 1)
            If strNewVal = strOldVal Then Exit Do
                strOldVal = strNewVal
            Loop

            Do
            If Right(strNewVal, 1) = vbLf Then strNewVal = Left(strNewVal, Len(strNewVal) - 1)
            If strNewVal = strOldVal Then Exit Do
                strOldVal = strNewVal
            Loop

            Do
            strNewVal = Replace(strNewVal, vbLf & vbLf, "^")
            strNewVal = Replace(strNewVal, Replace(String(Len(strNewVal) - _
                        Len(Replace(strNewVal, "^", "")), "^"), "^", "^"), "^")
            strNewVal = Replace(strNewVal, "^", vbLf)

            If strNewVal = strOldVal Then Exit Do
                strOldVal = strNewVal
            Loop

            If rngCel.Value <> strNewVal Then
                rngCel = strNewVal
            End If

        rngCel.Value = Application.Trim(rngCel.Value)
        End If
    Next rngCel
    Application.ScreenUpdating = True
End Sub

-1voto

technoman23 Points 101

J'ai eu exactement le même problème. J'ai créé une fonction distincte que je peux appeler facilement en cas de besoin :

Function removeLineBreakIfAtEnd(s As String) As String
    If Right(s, 1) = vbLf Then s = Left(s, Len(s) - 2)
    removeLineBreakIfAtEnd = s
End Function

J'ai découvert que je devais vérifier uniquement le dernier caractère et faire -2 pour supprimer le saut de ligne. J'ai également découvert que la vérification de vbLf était le SEUL moyen de détecter le saut de ligne. La fonction peut être appelée comme suit :

Sub MainSub()
    Dim myString As String
    myString = "Hello" & vbCrLf
    myString = removeLineBreakIfAtEnd(myString)
    MsgBox ("Here is the resulting string: '" & myString & "'")
End Sub

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X