Доступ к VBA удаляет CR & LF только из начала текстовой строки путем их поиска - PullRequest
2 голосов
/ 28 марта 2010

Мне нужно удалить разрывы строк в начале записи типа памятки. Я не хочу использовать функцию замены, поскольку она удалит все разрывы строк из записи, что нежелательно. Это только разрывы строк в начале поля, которое я хочу удалить.

Более того, мои записи не всегда начинаются с разрыва строки, поэтому я не могу по-настоящему использовать позиционирование текста, решение состоит в том, чтобы искать разрыв строки в начале, а не ожидать его в начале.

Ответы [ 8 ]

4 голосов
/ 06 апреля 2011
If Len(string) > 0 Then
   Do While Left(string,1)= chr(13) Or Left(string,1)= chr(10) or Left(string,1) = " "
     string = Right(string, len(string)-1)
   Loop
End If

Это проверит, чтобы убедиться, что строка не пустая, затем запустит простой цикл для удаления крайнего левого символа, если это либо CR (chr (13)), LF (chr (10)) или пробел ("").

Как только цикл достигает первого символа, который не соответствует критериям, он останавливается, и у вас есть желаемый результат обрезки всех дополнительных символов CR, LF и пробела только с начала строки.

Поскольку оно относительно короткое, я просто помещаю его в процедуру обработки событий, где это необходимо, вы также можете изменить его, чтобы оно было публичной функцией в модуле, если вы считаете нужным.

3 голосов
/ 10 мая 2010

Замена не заменяет все случаи, когда вы используете аргумент count: http://office.microsoft.com/en-us/access/HA012288981033.aspx

Вы можете проверить это так:

s1 = vbCrLf & "abc"
s2 = "ab" & vbCrLf & "c"

MsgBox "---" & IIf(Left(s1, 2) = vbCrLf, Replace(s1, vbCrLf, "", , 1), s1)
MsgBox "---" & IIf(Left(s2, 2) = vbCrLf, Replace(s2, vbCrLf, "", , 1), s2)
1 голос
/ 14 сентября 2011

Рассмотрим оператор SQL UPDATE, чтобы отбрасывать только те CRLF в начале каждого памятного поля.

UPDATE MyTable SET MyTable.memo_field = Mid([memo_field],3)
WHERE (((MyTable.memo_field) Like Chr(13) & Chr(10) & "*"));
1 голос
/ 14 августа 2011

Улучшение того, что написал SBinVA

Следующий код не нуждается в операторе if, и его легко расширить до большего количества символов (пробел, табуляции и т. Д.).

(Предполагается также, что разрывы строк могут происходить из файла, который поступает из других систем, поэтому vbCr и vbLf используются отдельно, что учитывает все сценарии.)

Public Function trimCrOrLf(ByVal s As String) As String
  Dim firstChar As String

  firstChar = Left(s, 1)
  Do While InStr(vbCr & vbLf, firstChar) > 0
    s = Mid(s, 2)
    firstChar = Left(s, 1)
  Loop
  trimCrOrLf = s
End Function
0 голосов
/ 24 ноября 2016

Это обрезает все начальные и завершающие пробелы, возврат каретки, вкладки и другие непечатаемые символы.

Public Function TrimSpecial(InputString As Variant) As String
' This will trim leading/trailing spaces and non-printable characters from the passed string.

    Dim i As Integer
    Dim str As String

    On Error GoTo ErrorHandler

    str = InputString

    For i = 1 To Len(str)
        If Asc(Mid(str, i, 1)) > 32 And Asc(Mid(str, i, 1)) < 127 Then
            ' Valid character found.  Truncate leading characters before this.
            str = Mid(str, i)
            Exit For
        End If
    Next i

    For i = Len(str) To 1 Step -1
        If Asc(Mid(str, i, 1)) > 32 And Asc(Mid(str, i, 1)) < 127 Then
            ' Valid character found.  Truncate trailing characters after this.
            str = Mid(str, 1, i)
            Exit For
        End If
    Next i

    TrimSpecial = str

Exit_Function:
    Exit Function

ErrorHandler:
    MsgBox "Error #" & Err.Number & " - " & Err.Description & vbCrLf & "in procedure TrimSpecial"
    GoTo Exit_Function
    Resume Next
    Resume

End Function

Вы можете использовать эту процедуру для проверки:

Public Sub Test_TrimSpecial()
    ' Run this to test the TrimSpecial function.
    Dim x As String

    x = vbCrLf & " " & vbTab & " ab cd" & vbCrLf & vbTab & " xyz " & vbCr & vbCrLf
    Debug.Print "-----"
    Debug.Print ">" & x & "<"
    Debug.Print "-----"
    Debug.Print ">" & TrimSpecial(x) & "<"
    Debug.Print "-----"
End Sub 
0 голосов
/ 02 июля 2015

Мой вклад в функцию VBA trimwhitespace (), цикл находит сначала индекс без пробелов, разбивает строку, а затем то же самое для конечных пробелов. Функции Left + Right запускаются только один раз. Если вам нужен просто leftTrim или rightTrim, легко ввести новые аргументы или отдельные функции.

Function trimWhitespace(str As String) As String
    Dim idx As Long
    Dim ch As String
    ' LeftTrim
    If Len(str) > 0 Then
        idx = 1
        ch = Mid(str, idx, 1)
        Do While ch = Chr(13) Or ch = Chr(10) Or ch = " "
            idx = idx + 1
            ch = Mid(str, idx, 1)
        Loop
        If (idx > 1) Then str = Right(str, Len(str) - idx)
    End If
    ' RightTrim
    idx = Len(str)
    If idx > 0 Then
        ch = Mid(str, idx, 1)
        Do While ch = Chr(13) Or ch = Chr(10) Or ch = " "
            idx = idx - 1
            ch = Mid(str, idx, 1)
        Loop
        If (idx < Len(str)) Then str = Left(str, idx)
    End If

    trimWhitespace = str
End Function
0 голосов
/ 11 мая 2010

Я бы использовал такую ​​функцию. Это довольно просто и легко адаптируется к другим обстоятельствам. Например, чтобы удалить начальные пробелы, добавьте еще один тест в строку if (c = vbCr).

Function LTrimCRLF(s As String) As String
  Dim index As Integer, start As Integer, strLen As Integer
  Dim c As String

  strLen = Len(s)
  index = 1
  start = -1

  Do While (index <= strLen) And (start = -1)
    c = Mid(s, index, 1)

    If (c = vbCr) Or (c = vbLf) Then
      index = index + 1
    Else
      start = index
    End If
  Loop

  If start = -1 Then
    LTrimCRLF = ""
  Else
    LTrimCRLF = Mid(s, start)
  End If
End Function

Вот тестовая процедура:

Sub TestLTrimCRLF()
  Dim withWS As String, noWS As String, blank As String, onlyWS As String

  withWS = vbCrLf & "  this string has leading white space"
  noWS = "this string has no leading white space"
  onlyWS = vbCrLf & " " & vbCrLf & " "
  blank = ""

  Say "with WS: {" & LTrimCRLF(withWS) & "}"
  Say "no WS:   {" & LTrimCRLF(noWS) & "}"
  Say "only WS: {" & LTrimCRLF(onlyWS) & "}"
  Say "blank:   {" & LTrimCRLF(blank) & "}"
End Sub

Кстати, я попытался просмотреть ваши образцы данных, но там говорится, что документ недоступен. Может быть, вам нужно обнародовать это или что-то?

0 голосов
/ 10 мая 2010
Private Sub TestLineFeed()
Dim strString$, strTestChar, booStartsWith_CR As Boolean

strString = Chr$(13) & "some text"

strTestChar = "2"
'strTestChar = Chr$(13)   ''This is a CR.  

booStartsWith_CR = (Left(strString, 1) = strTestChar)

Debug.Print "-----"
Debug.Print "Raw: " & strString
Debug.Print booStartsWith_CR

If booStartsWith_CR Then
    strString = Mid(strString, 2, 100)
End If

Debug.Print "-----"
Debug.Print "New: " & strString
End Sub

Обратите внимание на альтернативы для strTestChar, чтобы вы могли видеть действие. Вы должны заметить, что в вашем «Немедленном окне» «-----» следует CR, то есть пустая строка; и это можно убрать. Mid (strString, 2, 100) потребуется немного подправить, но идея в том, чтобы скопировать строку напоминания без первого символа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...