Используйте VBA для удаления начальных и конечных пробелов, но сохраняя пробелы в строке - PullRequest
0 голосов
/ 22 июня 2019

Я пытаюсь очистить и отформатировать некоторый набор данных, полученных из системы учета, и мне удалось создать код VBA для использования функций TRIM или CLEAN в определенных диапазонах столбцов.

Дело в том, что мне нужно сохранить пробелы в строках (может быть 2, 3 или более пробелов), но при этом удалить пробелы в начале / конце, а упомянутые функции уменьшают внутренние пробелы до 1. Это не работает для меня, так как данные используются в качестве ключа для сопоставления другой информации на дальнейших этапах процесса. Имейте в виду, что начальные / конечные пробелы могут быть результатом нажатия клавиши пробела, любого другого символа, который отображается как пробел или даже содержит разрывы строк, поэтому снова я хочу удалить все эти, кроме внутренних пробелов. Строки могут состоять из буквенно-цифровых символов.

Я использую это в Private Sub (код выполняется с помощью нажатия на кнопку, размещенную на листе).

Dim rng1a As Range
Dim Area1a As Range
Set rng1a = Range("F2:F35001")

  For Each Area1a In rng1a.Areas
    Area1a.NumberFormat = "@"
    Area1a.Value = Evaluate("IF(ROW(" & Area1a.Address & "),CLEAN(TRIM(" & Area1a.Address & ")))")
  Next Area1a

Пример (в диапазоне F2: F35001):

Original:  Sample  Text   for Review.     *(there are blanks after the string)
Result:Sample Text for Review.
Desired:Sample  Text   for Review.

Я провел некоторое исследование в течение нескольких недель и не смог найти решение, которое оставит внутренние пробелы «как есть» и позволит избежать как можно большего количества дублирующих вопросов на форуме. Заранее спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 23 июня 2019

Вы можете сделать это с помощью регулярных выражений:

Option Explicit
Function trimWhiteSpace(s As String) As String
    Dim RE As Object

Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = True
    .MultiLine = True
    .Pattern = "^\s*(\S.*\S)\s*"
    trimWhiteSpace = .Replace(s, "$1")
End With
End Function

Объяснение регулярного выражения

Обрезать начальные и конечные пробелы

^\s*(\S.*\S)\s*

Опции: чувствительны к регистру;^ $ совпадение при разрыве строки

$ 1

Создано с помощью RegexBuddy

С другой стороны, если вы хотите избежать регулярных выражений и если ваши единственные начальные / конечные символы пробела - space, tab иlinefeed, И , если единственными "внутренними" символами пробела являются space, вы можете использовать:

Function trimWhiteSpace(s As String) As String
    trimWhiteSpace = Trim(Replace(Replace([a1], vbLf, ""), vbTab, ""))
End Function

Обратите внимание, что VBAФункция обрезки (в отличие от функции рабочего листа) удаляет только начальные и конечные пробелы и оставляет внутренние пробелы без изменений.Но это не сработает, если в строке есть tab, которые необходимо сохранить.

Любой из вышеперечисленных может быть включен в ваш макрос.

1 голос
/ 22 июня 2019

Вы пытались использовать функцию LTRIM для удаления начальных пробелов, а затем RTRIM для удаления завершающих, которые оставят внутренние нетронутыми?

Из вашего описания вы не ожидаете, что символы TAB или возврат каретки в середине ваших строк, так что вы можете просто заменить их:

strSource = Replace(strSource, vbTab, "")
strSource = Replace(strSource, vbCrLf, " ")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...