Извлечение узора из текста

У Тома есть рабочий лист, содержащий около 20 000 ячеек, заполненных текстовыми данными. Изнутри этих ячеек ему нужно извлечь определенный образец текста. Шаблон выглядит следующим образом: ## – #####, где каждый # – это цифра. Этот шаблон не появляется в определенном месте в каждой ячейке. Том задается вопросом, есть ли способ извлечь нужную информацию.

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

= MID (A1, FIND («-«, A1) -2,8)

Эта команда находит тире, а затем захватывает восемь символов, начиная с двух символов слева от тире. Очевидно, это не сработает, если в других местах текста есть тире или если возможно наличие «шаблонов», которые включают нецифровые символы (например, 12-34B32), и вы хотите, чтобы они были исключены. В этом случае вам понадобится гораздо более сложная формула:

= IF (ISERROR (INT (MID (A1, FIND («-«, A1, 1) -2, 2)) & INT (MID (A1, FIND («-«, A1, 1) +1, 5))), «», MID (A1, FIND («-«, A1) -2, 8))

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

Единственное, чего не делают эти шаблонные подходы, – это обработка тех ситуаций, когда в одной ячейке может быть несколько вхождений шаблона. В этом случае лучше всего подходит макрос. Следующее будет извлекать действительные шаблоны и помещать их в новый рабочий лист под названием «Результаты».

Sub ExtractPattern () При возникновении ошибки Возобновить Далее Установить SourceSheet = ActiveSheet Установить TargetSheet = ActiveWorkbook.Sheets («Результаты» ) Если Err = 0, то рабочие листы («Результаты»). Удалить Конец, если рабочие листы. Добавить ActiveSheet.Name = «Результаты» Установить TargetSheet = ActiveSheet Cells (1, 1) .Value = «Найденные коды» Ячейки (1, 1). Font.Bold = True iTargetRow = 2 SourceSheet.Select Selection.SpecialCells (xlCellTypeLastCell) .Select Range (Selection, Cells (1)). Select For Each c In Selection.Cells If c.Value Like «* ## — ### ## * «Then sRaw = c.Value iPos = InStr (sRaw,» — «) Do While iPos> 0 Если iPos

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

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

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