
У меня есть набор ячеек, в которых смешаны однозначные рейтинговые числа с текстом рядом с ними (рейтинги от 1 до 9). Я хотел бы извлечь числа для каждой ячейки и получить среднее значение. Я знаю о таких функциях, как Search и RegexExtract, но не понимаю, как их использовать, чтобы получить все числа, поскольку они, похоже, возвращают только первое совпадение.
Вот пример текста в одной ячейке:
A - 1
B - 5
C - 9
D -4
E -7
F - 2
Для приведенного выше текста я собираюсь создать массив {1,5,9,4,7,2} и передать его функции усреднения.
Я также использую Google Sheets, но большинство стандартных функций Excel должны работать так же. Спасибо.
решение1
Я хотел бы предложить решение в два шага, которое решит эту проблему:
предостережение:
- Представленный ниже метод предназначен для пользователей Excel, поскольку VBA не работает с Google Sheet.
- Файл Excel можно преобразовать в
XLSX
формат, подходящий для редактирования в Google Sheet. SUMPRODUCT
также работает с Google Таблицами.
Шаг 1:
- Либо нажмитеАlt+F11 илирНажмите наСнажмите TAB и из выпавшего меню нажмитеВiew Код для получения редактора VB.
Скопи ипСохранить этот код какМodule, затем вернитесь к листу.
Public Function SplitNum(pWorkRng As Range, pIsNumber As Boolean) As String Dim xLen As Long Dim xStr As String xLen = VBA.Len(pWorkRng.Value) For i = 1 To xLen xStr = VBA.Mid(pWorkRng.Value, i, 1) If ((VBA.IsNumeric(xStr) And pIsNumber) Or (Not (VBA.IsNumeric(xStr)) And Not (pIsNumber))) Then SplitNum = SplitNum + xStr End If Next End Function
Введите эту формулу в ячейку
AI5
:=SplitNum(AH1,TRUE)
Шаг 2:
ПолучитьАVERAGE введите эту формулу в ячейку
AJ5
.=SUMPRODUCT(--MID(AI5,ROW(INDIRECT("1:" & LEN(AI5))),1))/Len(AI5)
Пользователи Google Таблиц могут использовать эту формулу:
=AVERAGE(SPLIT(AH1,CONCATENATE(SPLIT(AH1,".0123456789"))))
Примечание. -При необходимости измените ссылки на ячейки в формуле.
решение2
Если вам нужно получить AVERAGE
эти значения в Таблицах, попробуйте (с данными в A1:
=average(split(trim(REGEXREPLACE(A1,"\D+"," "))," "))
Вместо того, чтобы пытаться извлечь каждое число, мы просто удаляем нецифровые значения; затем разделяем и усредняем их. Иногда это удобный метод — удалить то, что нам не нужно, вместо того, чтобы пытаться извлечь то, что нам нужно.
ДляЭксельпользователи, если у вас есть Excel 2016+ с этой TEXTJOIN
функцией, вы можете использовать этомножествоформула:
=AVERAGE(ABS(FILTERXML("<t><s>" & SUBSTITUTE(TEXTJOIN(" ",TRUE,A1:A6)," ","</s><s>") & "</s></t>","//s[number()=number()]")))
Поскольку это формула массива, вам нужно "подтвердить" ее, удерживая ctrl+ shiftпри нажатии enter. Если вы сделаете это правильно, Excel поместит фигурные скобки {...}
вокруг формулы, как показано в строке формул