Удалить все кроме цифр в ячейке excel

Оставить в ячейке только числа (удалить весь текст)

Данная команда позволяет массово удалять из текст множества ячеек весь текст кроме чисел:

Оставить в ячейке только числа (удалить весь текст)

Чтобы воспользоваться данной командой выделите ячейки с текстом из которых вы хотите удалить текст и оставить числа, перейдите во вкладку «ЁXCEL» Главного меню, нажмите кнопку «Ячейки» и выберите команду «Оставить в ячейке только числа (удалить весь текст)»:

ostavit-v-yachejke-tolko-chisla-udalit-ves-tekst

В выделенных ячейках останутся только числа.

Для отмены операции нажмите кнопку отмены:

Добавить комментарий

Содержание

  1. Как очистить текст в Excel от лишних символов (двойные пробелы и т.д.)?
  2. Как оставить в ячейке Excel только числа, а весь текст удалить
  3. Способы удаления текста и сохранения числовой информации
  4. Первый метод: использование специальной формулы
  5. Второй метод: использование специального макроса
  6. Заключение и выводы о процедуре извлечение
  7. Как удалить буквы, цифры или лишние символы из текста
  8. Как удалить цифры из текста?
  9. Как удалить буквы из текста?
  10. Как удалить лишние символы?
  11. Как удалить только заданные символы?
  12. Выборочное удаление символов из ячеек Excel
  13. Удаление символов из выделенного текста документа Word
  14. Как в офисе.
  15. Как удалить цифры из текста?
  16. Как удалить буквы из текста?
  17. Как удалить лишние символы?
  18. Как удалить только заданные символы?
  19. Выборочное удаление символов из ячеек Excel
  20. Удаление символов из выделенного текста документа Word
  21. Другие материалы по теме:

Как очистить текст в Excel от лишних символов (двойные пробелы и т.д.)?

Лишние (они же ненужные) символы — очень растяжимое понятие. В понимании каждого человека и в каждой отдельной ситуации лишними символами могут быть большие множества символов.

  • Это могут быть, например, все символы, кроме кириллицы, латиницы и цифр (любая пунктуация)
  • лишние пробелы (повторяющиеся между словами и в конце/начале строк)
  • табуляция (невидимые пробелы)
  • неразрывные пробелы (они же non-breaking space)
  • переносы строк внутри ячейки
  • в каких-то ситуациях лишними могут быть определенные несколько символов в конце или начале ячейки
  • в каких-то пользователю таблиц не нужны никакие цифры и нужно оставить только текст. Или, наоборот, удалить все, кроме цифр (как в случае с номерами телефонов).
  • в случаях с email-ами, URL-ами, номерами телефонов в разных форматах — потребуются уже сложнейшие regex-паттерны для извлечения нужных и удаления ненужных символов.

Все очень зависит от того, какие данные содержатся в исходной таблице и каким должен выглядеть идеальный финальный результат.

В зависимости от каждой из этих опций, потребуются разные операции и формулы Excel.

В некоторых нельзя обойтись без сложного кода, написания UDF, использующих синтаксис регулярных выражений (Regexp) или готовых решений, как надстройка !SEMTools.

В соответствующем разделе — удалить лишние символы в ячейках Excel — рассмотрены все возможные ситуации и их решения, в том числе с помощью обычных функций и процедур Excel.

Источник

Как оставить в ячейке Excel только числа, а весь текст удалить

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

Способы удаления текста и сохранения числовой информации

Представим, что у нас есть такая информация, располагающаяся в ячейке: «Было доставлено кусков мыла 763шт». Нам необходимо сделать так, чтобы осталось только значение 763 для проведения разнообразных математических операций. Хорошо, если нужно избавиться от текстовых данных только в одной ячейке, тогда можно реализовать удаление ручным способом, но этот вариант не подходит, когда в табличке находится слишком много разной информации. Здесь необходимо применять различные специальные функции табличного редактора.

Первый метод: использование специальной формулы

Для реализации этой процедуры можно применять специальную массивную формулу. Примерная формула выглядит так:

Разберем основные моменты:

  1. Специальную формулу необходимо вбивать в поле при помощи комбинации кнопок «Ctrl+Shift+Enter».
  2. Стоит заметить, что в таком виде массивная формула может использоваться только с текстовой информацией, в которой число знаков не больше 99. Для увеличения диапазона нужно, к примеру, заменить параметр «СТРОКА($1:$99)» на «СТРОКА($1:$200)». Иными словами, мы вместо показателя 99 вводим число знаков с запасом. Если ввести слишком большой диапазон, то обработка формулы может занять длительное время.
  3. Если в текстовых данных числовые значения разбросаны по всему тексту, то формула не сможет правильно обработать информацию.

Детально рассмотрим специальную массивную формулу на таком примере: «Было доставлено кусков мыла 763шт., а заказывали 780»

  1. В поле А1 располагается сама текстовая информация, из которой мы будем извлекать числовые данные.
  2. Фрагмент: МИН(ЕСЛИ(ЕЧИСЛО(-ПСТР(А1;СТРОКА($1:$99);1));СТРОКА($1:$99))) позволяет определить позицию 1-го значения в поле. Получаем значение 29.
  3. Фрагмент: ПРОСМОТР(2;1/ЕЧИСЛО(-ПСТР(А1;СТРОКА($1:$99);1));СТРОКА($1:$99)) позволяет определить позицию последнего значения в поле. Получаем значение 31.
  4. Мы получаем такую формулу: =ПСТР(А1;29;31-29+1). Оператор ПСТР позволяет извлечь из текстовой информации, указанной 1-м аргументом, начиная с заданной позиции (29) с числом знаков, заданным 3-м аргументом.
  5. В результате мы получаем:
    =ПСТР(А1;29;31-29+1)
    • =ПСТР(А1;29;2+1)
    • =ПСТР(А1;29;3)
    • 763

Бывают ситуации обратные, когда нужно реализовать операцию извлечения односоставных текстовых данных, исключив числа.

Нам необходимо сохранить только текстовую информацию.

Специальная формула применяется по аналогичному алгоритму, что и вышерассмотренная. Она выглядит так: =ПСТР(А1;ПОИСК(«-«;А1)+1;ПОИСКПОЗ(ИСТИНА;ЕЧИСЛО(—ПСТР(ПСТР(А1;ПОИСК(«-«;А1)+1;999);СТРОКА($1:$99);1));0)-1)

Здесь мы, благодаря фрагменту ПОИСК(«-«;А1) отыскали локацию тире, а затем при помощи оператора ПОИСКПОЗ нашли в извлеченных текстовых данных позицию 1-го числа. Передали эти показатели в оператор ПСТР, который реализовал все дальнейшие преобразования.

Второй метод: использование специального макроса

Эту процедуру можно реализовать при помощи специального макроса, созданного в табличном редакторе Эксель. К примеру, у нас есть табличка, в которой существует колонка с текстовой информацией и числовыми данными. Нам нужно оставить только числовые данные, убрав при этом текст.

В табличном редакторе отсутствует интегрированная функция, поэтому нам необходимо создать такой пользовательский макрос:

Public Function GetNumbers(TargetCell As Range) As String

Dim LenStr As Long

For LenStr = 1 To Len(TargetCell)

Select Case Asc(Mid(TargetCell, LenStr, 1))

GetNumbers = GetNumbers & Mid(TargetCell, LenStr, 1)

Подробная инструкция по созданию пользовательского макроса выглядит так:

  1. Используя специальную комбинацию клавиш «Alt+F11», производим открытие редактора VBA. Альтернативный вариант – нажать ПКМ по рабочему листу и выбрать элемент «Исходный текст».
  2. Реализуем создание нового модуля. Для осуществления этой процедуры жмем левой клавишей мышки на элемент, имеющий наименование «Insert», а затем выбираем объект «Module».
  3. Производим копирование кода, который располагается выше, и вставляем его в созданный модуль. Копирование реализуем при помощи сочетания клавиш «Ctrl+C», а вставку – «Ctrl+V».
  4. Теперь в необходимой ячейке, в которой мы планируем вывести только числовую информацию, вбиваем такую формулу: =GetNumbers(А1).
  5. Нам нужно растянуть формулу вниз на все ячейки колонки. Для этого наводим указатель на нижний правый уголок ячейки. Курсор принял форму небольшого плюсика темного цвета. Зажимаем левую клавишу мышки и протягиваем формулу вниз до окончания таблички.

  1. Готово! Мы реализовали извлечение числовой информации при помощи специального макроса.

Заключение и выводы о процедуре извлечение

Мы выяснили, что существует несколько способов, позволяющих реализовать извлечение числовой информации. Осуществить эту операцию можно при помощи создания специальных макросов в редакторе VBA или же используя массивную формулу. Каждый пользователь может самостоятельно выбрать для себя наиболее удобный способ, который позволит ему убрать текстовую информацию из ячейки и оставить при этом числовые данные.

Источник

Как удалить буквы, цифры или лишние символы из текста

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

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

Как удалить цифры из текста?

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

Как удалить буквы из текста?

Чтобы удалить буквы из текста, необходимо в диалоговом окне надстройки выбрать пункт «Любые буквы», при этом в тексте ячеек цифры и знаки остаются, а все буквы, независимо от того русские они или английские, удаляются. Предусмотрено удаление из текста только латиницы (букв латинского алфавита) или только кириллицы (букв русского алфавита).

Как удалить лишние символы?

Для удаления лишних символов, необходимо выбрать пункт «Только знаки», при этом все символы кроме цифр и букв удаляются, но имеется возможность задать символы-исключения, например, чтобы все слова не слились в одну строку, можно установить флажок в поле «а также символы:» и вписать пробел. В поле для символов-исключений можно вписать любой другой символ, либо группу символов, друг за другом без пробелов или других разделителей.

Как удалить только заданные символы?

В случае, если необходимо удалить из значений ячеек отдельные символы из разных групп, предусмотрена возможность перечислить все символы, подлежащие удалению через точку с запятой. Для удаления самого символа «;» (точка с запятой) можно использовать опцию удаления по ASCII-кодам. Например, символу «;» соответствует ASCII-код «59». Эта опция будет также полезна при необходимости удаления непечатаемых символов, например символа перевода на новую строку.

Выборочное удаление символов из ячеек Excel

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

2) цифр и любых символов (кроме букв);

3) любых букв, как русского, так и английского алфавита;

4) любых букв и знаков;

5) любых букв и цифр;

6) только знаков (всех, кроме букв и цифр);

7) только букв кириллицы;

8) букв кириллицы и знаков;

9) только букв латиницы;

10) букв латинского алфавита и любых знаков;

11) символов, заданных вручную либо по ASCII-кодам.

При удалении группы символов программа позволяет создавать исключения из группы в поле «кроме символов», то есть задавать символы, которые не будут удаляться.

Удаление символов из выделенного текста документа Word

Надстройка дает возможность удалять группы символов в выделенном тексте документа Word:

1) изменять цвет шрифта у заданных символов;

2) удалять заданные символы;

3) создавать исключения из заданной группы символов;

4) осуществлять выбор одной из групп символов (цифры, знаки, буквы латиницы, буквы кириллицы и сочетания этих групп);

Источник

Как в офисе.

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

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

Как удалить цифры из текста?

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

Как удалить буквы из текста?

Чтобы удалить буквы из текста, необходимо в диалоговом окне надстройки выбрать пункт «Любые буквы», при этом в тексте ячеек цифры и знаки остаются, а все буквы, независимо от того русские они или английские, удаляются. Предусмотрено удаление из текста только латиницы (букв латинского алфавита) или только кириллицы (букв русского алфавита).

Как удалить лишние символы?

Для удаления лишних символов, необходимо выбрать пункт «Только знаки», при этом все символы кроме цифр и букв удаляются, но имеется возможность задать символы-исключения, например, чтобы все слова не слились в одну строку, можно установить флажок в поле «а также символы:» и вписать пробел. В поле для символов-исключений можно вписать любой другой символ, либо группу символов, друг за другом без пробелов или других разделителей.

Как удалить только заданные символы?

В случае, если необходимо удалить из значений ячеек отдельные символы из разных групп, предусмотрена возможность перечислить все символы, подлежащие удалению через точку с запятой. Для удаления самого символа «;» (точка с запятой) можно использовать опцию удаления по ASCII-кодам. Например, символу «;» соответствует ASCII-код «59». Эта опция будет также полезна при необходимости удаления непечатаемых символов, например символа перевода на новую строку.

Выборочное удаление символов из ячеек Excel

надстройка для выборочного удаления символов из ячеек Excel

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

2) цифр и любых символов (кроме букв);

3) любых букв, как русского, так и английского алфавита;

4) любых букв и знаков;

5) любых букв и цифр;

6) только знаков (всех, кроме букв и цифр);

7) только букв кириллицы;

8) букв кириллицы и знаков;

9) только букв латиницы;

10) букв латинского алфавита и любых знаков;

11) символов, заданных вручную либо по ASCII-кодам.

При удалении группы символов программа позволяет создавать исключения из группы в поле «кроме символов», то есть задавать символы, которые не будут удаляться.

Удаление символов из выделенного текста документа Word

надстройка для выборочного удаления символов из текста Word

Надстройка дает возможность удалять группы символов в выделенном тексте документа Word:

1) изменять цвет шрифта у заданных символов;

2) удалять заданные символы;

3) создавать исключения из заданной группы символов;

4) осуществлять выбор одной из групп символов (цифры, знаки, буквы латиницы, буквы кириллицы и сочетания этих групп);

5) задавать символы вручную;

6) задавать ASCII-коды символов.

Другие материалы по теме:

Источник

Как в Excel удалить из телефонного номера все лишние знаки? Такие как: точка, дефис, кавычки и так далее.

ReinRaus's user avatar

ReinRaus

17.6k3 золотых знака43 серебряных знака84 бронзовых знака

задан 15 июн 2015 в 11:02

spoilt's user avatar

Предполагая что номер лежит в A1 (упоминается в двух местах):

=SUMPRODUCT(MID(0&A1,LARGE(INDEX(ISNUMBER(--MID(A1,ROW($1:$25),1))
*ROW($1:$25),0),ROW($1:$25))+1,1)*10^ROW($1:$25)/10)

Честно украдено с How do I strip out all non-numeric characters?

На русском (не проверял, перевел по таблице):

=СУММПРОИЗВ(ПСТР(0&A1,НАИБОЛЬШИЙ(ИНДЕКС(ЕЧИСЛО(--ПСТР(A1,СТРОКА($1:$25),1))
*СТРОКА($1:$25),0),СТРОКА($1:$25))+1,1)*10^СТРОКА($1:$25)/10)

ответ дан 15 июн 2015 в 12:20

1

Если число «лишних» символов ограничено, то можно использовать много вложенных «поставить» в формуле:

подставить( подставить(текст, ".", ""), "-", "" )

и так далее. Сколько символов, столько и «подставить».

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

dim re as New RegExp
re.Pattern = "\D"
re.replace( text, "" )

ответ дан 15 июн 2015 в 11:23

ReinRaus's user avatar

ReinRausReinRaus

17.6k3 золотых знака43 серебряных знака84 бронзовых знака

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

Содержание

  1. Способы удаления текста и сохранения числовой информации
  2. Первый метод: использование специальной формулы
  3. Второй метод: использование специального макроса
  4. Заключение и выводы о процедуре извлечение

Способы удаления текста и сохранения числовой информации

Представим, что у нас есть такая информация, располагающаяся в ячейке: «Было доставлено кусков мыла 763шт». Нам необходимо сделать так, чтобы осталось только значение 763 для проведения разнообразных математических операций. Хорошо, если нужно избавиться от текстовых данных только в одной ячейке, тогда можно реализовать удаление ручным способом, но этот вариант не подходит, когда в табличке находится слишком много разной информации. Здесь необходимо применять различные специальные функции табличного редактора.

Первый метод: использование специальной формулы

Для реализации этой процедуры можно применять специальную массивную формулу. Примерная формула выглядит так:

=ПСТР(A1;МИН(ЕСЛИ(ЕЧИСЛО(-ПСТР(А1;СТРОКА($1:$99);1));СТРОКА($1:$99)));ПРОСМОТР(2;1/ЕЧИСЛО(-ПСТР(А1;СТРОКА($1:$99);1));СТРОКА($1:$99))-МИН(ЕСЛИ(ЕЧИСЛО(-ПСТР(А1;СТРОКА($1:$99);1));СТРОКА($1:$99)))+1)

Разберем основные моменты:

  1. Специальную формулу необходимо вбивать в поле при помощи комбинации кнопок «Ctrl+Shift+Enter».
  2. Стоит заметить, что в таком виде массивная формула может использоваться только с текстовой информацией, в которой число знаков не больше 99. Для увеличения диапазона нужно, к примеру, заменить параметр «СТРОКА($1:$99)» на «СТРОКА($1:$200)». Иными словами, мы вместо показателя 99 вводим число знаков с запасом. Если ввести слишком большой диапазон, то обработка формулы может занять длительное время.
  3. Если в текстовых данных числовые значения разбросаны по всему тексту, то формула не сможет правильно обработать информацию.

Детально рассмотрим специальную массивную формулу на таком примере: «Было доставлено кусков мыла 763шт., а заказывали 780»

  1. В поле А1 располагается сама текстовая информация, из которой мы будем извлекать числовые данные.
  2. Фрагмент: МИН(ЕСЛИ(ЕЧИСЛО(-ПСТР(А1;СТРОКА($1:$99);1));СТРОКА($1:$99))) позволяет определить позицию 1-го значения в поле. Получаем значение 29.
  3. Фрагмент: ПРОСМОТР(2;1/ЕЧИСЛО(-ПСТР(А1;СТРОКА($1:$99);1));СТРОКА($1:$99)) позволяет определить позицию последнего значения в поле. Получаем значение 31.
  4. Мы получаем такую формулу: =ПСТР(А1;29;31-29+1). Оператор ПСТР позволяет извлечь из текстовой информации, указанной 1-м аргументом, начиная с заданной позиции (29) с числом знаков, заданным 3-м аргументом.
  5. В результате мы получаем:
    =ПСТР(А1;29;31-29+1)

    • =ПСТР(А1;29;2+1)
    • =ПСТР(А1;29;3)
    • 763

Бывают ситуации обратные, когда нужно реализовать операцию извлечения односоставных текстовых данных, исключив числа.

Как оставить в ячейке Excel только числа, а весь текст удалить

Нам необходимо сохранить только текстовую информацию.

Как оставить в ячейке Excel только числа, а весь текст удалить

Специальная формула применяется по аналогичному алгоритму, что и вышерассмотренная. Она выглядит так: =ПСТР(А1;ПОИСК(«-«;А1)+1;ПОИСКПОЗ(ИСТИНА;ЕЧИСЛО(—ПСТР(ПСТР(А1;ПОИСК(«-«;А1)+1;999);СТРОКА($1:$99);1));0)-1)

Здесь мы, благодаря фрагменту ПОИСК(«-«;А1) отыскали локацию тире, а затем при помощи оператора ПОИСКПОЗ нашли в извлеченных текстовых данных позицию 1-го числа. Передали эти показатели в оператор ПСТР, который реализовал все дальнейшие преобразования.

Второй метод: использование специального макроса

Эту процедуру можно реализовать при помощи специального макроса, созданного в табличном редакторе Эксель. К примеру, у нас есть табличка, в которой существует колонка с текстовой информацией и числовыми данными. Нам нужно оставить только числовые данные, убрав при этом текст.

Как оставить в ячейке Excel только числа, а весь текст удалить

В табличном редакторе отсутствует интегрированная функция, поэтому нам необходимо создать такой пользовательский макрос:

Public Function GetNumbers(TargetCell As Range) As String

Dim LenStr As Long

For LenStr = 1 To Len(TargetCell)

Select Case Asc(Mid(TargetCell, LenStr, 1))

Case 48 To 57

GetNumbers = GetNumbers & Mid(TargetCell, LenStr, 1)

End Select

Next

End Function

Подробная инструкция по созданию пользовательского макроса выглядит так:

  1. Используя специальную комбинацию клавиш «Alt+F11», производим открытие редактора VBA. Альтернативный вариант – нажать ПКМ по рабочему листу и выбрать элемент «Исходный текст».
  2. Реализуем создание нового модуля. Для осуществления этой процедуры жмем левой клавишей мышки на элемент, имеющий наименование «Insert», а затем выбираем объект «Module».
  3. Производим копирование кода, который располагается выше, и вставляем его в созданный модуль. Копирование реализуем при помощи сочетания клавиш «Ctrl+C», а вставку – «Ctrl+V».
  4. Теперь в необходимой ячейке, в которой мы планируем вывести только числовую информацию, вбиваем такую формулу: =GetNumbers(А1).
  5. Нам нужно растянуть формулу вниз на все ячейки колонки. Для этого наводим указатель на нижний правый уголок ячейки. Курсор принял форму небольшого плюсика темного цвета. Зажимаем левую клавишу мышки и протягиваем формулу вниз до окончания таблички.

Как оставить в ячейке Excel только числа, а весь текст удалить

  1. Готово! Мы реализовали извлечение числовой информации при помощи специального макроса.

Заключение и выводы о процедуре извлечение

Мы выяснили, что существует несколько способов, позволяющих реализовать извлечение числовой информации. Осуществить эту операцию можно при помощи создания специальных макросов в редакторе VBA или же используя массивную формулу. Каждый пользователь может самостоятельно выбрать для себя наиболее удобный способ, который позволит ему убрать текстовую информацию из ячейки и оставить при этом числовые данные.

Оцените качество статьи. Нам важно ваше мнение:

 

Добрый день!
Подскажите пожалуйста, кто знает, как можно макросом удалить из ячейки все символы, кроме цифр?

 

skais675

Пользователь

Сообщений: 2178
Регистрация: 03.06.2014

#2

28.05.2019 09:39:49

Отсюда

Код
Public Function onlyDigits(stroka) 'Только цифры
    Static objRegExp As Object
     If objRegExp Is Nothing Then
         Set objRegExp = CreateObject("VBScript.RegExp")
         objRegExp.Global = True
         objRegExp.Pattern = "[^0-9]"
     End If
     onlyDigits = objRegExp.Replace(stroka, "")
 End Function

Изменено: skais67528.05.2019 09:43:38

Мой канал

 

Aleksey1107

Пользователь

Сообщений: 363
Регистрация: 05.04.2018

Excel 365

Добрый день!

Почитайте

здесь

 
 

bedvit

Пользователь

Сообщений: 2477
Регистрация: 02.04.2015

Виталий

#5

29.05.2019 12:56:59

Нашел свою реализацию (немного подправил, версия от сегодняшнего числа). До двух раз быстрее на длинных строках и смешанном тексте (в сравнении с кодом, пост2). Выкладываю код и тест.
На данных: строка — 32 тыс. символов, строк — 10 тыс. — 10 сек, против 20 сек. через регулярки.
На меньших сроках превосходство меньше, но все равно существенное.
Прошу тестировать.

Код
Option Explicit
'Автор Б. Виталий В. (bvv, bedvit)
'Редакция: 1 от 29/05/2019
'Действие: Функция - в строке остаются только цифры

Public Function Digits(ByVal str As String) As String
Dim x As Long, y As Long, Chars() As Byte, Chars2() As Byte, Char As Byte
Chars = str: ReDim Preserve Chars2(UBound(Chars) + 1)
For x = LBound(Chars) To UBound(Chars) Step 2
    If Chars(x + 1) = 0 Then
    Char = Chars(x)
        If Char < 58 Then If Char > 47 Then Chars2(y) = Char: y = y + 2
    End If
Next
Digits = Chars2
End Function

Прикрепленные файлы

  • Digits_test.xlsb (26.81 КБ)

Изменено: bedvit29.05.2019 13:09:29

«Бритва Оккама» или «Принцип Калашникова»?

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

bedvit, отличная функция, но для того, чтобы оставить кириллицу нужно что-то с ней сделать, т.к. преобразует в байты на 176 позиций назад и «разделяет» через 4, а не 0.

То есть:

ВАСЯ это не 194/0/192/0/209/0/223/0, а 18/4/16/4/33/4/47/4

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Ігор Гончаренко

Пользователь

Сообщений: 13746
Регистрация: 01.01.1970

#7

23.07.2019 15:46:08

RegExp с маской «D+» будет удалять символы не по одному, а группами, что существенно резвее

Код
Function DigitOnly(s$)
  Dim re
  Set re = CreateObject("VBScript.RegExp"): re.Global = True
  re.Pattern = "D+":  DigitOnly = re.Replace(s, "")
End Function

Изменено: Ігор Гончаренко23.07.2019 16:08:35

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

bedvit

Пользователь

Сообщений: 2477
Регистрация: 02.04.2015

Виталий

Jack Famous, мой код делает именно то, что нужно было по теме. Если отбирать только кириллицу, нужно изменить в макросе

коды нужных знаков Юникода

. Помним, про «Ё».
Ігор Гончаренко, да, так быстрее на порядок, тест:
onlyDigits 20,07031
Digits 10,64453
DigitOnly 2,636719

«Бритва Оккама» или «Принцип Калашникова»?

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#9

23.07.2019 16:08:53

Доброе время суток.

Цитата
Ігор Гончаренко написал:
существенно резвее

Протестировал на строке из 40 387 200 символов. Длина строки результата 301 800 (цифры только).
Ігор Гончаренко, шаблон «D+», время 0,18 секунды
skais675, шаблон «[^0-9]», время 1,77 секунды
skais675, шаблон «[^0-9]+», время 0,27 секунды
bedvit, 1,2 секунды

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

bedvit, я пока всё-равно остановился на регулярках, т.к. и быстрее и передавать аргумент (маску) проще и понятнее, НО серьёзно удивился способу формирования одномерного байтового массива напрямую arr() As Byte=txt$ и обратно (строки из массива) — очень круто  :idea:

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

sokol92

Пользователь

Сообщений: 4446
Регистрация: 10.09.2017

#11

23.07.2019 16:27:08

Цитата
Jack Famous написал:
удивился способу формирования одномерного байтового массива

Рекомендовано

разработчиком.

Владимир

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

sokol92, спасибо  ;)

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

bedvit

Пользователь

Сообщений: 2477
Регистрация: 02.04.2015

Виталий

Jack Famous, спасибо, пользуйтесь.
sokol92, Владимир, спасибо за инфо.
Андрей VG, Андрей, спасибо за тест. Посмотрел, что на таких больших объемах мой код в аутсайдерах. Другое дело, что в ячейку столько не влезет, поэтому не так критично.
Тоже смотрю последнее время на регулярки. Есть идея зашить в функцию (C API), на это нужно время, зато для форума польза. Скорость думаю должна быть неплохая ;)
Вот, к примеру протестируй, пожалуйста функцию «DigitsXLL» в нужной разрядности XLL на своем массиве (через Application. Run, нужно просто открыть XLL, функция появится в категории «BedvitXLL»)
У меня следующие результаты, на моем примере (см. вложение).
onlyDigits 20 сек
Digits 10 сек
DigitOnly 2,6 сек
DigitsXLL 0,4 сек

Изменено: bedvit23.07.2019 18:07:22

«Бритва Оккама» или «Принцип Калашникова»?

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#14

23.07.2019 20:53:20

Цитата
bedvit написал:
что на таких больших объемах мой код в аутсайдерах

Привет, Виталий.
С твоим кодом в VBA есть и ещё проблема. Тестовый вывод показывает, что не удаляется ничего. Не пошёл и вызов Application.Run(«DigitsXLL», sText), как и с Evaluate — видимо слишком длинная строка :) Результаты.

Цитата
Igor D+ time: 0,0859375; digit count: 1299456; all count: 43895808
skais675 [^d]+ time: 0,3828125; digit count: 1299456; all count: 43895808
BedVit VBA time: 1,117188; digit count: 43895808; all count: 43895808

Тестовый файл и код прикладываю. longText.zip в формате 7z (к сожалению форум не позволяет прикладывать архивы таком формате).
P. S. Решил сравнить с библиотекой .Net и тут засада. Или у меня руки не оттуда растут или… Результат

Цитата
Net time: 719,0871 мсек; digits count: 1299456; all count: 43895808

Скрытый текст

Прикрепленные файлы

  • Digits_test.xlsb (25.56 КБ)
  • longText.zip (8.19 КБ)

 

bedvit

Пользователь

Сообщений: 2477
Регистрация: 02.04.2015

Виталий

По  DigitsXLL понятно, это функция листа, в ячейку больше 32 тысяч не лезет. Сразу не сообразил.
По Digits в VBA — пока не понял, гляну.
На .NET тоже глянем, как можно ускорить.
Здесь появляется два момента:
1. Самая быстрая функция для расчетов в ячейке Excel, макс 32 767 знаков(VBA, COM, XLL)
2. Самая быстрая функция для любого количества знаков.
2.1 что бы можно использовать в VBA (VBA, COM)
2.2 любой инструмент (EXE на .NET, EXE на С++)

Что хотим потестировать?
Готов поучаствовать везде.

«Бритва Оккама» или «Принцип Калашникова»?

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#16

24.07.2019 08:57:32

Цитата
bedvit написал:
любой инструмент (EXE на .NET, EXE на С++)

Виталий, я максимум на Net. Вечером слеплю в ExcelDNA многопоточную версию для функции рабочего листа, протестирую.

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

bedvit, да — я понял, что с цифрами всё ОК, но вот дальше всё-равно не догоняю…

В таблице (по вашей ссылке) Кириллица такая:

1025(Ё), 1040(А) — 1103(я), 1105(ё)
1. «ВАСЯ» по ней: 1042 | 1040 | 1057 | 1071
2. • при преобразовании в байтовый массив: 18 | 16 | 33 | 47 (через «4»)
3. • при преобразовании сначала через StrConv: 18 | 16 | 33 | 47 (через «0-4-0» вместо «4»)

Где тут логика и как поступать???

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

bedvit

Пользователь

Сообщений: 2477
Регистрация: 02.04.2015

Виталий

Jack Famous,

здесь

по-моему неплохо про это написано.

Изменено: bedvit24.07.2019 12:47:14

«Бритва Оккама» или «Принцип Калашникова»?

 

bedvit

Пользователь

Сообщений: 2477
Регистрация: 02.04.2015

Виталий

Jack Famous,  Вот

здесь

, я уже писал на этом форуме код, в такой же парадигме, для кириллицы.

«Бритва Оккама» или «Принцип Калашникова»?

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

bedvit, и это никак не объясняет, откуда вы взяли 15, 80 и 81… С тем, как вы определяете кириллицу по разделителю «4» мне ясно, с 32 понятно — это код пробела при разделителе «0», но откуда остальные??? В таблице Юникода я что-то не то увидел…

Изменено: Jack Famous24.07.2019 14:12:04

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

bedvit

Пользователь

Сообщений: 2477
Регистрация: 02.04.2015

Виталий

Jack Famous, прочитали инфо по ссылке в посте 18?

«Бритва Оккама» или «Принцип Калашникова»?

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

bedvit, нет)) я, балбес, признаю — не увидел  :D Спасибо большое  :idea:
Не могу только понять, из какой в какую систему перегонять надо… Сижу функции перебираю…

UPD:

итак, в таблице Юникод коды символов совпадают с таблицей в Excel (через =СИМВОЛ() или =Chr() в VBA) с 1 по 126, дальше пляска пошла)))
В Юникоде код представлен (например, для русской «А») в десятичной (1040) или шестнадцатиричной (0410) системах счисления

Пока не могу только понять, как именно из них получить 16/4 или наоборот  :D
Вроде как это восмеричная система, но тогда почему вместо 2020 (если перевести 1040 из десятичной в восьмеричную) выдаёт эти «16 и 4»? Кратность какая-то?

UPD2:

всё — я понял  :D
1040 = 16 | 4 = 16 + 256*4 (для всей кириллицы будет)
Вот только как

калькулятором

или функциями перегонять — всё равно непонятно  :D

Изменено: Jack Famous24.07.2019 16:11:51

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

bedvit

Пользователь

Сообщений: 2477
Регистрация: 02.04.2015

Виталий

#23

24.07.2019 18:28:55

Цитата
bedvit написал:
1. Самая быстрая функция для расчетов в ячейке Excel, макс 32 767 знаков(VBA, COM, XLL)2. Самая быстрая функция для любого количества знаков.2.1 что бы можно использовать в VBA (VBA, COM)2.2 любой инструмент (EXE на .NET, EXE на С++)

1.Тест на 32767 знаков в каждой ячейке, на 1 млн. ячеек в Excel — 9 сек. (тест прилагаю, нужно открыть текст, нужной разрядности XLL, запустить)
2.1 — СОМ не делал, за неимением спроса, будет такая же скорость как и в п.2.2
2.2 — C#.NET Андрей, внес в твой код еще два варианта:

Скрытый текст

Net time: 1130,113 мсек; digits count: 1299456; all count: 43895808
Net time: 247,0247 мсек; digits count: 1299456; all count: 43895808 — вар2
Net time: 124,0124 мсек; digits count: 1299456; all count: 43895808 — вар3

С++

Скрытый текст

digits count: 43895808
time = 99, digits count: 1299456

В Шарпе неудобно работать со строками, их нельзя изменять (при изменении, по факту, создается новая строка. Есть структура, где все же можно — System.Text.StringBuilder, но как видим работает «оно» медленно)
В С++ строка, это лишь массив символов, можно менять что угодно, прямо на месте.
Поэтому в тестах несколько быстрее.

Прикрепленные файлы

  • толко_цифры2.rar (255.67 КБ)

Изменено: bedvit24.07.2019 19:30:28

«Бритва Оккама» или «Принцип Калашникова»?

 

manat78

Пользователь

Сообщений: 110
Регистрация: 03.03.2018

может как идея создать переменную (1)=»0123456789″ и потом каждый символ в тестируемом значении проверять на наличие в этой переменной (1) и если есть то сувать в еще одну переменную (2). и в конце менять значение на переменнную (2). незнаю на сколько это быстро будет)))

 

sokol92

Пользователь

Сообщений: 4446
Регистрация: 10.09.2017

#25

24.07.2019 20:26:45

Цитата
Jack Famous написал:
функциями перегонять — всё равно непонятно  

В VBA (кроме, естественно, вызова функций рабочего листа) есть «родная» функция Hex для перевода из 10-тичной системы в 16-ричную. Для обратного перевода можно «схимичить», как указано ниже:

Код
Sub test()
  Dim s As String
  Debug.Print AscW("А")  ' выдает 1040 - номер в юникоде для заглавной "А" кириллицы в 10-тичной системе счисления
  Debug.Print Hex(1040)  ' выдаст 410 - перевод 1040 из 10- в 16-ричную
  s = "410"
  Debug.Print CDbl("&H" & s) ' выдает 1040 - обратный перевод из 16- в 10-
  Debug.Print ChrW(1040)     ' выдает заглавную "А"
End Sub

8-ричной системой ни разу в жизни в Excel не пользовался.

Изменено: sokol9224.07.2019 20:28:12

Владимир

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#26

25.07.2019 08:36:08

sokol92, за функции спасибо — почти уверен, что они быстрее функций листа  :idea:

Цитата
sokol92: 8-ричной системой ни разу в жизни в Excel не пользовался

но именно такая (кажется) получается при передаче строки байтному массиву  :D
В любом случае, что делать с этими цифрами теперь понятно.

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

bedvit

Пользователь

Сообщений: 2477
Регистрация: 02.04.2015

Виталий

#27

25.07.2019 14:18:10

Андрей VG, Андрей, можно еще немножко ускорить код на C#.NET, если перейти на указатели и небезопасный код (Unsafe code). см. вариант 4.
Еще ближе к С++.
upd. Немного подправил свой код.

Скрытый текст

V1-Net time: 1079,1079 мсек; digits count: 1299456; all count: 43895808
V2-Net time: 243,0243 мсек; digits count: 1299456; all count: 43895808
V3-Net time: 135,0135 мсек; digits count: 1299456; all count: 43895808
V4-Net time: 119,0119 мсек; digits count: 1299456; all count: 43895808

Изменено: bedvit25.07.2019 15:13:42
(upd. Немного подправил свой код.)

«Бритва Оккама» или «Принцип Калашникова»?

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#28

25.07.2019 21:44:16

Привет, Виталий.
Огромное спасибо за исследование. Сделал в ExcelDNA, но так как исходно RegEx исходно раз в восемь медленнее, то не смотря на то, что можно задействовать IsThreadSafe, получается, что VBScript.RegExp твой код на ячейках выполнять для 32000 строк за 13 секунд, а RegEx за 20!

Цитата
onlyDigits 40,46875
Digits 25,32031
DigitOnly 12,75
DigitsXLL 0,3359375
Net RegEx 19,60938

Твой С++ вне сомнения лучший, причём деградирует заметно медленнее. RegEx на 1000000 строк минут 9 молотил, твой секунд за 30 справился — точно не засекал.

Изменено: Андрей VG25.07.2019 21:45:32

 

bedvit

Пользователь

Сообщений: 2477
Регистрация: 02.04.2015

Виталий

Андрей, спасибо за исследования! А DigitOnly — это код Игоря Гончаренко — выходит самый быстрый на VBA. Опять же с помощью сторонних библ. В теории я могу подлючить свою СОМ-библиотеку и обогнать в VBA — стандартную. Далее мой код на VBA, выходит 25 сек. без сторонних библиотек. Неплохо, но с библиотеками все же лучше. Считаю нужно все использовать, если есть возможность. По XLL — для интереса, возьми вариант 4 — на шарпе самый быстрый, не сильно уступает С++, заверни его в ExcelDNA. Предполагаю, отставание раза в два-пять всего лишь будет от С++.
Да C API в XLL впечатляет, конкурентов нет, кроме стандартных функций.  Хочу обогнать ВПР(), но пока проигрываю (медленнее на 46%). Не удается по указателю в Excel залесть (а разыменовывать весь массив это дорого, за счёт этого проигрываю), а встроенным функциям видимо есть доступ к памяти Excel через указатель. Или используется механизм кеширования — сейчас я о нем подумываю. Если интересно — написал даже

здесь

и

здесь

.

Изменено: bedvit25.07.2019 23:35:31

«Бритва Оккама» или «Принцип Калашникова»?

 

Inexsu

Пользователь

Сообщений: 758
Регистрация: 29.06.2017

#30

25.07.2019 23:58:45

Привет!

Цитата
DopplerEffect написал:
все символы, кроме цифр?

Не забыли про

Код
Application.DecimalSeparator

?

Сравнение прайсов, таблиц — без настроек

Like this post? Please share to your friends:
  • Удалить все кроме дубликатов excel
  • Удалить все карты xml excel
  • Удаление ячейки в excel горячие клавиши
  • Удаление ячеек таблицы в word
  • Удалить все значения ячеек в excel