Удаление дат в текстовых строках

У Карана много текстовых данных в книге. Некоторые из этих текстовых данных содержат даты. Ей нужен способ удалить любые даты, но оставить любой другой текст, который может быть в ячейке. Например, то, что начинается как «15.04.16, тест прошел успешно» или «Тест запущен 15.04.16», после удаления будет выглядеть как «Тест выполнен успешно» и «Тест запущен».

Если ваши даты всегда следуют простому шаблону, вы можете использовать функцию ЗАМЕНА, чтобы удалить их. Например, если дата всегда состоит из месяца с одной цифрой и дня с двумя цифрами, вы можете использовать следующее, чтобы удалить ее:

= SUBSTITUTE (A1, MID (A1, SEARCH ( «?/??/??», A1), 7),)

С такой формулой возникает несколько проблем. Во-первых, он возвращает значение ошибки, если в ячейке A1 нет даты или если дата в ячейке A1 состоит только из однозначного числа. Кроме того, если в дате есть месяц из двух цифр, первая цифра остается неизменной (при условии, что в дате используется день из двух цифр) или возвращается значение ошибки (если в дате используется день из одной цифры).

Если ваша дата появляется в начале или в конце текста в ячейке, вы можете использовать другой тип формулы:

= ЕСЛИОШИБКА (ЕСЛИ (ЗНАЧЕНИЕ (ЛЕВЫЙ (A1, 1))> 0, RIGHT (A1, LEN (A1) — 7), «»), LEFT (A1, FIND («/», A1) — 2))

Проблема с этот подход заключается в том, что он также требует точного шаблона M/DD/YY или MM/D/YY. Таким образом, он вызывает те же проблемы, что и предыдущая формула.

Более универсальный подход – использовать макрос для поиска даты и затем удалять ее из строки. Следующий пример макроса смотрит на содержимое ячейки и разбивает его на «слова» с помощью функции Split. Затем он начинает объединять слова вместе, если слово не является датой.

Функция RemoveDates (ByVal vC As String) Dim arr As Variant Dim s As String Dim i As Integer RemoveDates = «» If vC> «» Тогда arr = Split (vC, «») For i = LBound (arr) To UBound (arr) If Not IsDate (arr (i)) Then s = s & arr (i) & «» End If Next i RemoveDates = Left (s, Len (s) — 1) Конец функции IfEnd

Вы используете макрос в качестве определяемой пользователем функции на своем листе следующим образом:

= RemoveDates (A1)

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

Function RemoveDates (MyRange As Range) As String Dim sRaw As String Dim sPattern As String Dim regEx As New RegExp sRaw = MyRange.Value sPattern = «[0-9] {1,2} [-. /] [0-9] {1,2} [-. /] [0- 9] {2} «С regEx .Global = True .MultiLine = True .IgnoreCase = False .pattern = sPattern End With If regEx.Test (sRaw) Then RemoveDates = regEx. Replace (sRaw, «») Else RemoveDates = «Not matched» End If Set regEx = NothingEnd Function

Эта функция используется на вашем листе так же, как и ранее определенная пользователем функция:

= RemoveDates (A1)

Использование регулярных выражений может показаться некоторым черным искусством, но это конкретное использование довольно прямолинейно. В шаблоне (хранящемся в переменной sPattern) говорится, что одна или две цифры, за которыми следует символ разделителя (тире, точка, обратная косая черта или косая черта), за которыми следуют еще одна или две цифры, за которыми следует другой символ разделителя, за которым следуют две цифры, считаются Дата. Если такое совпадение обнаружено в ячейке, оно удаляется.

Чтобы использовать обычный подход espressions, вам необходимо убедиться, что вы включили ссылку на следующую библиотеку в Редактор Visual Basic (выберите «Ссылки» в меню «Инструменты»):

Microsoft VBScript Regular Expressions 5.5

Также обратите внимание, что функция возвращает «Not matched» если дата не была указана в ячейке, на которую вы ссылаетесь.

Источник: frestage.ru

Бытовой вопрос