У Тома есть рабочий лист, содержащий около 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()

On Error Resume Next     Set SourceSheet = ActiveSheet     Set TargetSheet = ActiveWorkbook.Sheets("Results")

If Err = 0 Then         Worksheets("Results").Delete     End If     Worksheets.Add     ActiveSheet.Name = "Results"

Set TargetSheet = ActiveSheet     Cells(1, 1).Value = "Found Codes"

Cells(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                 If iPos < 3 Then                     sRaw = "  " & sRaw                     iPos = iPos + 2                 End If                 sTemp = Mid(sRaw, iPos - 2, 8)

sRaw = Mid(sRaw, iPos + 6, Len(sRaw))

If sTemp Like "##-#####" Then                     TargetSheet.Cells(iTargetRow, 1) = sTemp                     iTargetRow = iTargetRow + 1                 Else                     sRaw = Mid(sTemp, 4, 5) & sRaw                 End If                 iPos = InStr(sRaw, "-")

Loop         End If     Next c End Sub

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

_Примечание: _

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

link: / excelribbon-ExcelTipsMacros [Щелкните здесь, чтобы открыть эту специальную страницу в новой вкладке браузера].

ExcelTips — ваш источник экономичного обучения Microsoft Excel.

Этот совет (7348) применим к Microsoft Excel 97, 2000, 2002 и 2003. Вы можете найти версию этого совета для ленточного интерфейса Excel (Excel 2007 и более поздних версий) здесь:

link: / excelribbon-Extracting_a_Pattern_from_within_Text [Извлечение шаблона из текста].