programing

문자열에서 줄 바꿈을 제거하는 방법

goodsources 2023. 5. 1. 21:02
반응형

문자열에서 줄 바꿈을 제거하는 방법

문자열이 줄 바꿈으로 끝나는 경우 문자열에서 줄 바꿈을 제거합니다.

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

요약

str = Replace(str, vbLf, "")

이 코드는 코드에서 모든 줄 바꿈을 제거합니다.

마지막 하나만 꺼내면 됩니다.

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

당신이 OK를 시도한 방법입니다.


배경 정보

라인 피드 = ASCII, 폼 피드 = ASCII 캐리지 리턴 = ASCII. 여기서 PC는 (전기) 타자기에서 나온 것이라는 우리 모두가 알고 있는 것을 명확하게 알 수 있습니다.

vbLf이라Chr (10)커서가 한 줄 아래로 이동하는 것을 의미합니다(타자기: 롤러 회전).

vbCr이라Chr (13)커서가 처음으로 이동함을 의미합니다(타자기: 롤 뒤로 당김).

도스에서 줄 바꿈은 항상VBCrLf또는Chr (13) & Chr (10)VB의 텍스트 상자와 함께 파일에 저장됩니다.

반면에 Excel 셀에서 줄 바꿈은 단지VBLf그러면 두 번째 라인이 첫 번째 위치에서 시작됩니다.vbCr그러면 세포 하나를 더 깊게 만듭니다.

따라서 문자열을 읽고 가져오는 위치에 따라 다릅니다.모든 것을 제거하려면vbLf(Chr(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)

vbCrLf그리고.vbNewLine는 두 이므로 제로두 문자길므로로변이다경니합이실로변다▁to니▁are경합▁so로,로 변경합니다.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

다음 행을 사용해 보십시오.

CleanString = Application.WorksheetFunction.Clean(MyString)

Excel을 사용하는 경우 VBA가 필요하지 않으므로 기본 제공되는 "Clean()" 기능을 사용하면 캐리지 리턴, 라인 피드 등을 제거할 수 있습니다.

=Clean(MyString)

VBA에서 클린 기능을 호출할 수 있는 방법은 다음과 같습니다.

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

그러나 여기에 기록된 것처럼 CLEAN 기능은 7비트 ASCII 코드(값 0 ~ 31)에서 인쇄되지 않는 처음 32개 문자를 텍스트에서 제거하도록 설계되었습니다.유니코드 문자 집합에는 인쇄되지 않는 문자(값 127, 129, 141, 143, 144 및 157)가 추가로 있습니다.Clean 기능 자체로는 이러한 추가 비인쇄 문자를 제거하지 않습니다.

Rick Rothstein은 이러한 상황을 처리하기 위한 코드를 작성했습니다.

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

바로 이것:

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

바꾸기(사용자 문자열, vbNewLine, ", , , vbTextCompare)

저는 이 게시물이 매우 오래되었다는 것을 알지만, 저는 이것을 할 수 있는 어떤 것도 찾을 수 없었습니다.그래서 저는 마침내 모든 포럼에서 이것을 모았습니다.

이렇게 하면 왼쪽과 오른쪽에서 모든 줄 바꿈이 제거되고 빈 줄이 제거됩니다.그런 다음 보기 좋게 모두 다듬습니다.적합하다고 생각되는 대로 변경합니다.관심이 있다면 모든 줄 바꿈을 제거하는 것도 만들었습니다.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
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

여러 개의 후행 캐리지 리턴이 있는 경우 다른 답변(한 가지 예외를 제외하고 내 편집 참조)은 처리되지 않습니다.공간뿐만 아니라 캐리지 리턴을 제거하는 "트림"과 유사한 기능을 만드는 것이 목표라면, 하나만 제거하는 것이 아니라 최대한 많이 제거할 수 있을 정도로 견고하기를 원할 것입니다.또한 VBA에서 "왼쪽" 또는 "오른쪽" 기능은 VB에 없기 때문에 사용하지 않는 것이 좋습니다.Net. Office VBA 매크로를 VSTOCOM 추가 기능으로 변환해야 할 경우 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

편집: 여기에 캐리지 리턴과 문자열 양쪽 끝의 공백을 잘라내는 다른 답변이 나열되어 있지만, 훨씬 더 복잡해 보였습니다.이것은 꽤 간결하게 수행될 수 있습니다.

아무도 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*$".

이 정도면 좋겠군요. 안 그러면 직접 물어 볼 수도 있어요.

  
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

저도 똑같은 문제가 있었습니다.필요할 때 쉽게 부를 수 있는 별도의 기능을 만들었습니다.

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

마지막 문자만 확인하고 줄 바꿈을 제거하기 위해 -2를 해야 한다는 것을 알았습니다.또한 vblf를 확인하는 것이 줄 바꿈을 감지하는 유일한 방법이라는 것을 알게 되었습니다.함수는 다음과 같이 호출할 수 있습니다.

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

언급URL : https://stackoverflow.com/questions/10024402/how-to-remove-line-break-in-string

반응형