Способ извлечь граф из описания

Мне постоянно поручено получать информацию из другого источника и получать информацию без размера деноминации. Размер или количество указаны в описании, и вы хотите написать формулу 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, IF(-test-, -true-, -false-)
  • Заполните часть -test. Скажем, я сначала хотел найти «планшет». Я мог бы использовать ...FIND("Tablet",A2)... Однако проблема здесь в том, что если "Планшет" не найден, он выдаст ошибку, поэтому я бы ...IFERROR(Find("Tablet",A2), FALSE)... ошибку, как это ...IFERROR(Find("Tablet",A2), FALSE)... которая возвращает FALSE, если «Таблетка» не найдена в ячейке A2.
  • Но я также хочу искать 'Count', чтобы я мог использовать ИЛИ наряду с тем, что я уже построил ...OR( IFERROR(Find("Tablet",A2), FALSE), IFERROR(Find("Count",A2), FALSE) ) так что это будет ИЛИ воедино результаты - если найден либо «Таблетка», либо «Счет», эта функция возвращает число (и, поскольку это число, оно читается как ИСТИНА!)
  • Теперь я добавляю это уравнение ИЛИ () в свой ЕСЛИ для -true-, тогда, конечно, я могу сделать это как «Таблетка» или «Счет» или поместить новое уравнение, чтобы конкретно сказать, что оно нашло. И мой ложный я могу сделать ""

К этому моменту у меня будет полное уравнение, которое проверит «Счет» или «Таблетку» и выплюнет все, что есть в моем уравнении -истине. В противном случае ячейка останется пустой: 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)

введите описание изображения здесь


Есть идеи?

10000