Извлечение шаблона из текста (Microsoft Excel)
У Тома есть рабочий лист, содержащий около 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 [Извлечение шаблона из текста]
.