Оглавление
В этом уроке вы узнаете, как отделить текст от чисел в Excel с помощью собственных формул и пользовательских функций. Вы также узнаете, как разделить текст и числа на два отдельных столбца.
Представьте себе следующее: вы получаете необработанные данные для анализа и обнаруживаете, что в одной колонке цифры перемешаны с текстом. В большинстве ситуаций, конечно, будет удобнее расположить их в отдельных колонках для более тщательного изучения.
Если вы работаете с однородными данными, вы, вероятно, могли бы использовать функции LEFT, RIGHT и MID для извлечения одинакового количества символов из одной и той же позиции. Но это идеальный сценарий для лабораторных исследований. В реальной жизни вы, скорее всего, будете иметь дело с разнородными данными, где числа идут перед текстом, после текста или между текстом. Приведенные ниже примеры предлагают решения именно для таких случаевдело.
Как удалить текст и сохранить числа в ячейках Excel
Решение работает в Excel 365, Excel 2021 и Excel 2019.
В Microsoft Excel 2019 появилось несколько новых функций, недоступных в предыдущих версиях, и мы будем использовать одну из таких функций, а именно TEXTJOIN, для удаления текстовых символов из ячейки, содержащей числа.
Общая формула такова:
TEXTJOIN("", TRUE, IFERROR(MID( ячейка , ROW(INDIRECT("1:"&LEN( ячейка ))), 1) *1, ""))В Excel 365 и 2021 этот вариант также будет работать:
TEXTJOIN("", TRUE, IFERROR(MID( ячейка , SEQUENCE(LEN( ячейка )), 1) *1, ""))На первый взгляд, формулы могут показаться немного пугающими, но они действительно работают :)
Например, чтобы удалить текст из чисел в A2, введите одну из приведенных ниже формул в B2, а затем скопируйте ее вниз в необходимое количество ячеек.
В Excel 365 - 2019:
=TEXTJOIN("", TRUE, IFERROR(MID(A2, ROW(INDIRECT("1:"&LEN(A2))), 1) *1, "")))
В Excel 2019 его нужно вводить как формулу массива с помощью Ctrl + Shift + Enter. В динамическом массиве Excel он работает как обычная формула, завершенная клавишей Enter.
В Excel 365 и 2021:
=TEXTJOIN("", TRUE, IFERROR(MID(A2, SEQUENCE(LEN(A2)), 1) *1, "")))
В результате из ячейки удаляются все текстовые символы, а цифры остаются:
Как работает эта формула:
Чтобы лучше понять логику, давайте начнем исследовать формулу изнутри:
Вы используете либо ROW(INDIRECT("1:"&LEN(string))), либо SEQUENCE(LEN(string)) для создания последовательности чисел, соответствующей общему количеству символов в исходной строке, а затем передаете эти последовательные числа в функцию MID в качестве начальных чисел. В B2 эта часть формулы выглядит следующим образом:
MID(A2, {1;2;3;4;5;6;7;8;9;10;11;12;13;14;15}, 1)
Функция MID извлекает каждый символ из A2, начиная с самого первого, и возвращает их в виде массива:
{"2";"1";"0";" ";"S";"u";"n";"s";"e";"t";" ";"R";"o";"a";"d"}
Этот массив умножается на 1. Числовые значения остаются без изменений, а умножение нечислового символа приводит к ошибке #VALUE!
{2;1;0;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!}
Функция IFERROR обрабатывает эти ошибки и заменяет их пустыми строками:
{2;1;0;"";"";"";"";"";"";"";"";"";"";"";""}
Этот конечный массив передается функции TEXTJOIN, которая объединяет непустые значения в массиве ( ignore_empty аргумент установлен в TRUE), используя пустую строку ("") в качестве разделителя:
TEXTJOIN("", TRUE, {2;1;0;"";"";"";"";"";"";"";"";"";"";"";""})
Совет. Для Excel 2016 - 2007 также существует решение, но формула намного сложнее. Вы можете найти его в этом учебнике: Как извлечь числа в Excel.
Пользовательская функция для удаления текста из чисел
Решение работает для всех версий Excel
Если вы используете старую версию Excel или считаете приведенные выше формулы слишком сложными для запоминания, ничто не мешает вам создать собственную функцию с более простым синтаксисом и удобным названием, например RemoveText Функция, определяемая пользователем (UDF), может быть записана двумя способами:
Код VBA 1:
Здесь мы рассматриваем каждый символ исходной строки по очереди и проверяем, является ли он числовым или нет. Если числовым, то символ добавляется к результирующей строке.
Function RemoveText(str As String ) Dim sRes As String sRes = "" For i = 1 To Len(str) If True = IsNumeric(Mid(str, i, 1)) Then sRes = sRes & Mid(str, i, 1) End If Next i RemoveText = sRes End FunctionКод VBA 2:
Код создает объект для обработки регулярного выражения. Используя RegExp, мы удаляем из исходной строки все символы, кроме цифр 0-9.
Function RemoveText(str As String ) As String With CreateObject ("VBScript.RegExp" ) .Global = True .Pattern = "[^0-9]" RemoveText = .Replace(str, "" ) End With End FunctionНа небольших рабочих листах оба кода будут работать одинаково хорошо. На больших рабочих листах, где функция вызывается сотни или тысячи раз, код 2, использующий VBScript.RegExp, будет работать быстрее.
Подробные шаги по вставке кода в рабочую книгу можно найти здесь: Как вставить код VBA в Excel.
Какой бы подход вы ни выбрали, с точки зрения конечного пользователя функция удаления текста и оставления цифр проста:
RemoveText(string)Например, чтобы удалить нечисловые символы из ячейки A2, формула в B2 имеет вид:
=RemoveText(A2)
Просто скопируйте его в столбец, и вы получите такой результат:
Примечание. Как собственные формулы, так и пользовательская функция выводят a числовая строка Чтобы превратить его в число, умножьте результат на 1, или добавьте ноль, или оберните формулу в функцию VALUE. Например:
=УдалитьТекст(A2) + 0
=VALUE(RemoveText(A2))
Как удалить числа из текстовой строки в Excel
Решение работает в Excel 365, Excel 2021 и Excel 2019.
Формулы для удаления цифр из буквенно-цифровой строки во многом схожи с теми, что рассматривались в предыдущем примере.
Для Excel 365 - 2019:
TEXTJOIN("", TRUE, IF(ISERR(MID( ячейка , ROW(INDIRECT("1:"&LEN( ячейка ) )), 1) *1), MID( ячейка , ROW(INDIRECT("1:"&LEN( ячейка ))), 1), ""))В Excel 2019 не забудьте сделать его формула массива нажав вместе клавиши Ctrl + Shift + Enter.
Для Excel 365 и 2021:
TEXTJOIN("", TRUE, IF(ISERROR(MID( ячейка , SEQUENCE(LEN( ячейка 1) *1), MID( ячейка , SEQUENCE(LEN( ячейка )), 1), ""))Например, чтобы удалить цифры из строки в A2, используется следующая формула:
=TEXTJOIN("", TRUE, IF(ISERR(MID(A2, ROW(INDIRECT("1:"&LEN(A2) )), 1) *1), MID(A2, ROW(INDIRECT("1:"&LEN(A2))), 1), ""))))
Или
=TEXTJOIN("", TRUE, IF(ISERROR(MID(A2, SEQUENCE(LEN(A2)), 1) *1), MID(A2, SEQUENCE(LEN(A2)), 1), "")))
В результате из ячейки удаляются все цифры, а текстовые символы остаются:
Как показано на скриншоте выше, формула удаляет числовые символы из любой позиции в строке: в начале, в конце и в середине. Однако есть оговорка: если строка начинается с цифры, за которой следует пробел то пробел сохраняется, что создает проблему ведущих пробелов (как в B2).
Чтобы избавиться от лишнего пробелы перед текстом , оберните формулу в функцию TRIM следующим образом:
=TRIM(TEXTJOIN("", TRUE, IF(ISERROR(MID(A2, SEQUENCE(LEN(A2)), 1) *1), MID(A2, SEQUENCE(LEN(A2)), 1), ""))))
Теперь ваши результаты абсолютно идеальны!
Как работает эта формула:
По сути, формула работает так же, как и в предыдущем примере. Разница в том, что из конечного массива, подаваемого в функцию TEXTJOIN, нужно удалить числа, а не текст. Чтобы это сделать, используем комбинацию функций IF и ISERROR.
Как вы помните, MID(...)+0 генерирует массив чисел и ошибок #VALUE!, представляющих текстовые символы в тех же позициях:
{2;1;0;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!}
Функция ISERROR отлавливает ошибки и передает полученный массив булевых значений в IF:
{FALSE;FALSE;FALSE;FALSE;TRUE;TRUE;TRUE;TRUE;TRUE;TRUE;TRUE;TRUE;TRUE;TRUE;TRUE;TRUE;TRUE;TRUE}
Когда функция IF видит TRUE (ошибку), она вставляет соответствующий текстовый символ в обрабатываемый массив с помощью другой функции MID. Когда функция IF видит FALSE (число), она заменяет его пустой строкой:
{ "S"; "u"; "n"; "s"; "e"; "t"; "R"; "o"; "a"; "d"}
Этот окончательный массив передается в TEXTJOIN, где происходит конкатенация текстовых символов и вывод результата.
Пользовательская функция для удаления цифр из текста
Решение работает для всех версий Excel
Помня о том, что надежная формула должна быть простой, я поделюсь кодом определяемой пользователем функции (UDF) для удаления любого числового символа.
Код VBA 1:
Function RemoveNumbers(str As String ) Dim sRes As String sRes = "" For i = 1 To Len(str) If False = IsNumeric(Mid(str, i, 1)) Then sRes = sRes & Mid(str, i, 1) End If Next i RemoveNumbers = sRes End FunctionКод VBA 2:
Function RemoveNumbers(str As String ) As String With CreateObject ("VBScript.RegExp" ) .Global = True .Pattern = "[0-9]" RemoveNumbers2 = .Replace(str, "") End With End FunctionКак и в случае с функцией RemoveText, второй код лучше использовать в больших рабочих листах для оптимизации производительности.
После добавления кода в рабочую книгу вы можете удалить все числовые символы из ячейки с помощью этой пользовательской функции:
RemoveNumbers(string)В нашем случае формула в B2 имеет вид:
=RemoveNumbers(A2)
Чтобы обрезать пробелы, если таковые имеются, вложите пользовательскую функцию в TRIM, как в обычную формулу:
=TRIM(RemoveNumbers(A2))
Разделите числа и текст на отдельные колонки
В ситуации, когда вы хотите разделить текст и числа на две колонки, было бы неплохо выполнить эту работу с помощью одной формулы, согласны? Для этого мы просто объединим код формулы RemoveText и RemoveNumbers функции в одну функцию, названную SplitTextNumbers или просто Сплит , или как вам больше нравится :)
Код VBA 1:
Function SplitTextNumbers(str As String , is_remove_text As Boolean ) As String Dim sNum, sText, sChar As String sCurChar = sNum = sText = "" For i = 1 To Len(str) sCurChar = Mid(str, i, 1) If True = IsNumeric(sCurChar) Then sNum = sNum & sCurChar Else sText = sText & sCurChar End If Next i If True = is_remove_text Then SplitTextNumbers = sNum Else SplitTextNumbers = sText End If End endФункцияКод VBA 2:
Function SplitTextNumbers(str As String , is_remove_text As Boolean ) As String With CreateObject ("VBScript.RegExp" ) .Global = True If True = is_remove_text Then .Pattern = "[^0-9]" Else .Pattern = "[0-9]" End If SplitTextNumbers = .Replace(str, "") End With End FunctionНаша новая пользовательская функция требует два аргумента:
SplitTextNumbers(string, is_remove_text)Где is_remove_text булево значение, указывающее, какие символы следует отделить:
- TRUE или 1 - удалить текст и сохранить цифры
- FALSE или 0 - удалить цифры и сохранить текст
Для нашего набора данных формулы имеют следующий вид:
Чтобы удалить нечисловые символы:
=SplitTextNumbers(A2, TRUE)
Чтобы удалить цифровые символы:
=SplitTextNumbers(A2, FALSE)
Совет. Чтобы избежать потенциальной проблемы ведущих пробелов, я рекомендую всегда оборачивать формулу, удаляющую числа, в функцию TRIM:
=TRIM(SplitTextNumbers(A2, FALSE))
Специальный инструмент для удаления цифр или текста
Для тех, кто не любит излишнего усложнения, я покажу собственный способ удаления текста или чисел в Excel.
Предположим, что наш пакет Ultimate Suite добавлен на ленту Excel, вот что вы делаете:
- На Ablebits Data во вкладке Текст группу, нажмите Удалить > Удалить символы .
Совет. Если в результатах есть пробелы, инструмент "Обрезать пробелы" быстро их устранит.
Вот как удалить текстовые или числовые символы из строки в Excel. Я благодарю вас за чтение и жду вас на нашем блоге на следующей неделе!
Доступные загрузки
Удаление текста или чисел в Excel - примеры (файл.xlsm)
Ultimate Suite - пробная версия (файл .exe)