Вот альтернатива на основе формулы, которая извлечет первое 5-значное число, найденное в ячейке A1. В большинстве ситуаций я предпочитаю достаточно простые решения формул, а не VBA, поскольку формулы более переносимы. Эта формула является формулой массива и поэтому должна быть введена с помощью Ctrl+Shift+Enter. Идея состоит в том, чтобы разбить строку на все возможные фрагменты из 5 символов, проверить каждый из них и вернуть первое совпадение.
=MID(A1,MIN(ЕСЛИ(НЕ(ЕОШИБКА(("1"&MID(A1,СТРОКА(ДВССЫЛ("R1C[1]:R"&(LEN(A1)-4)&"C[1)", ЛОЖЬ)),5)&".1")*1))*ЕОШИБКА(СРЕДН(A1,СТРОКА(ДВССЫЛ("R1C[1]:R"&(LEN(A1)-4)&"C[1] ",ЛОЖЬ))+5,1)*1)*ЕОШИБКА(СРЕДН(A1,СТРОКА(ДВССЫЛ("R1C[1]:R"&(ДЛСТР(A1)-4)&"C[1]",ЛОЖЬ) ))-1,1)*1),СТРОКА(ДВССЫЛ("R1C[1]:R"&(LEN(A1)-4)&"C[1]",FALSE)),9999999999)),5)
Давайте разберем это. Во-первых, у нас есть выражение, которое я использовал дважды, чтобы вернуть массив чисел от 1 до 4 меньше, чем длина исходного текста. Итак, если у вас есть строка длиной 10, следующее вернет {1,2,3,4,5,6}. В дальнейшем приведенная ниже формула будет называться rowlist. Я использовал нотацию R1C1, чтобы избежать возможных циклических ссылок.
ROW(INDIRECT("R1C[1]:R"&(LEN(A1)-4)&"C[1]",FALSE))
Далее мы будем использовать этот массив, чтобы разделить текст на массив из 5 фрагментов букв и протестировать каждый фрагмент. Выполняемый тест состоит в том, чтобы добавить «1» и «.1», а затем убедиться, что фрагмент является числовым. Добавление и добавление исключают возможность использования пробелов или десятичных знаков. Затем мы можем проверить символ до и символ после, чтобы убедиться, что они не являются числами. В дальнейшем приведенная ниже формула будет называться isnumarray.
NOT(ISERROR(("1"&MID(A1,rowlist,5)&".1")*1))
*ISERROR(MID(A1,rowlist+5,1)*1)
*ISERROR(MID(A1,rowlist-1,1)*1)
Далее нам нужно найти первое действительное 5-значное число в строке, возвращая текущий индекс из дубликата формулы rowlist и возвращая большое число для несоответствий. Затем мы можем использовать функцию MIN
, чтобы получить это первое совпадение. В дальнейшем нижеследующее будет называться мининдекс.
MIN(IF(isnumarray,rowlist,9999999999))
Наконец, нам нужно получить числовую строку, начинающуюся с индекса, возвращаемого функцией MIN
.
MID(A1,minindex,5)
person
Mark Balhoff
schedule
10.03.2015