如何删除字符串中的换行符

时间:2012-04-05 07:34:17

标签: vba excel-vba excel

如果我的字符串以换行符结束,我想从字符串中删除换行符。

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

15 个答案:

答案 0 :(得分:55)

str = Replace(str, vbLf, "")

此代码从代码

中取出所有换行符

如果你只想要最后一个:

If Right(str, 1) = vbLf Then str = Left(str, Len(str) - 1)

是你尝试OK的方式。


更新

换行符= ASCII 10 换页符= ASCII 12 回车符= ASCII 13 。在这里,我们清楚地看到了我们都知道的:PC来自(电动)打字机

vbLf Chr(10),表示光标向下跳一行(打字机:转动滚轮) vbCr Chr(13)表示光标跳到开头(打字机:拉回滚动)

DOS 中,换行符始终为 VBCrLf或Chr(13)&amp; Chr(10),无论如何都在文件中,但是还有VB中的文本框。

另一方面,在 Excel单元格中,换行符仅为 VBLf ,即使没有vbCr,第二行也会从第一个位置开始。 使用vbCrLf然后更深入一个单元格

所以它取决于你从哪里读取并从中获取字符串。 如果你想在你的tring中删除所有的vbLf(Char(10))和vbCr(Char(13)),你可以这样做:

strText = Replace(Replace(strText, Chr(10), ""), Chr(13), "")

如果你只想删除最后一个,你可以测试这样做:

If Right(str, 1) = vbLf or Right(str, 1) = vbCr Then str = Left(str, Len(str) - 1)

答案 1 :(得分:24)

vbCrLfvbNewLine实际上是两个字符长,要更改为Right$(myString, 2)

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

答案 2 :(得分:6)

当您使用Excel时,您不需要VBA来实现此目的,您只需使用内置的“Clean()”函数,这将删除回车符,换行符等,例如:

=Clean(MyString)

答案 3 :(得分:4)

可以通过这种方式从VBA调用Clean函数:

Range("A1").Value = Application.WorksheetFunction.Clean(Range("A1"))

但是,正如写入here一样,CLEAN功能旨在从文本中删除7位ASCII代码(值0到31)中的前32个非打印字符。在Unicode字符集中,还有其他非打印字符(值127,129,141,143,144和157)。 CLEAN功能本身不会删除这些额外的非打印字符。

Rick Rothstein 编写代码来处理这种情况here这样:

Function CleanTrim(ByVal S As String, Optional ConvertNonBreakingSpace As Boolean = True) As String
  Dim X As Long, CodesToClean As Variant
  CodesToClean = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, _
                       21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 127, 129, 141, 143, 144, 157)
  If ConvertNonBreakingSpace Then S = Replace(S, Chr(160), " ")
  For X = LBound(CodesToClean) To UBound(CodesToClean)
    If InStr(S, Chr(CodesToClean(X))) Then S = Replace(S, Chr(CodesToClean(X)), "")
  Next
  CleanTrim = WorksheetFunction.Trim(S)
End Function

答案 4 :(得分:4)

就是这样:

str = Replace(str, vbCrLf, "")

答案 5 :(得分:3)

mystring = Replace(mystring, Chr(10), "")

答案 6 :(得分:1)

替换(yourString,vbNewLine,&#34;&#34; ,,, vbTextCompare)

答案 7 :(得分:1)

我知道这篇文章很老但我找不到任何能做到这一点的东西。所以我终于从所有的论坛中把它放在了一起。

这将从左侧和右侧删除所有换行符,并删除所有空行。然后修剪一切看起来不错。改变你认为合适的方式。如果有兴趣的话,我还会删除All Line Breaks。 TY

    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

答案 8 :(得分:1)

尝试以下行:

CleanString = Application.WorksheetFunction.Clean(MyString)

答案 9 :(得分:1)

没有其他答案(有一个例外,请参阅我的编辑)处理多个回车符的情况。如果目标是使一个类似于“ Trim”的函数删除回车符和空格,那么您可能希望它足够健壮以删除尽可能多的字符,而不仅仅是一个。另外,我建议避免在VBA中使用“左”或“右”功能,因为它们在VB.Net中不存在。在某些时候可能需要将Office VBA宏转换为VSTO COM加载项,因此避免使用仅在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

编辑:我要澄清的是,这里列出了另一个答案,可以修剪字符串两端的回车符和空格,但是看起来却更加复杂。这可以相当简洁地完成。

答案 10 :(得分:0)

Private Sub Form_Load()
    Dim s As String

    s = "test" & vbCrLf & "this" & vbCrLf & vbCrLf
    Debug.Print (s & Len(s))

    s = Left(s, Len(s) - Len(vbCrLf))
    Debug.Print (s & Len(s))
End Sub

答案 11 :(得分:0)

没有人提出过RegExp解决方案。所以这是一个:

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

它捕获并返回所有内容,直到文本末尾的单个({1})尾随新行(\n)或回车符和新行(\r\n)为止($)。
要删除所有尾随的换行符,请将{1}更改为*
要删除所有结尾的空格(包括换行符),请使用oRE.Pattern = "(.*?)\s*$"

答案 12 :(得分:0)

我希望这能做到。或者,可以直接问我

  
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

答案 13 :(得分:-1)

如果有人来找并找到这个旧帖子:

在寻找最后一个或第一个字符为newline / vbcrlf等时,请尝试:

trim(string)从前后移除
rtrim(string)从末尾删除 ltrim(string)从前面删除

答案 14 :(得分:-1)

我遇到了完全相同的问题。我做了一个单独的函数,可以在需要时轻松调用:

df[['ColA', 'ColB']].stack() \
    .reset_index(level=1) \
    .reindex(df.index) \
    .ffill() \
    .set_index('level_1', append=True) \
    .unstack() \
    .droplevel(0, axis=1)

我发现我只需要检查最后一个字符并执行-2即可删除换行符。我还发现检查vbLf是检测换行的唯一方法。该函数可以这样调用:

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