Мне постоянно поручено получать информацию из другого источника и получать информацию без размера деноминации. Размер или количество указаны в описании, и вы хотите написать формулу Excel со следующей логикой:
если ячейка содержит капсулы, таблетки, жидкость и т. д., то сделайте эту ячейку равной тоже капсуле, таблеткам, жидкости и т. д. + число перед ней
Несколько примеров предметов:
Nature's Bounty Magnesium 500 mg, 200 Tablets
Aerobic Life Mag 07 Oxygen Digestive System Cleanser Capsules, 180 Count
Natural Vitality Natural Calm Anti Stress Drink 30 count Raspberry Lemon
Хотите, чтобы в следующем столбце были Таблетки или Количество, если это сказано в описании.
Я пытался использовать операторы if и then, но не знаю, как их объединить для создания «или» и «и»
Ожидайте, что столбцы из приведенных выше примеров будут выглядеть следующим образом:
200 Tablets
180 Count
30 Count
Всего 3 ответа
Если значения находятся в столбце A, формула будет выглядеть так:
=+IF(ISERROR(VALUE(RIGHT(LEFT(A3,SEARCH(IF(ISERROR(SEARCH("Tablets",A3)),IF(ISERROR(SEARCH("Capsules",A3)),IF(ISERROR(SEARCH("Count",A3)),"","Count"),"Capsules"),"Tablets"),$A3)-1),4))),0,VALUE(RIGHT(LEFT(A3,SEARCH(IF(ISERROR(SEARCH("Tablets",A3)),IF(ISERROR(SEARCH("Capsules",A3)),IF(ISERROR(SEARCH("Count",A3)),"","Count"),"Capsules"),"Tablets"),$A3)-1),4)))&" "&IF(ISERROR(SEARCH("Tablets",A3)),IF(ISERROR(SEARCH("Capsules",A3)),IF(ISERROR(SEARCH("Count",A3)),"","Count"),"Capsules"),"Tablets")
Поскольку формула длинна, см. Ниже, разделенную на две разные ячейки, первая из которых ищет элемент, который мы ищем (таблетки, капсулы или счетчик) и возвращает его, вторая - поиск предыдущего числа:
+IF(ISERROR(SEARCH("Tablets",A4)),IF(ISERROR(SEARCH("Capsules",A4)),IF(ISERROR(SEARCH("Count",A4)),"","Count"),"Capsules"),"Tablets")
+IF(ISERROR(VALUE(RIGHT(LEFT(A4,SEARCH(B4,$A4)-1),4))),0,VALUE(RIGHT(LEFT(A4,SEARCH(B4,$A4)-1),4)))
Формула имеет ограничение относительно числа получаемых, и оно ограничено 9999, больше, чем формула соединяет результат. Также для чисел от 1 до 9 формула может возвращать ошибку # значение. Это может быть решено путем изменения второй формулы, если это необходимо.
Я бы сделал что-то вроде этого:
IF(-test-, -true-, -false-)
...FIND("Tablet",A2)...
Однако проблема здесь в том, что если "Планшет" не найден, он выдаст ошибку, поэтому я бы ...IFERROR(Find("Tablet",A2), FALSE)...
ошибку, как это ...IFERROR(Find("Tablet",A2), FALSE)...
которая возвращает FALSE, если «Таблетка» не найдена в ячейке A2. ...OR( IFERROR(Find("Tablet",A2), FALSE), IFERROR(Find("Count",A2), FALSE) )
так что это будет ИЛИ воедино результаты - если найден либо «Таблетка», либо «Счет», эта функция возвращает число (и, поскольку это число, оно читается как ИСТИНА!) ""
К этому моменту у меня будет полное уравнение, которое проверит «Счет» или «Таблетку» и выплюнет все, что есть в моем уравнении -истине. В противном случае ячейка останется пустой: IF(OR( IFERROR(Find("Tablet",A2), FALSE), IFERROR(Find("Count",A2), FALSE) ), "Count/Tablet", "")
Вот слегка протестированный UDF с использованием RegExp:
Function Amounts(txt)
Dim re As Object, allMatches, m, rv, sep
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "(d+s?(tablets|tablet|count|liquid))"
re.ignorecase = True
re.MultiLine = True
re.Global = True
Set allMatches = re.Execute(txt)
For Each m In allMatches
rv = rv & sep & m
sep = ","
Next m
Amounts = IIf(rv <> "", rv, "(none)")
End Function
Использование:
=Amounts(A2)