Извлечь числовую часть из буквенно-цифровой строки в Excel 2010 - PullRequest
1 голос
/ 16 апреля 2019

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

enter image description here

Я уже попробовал приведенную ниже формулу, найденную в Интернете, но в результате она выдает «6», но она не верна, поэтому кто-нибудь может мне помочь с этим?

SUM(MID(0&A2,LARGE(ISNUMBER(-- 
MID(A2,ROW(INDIRECT("1:"&LEN(A2))),1))*ROW(INDIRECT("1:"&LEN(A2))),
ROW(INDIRECT("1:"&LEN(A2))))+1,1)*10^ROW(INDIRECT("1:"&LEN(A2)))/10)

Я ожидаю, что вывод этой строки:

eed1e11bd1a66cb47ad8b215c882194cdf964332484d20c56aea69e6e5196f67

будет:

1111664782158821949643324842056696519667

Обратите внимание, что я хочу сделать это только через Excel,Желательно некоторые функции, а не макро.

Ответы [ 6 ]

2 голосов
/ 16 апреля 2019

С данными в A1 , в B1 введите формулу массива:

=MID(SUMPRODUCT(--MID("01"&A1,SMALL((ROW($1:$300)-1)*ISNUMBER(-MID("01"&A1,ROW($1:$300),1)),ROW($1:$300))+1,1),10^(300-ROW($1:$300))),2,300)

или даже эта формула массива (доступно в Excel 365) :

=TEXTJOIN("",TRUE,IF(ISNUMBER(--MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1)),MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1),""))
* +1012 *enter image description here

Формулы массива необходимо вводить с помощью Ctrl + Shift + Ввод , а не просто клавиша Ввод, Если это сделано правильно, формула появится в фигурных скобках вокруг нее в строке формул.

1 голос
/ 16 апреля 2019

Поступление в базовую и старую школу и долгое дыхание:

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(LOWER(A2),"a",""),"b",""),"c",""),"d",""),"e",""),"f",""),"g",""),"h",""),"i",""),"j",""),"k",""),"l",""),"m",""),"n",""),"o",""),"p",""),"q",""),"r",""),"s",""),"t",""),"u",""),"v",""),"w",""),"x",""),"y",""),"z","")

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

--
+0
-0
*1
/1

Функция LOWER преобразует все символы в нижний регистр. Это экономит, делая замену дважды. Один раз для нижнего регистра и один раз для верхнего регистра.

POC

CAVEAT: ЕСЛИ есть специальные символы, такие как "! @ # $% ^ & * () _ + - = [] {} |:"; '<> ?, ./ "текущая формула оставит их нетронутыми . Подстановка для каждого специального символа должна быть удалена. То же самое касается символов, таких как "éìô" и т. Д.

0 голосов
/ 16 апреля 2019

Вот UDF, который будет обрабатывать это, используя REGEX (обычно самый быстрый способ обработки сложных манипуляций со строками). Он удаляет все, что не является числом, и возвращает его в виде строки.

Function NumbersOnly(rng As Range)
 Dim nReturn As Variant
 With CreateObject("VBScript.RegExp")
        .Pattern = "[^0-9]"
        .MultiLine = True
        .Global = True
        nReturn = .Replace(rng.Value2, vbNullString)
    End With
    NumbersOnly = nReturn
End Function

Если вы хотите число, просто оберните функцию в функцию «VALUE».

=VALUE(NumbersOnly(A1))
0 голосов
/ 16 апреля 2019

Вот метод, использующий формулу массива:

=CONCAT(IFERROR(MID(A2,ROW(OFFSET($A$1,0,0,LEN(A2),1)),1)/1,""))

Буквально разбивает текст на массив из односимвольных символов, а затем проверяет, является ли каждый из них числом (т.е. его можно разделить на 1).

Если нет, персонаж с пустой строкой (""), а затем в конце все снова объединяет все вместе.Не забудьте использовать Ctrl + Shift + Введите при вводе.

(CONCAT, например, TEXTJOIN недоступнов Excel 2010 или более ранней версии.)

0 голосов
/ 16 апреля 2019

Вот еще один вариант формулы:

{=TEXT(NPV(-0.9,,IF(ISERR(MID(A1,256-COLUMN(A:IV),1)%),"",MID(A1,256-COLUMN(A:IV),1)%)),"0")}

Обратите внимание, что это формула массива, и ее необходимо подтвердить с помощью Ctrl Shift Введите

enter image description here

Примечание: Научная нотация станет проблемой, поэтому я использовал TEXT(), но все же раздражающее поведение Excel в числах начнет портиться с выводом, начиная с 15-го символа и далее, и имеет вопросы округления или выходные данные как 0.

Я думаю, что самое разумное, чтобы предотвратить это, - использовать UDF? Или иди по старому пути (@ ForwardEd его ответ)

Некоторые простые UDF могут выглядеть так:

Public Function GetDigits(RNG As String) As String

GetDigits = RNG
For X = 97 To 122
    GetDigits = Replace(GetDigits, Chr(X), "")
Next X

End Function

Или используйте регулярные выражения, например:

Public Function GetDigits(RNG As String) As String

With CreateObject("VBScript.RegExp")
    .Global = True
    .Pattern = "\D"
    GetDigits= .Replace(RNG, "")
End With

End Function
0 голосов
/ 16 апреля 2019

Похоже, у вас есть только буквы от a до f, которые нужно удалить. В таком случае это может быть быстрее, чем решение, которое обрабатывает все возможные буквы:

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"a",""),"b",""),"c",""),"d",""),"e",""),"f","")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...