Эквивалент кейс-функции в Excel - PullRequest
49 голосов
/ 30 марта 2011

У меня есть интересная задача - мне нужно проверить следующие данные в Excel:

|   A  -   B  -   C  -  D   |
|------|------|------|------|
|  36  |   0  |   0  |   x  |
|   0  |  600 |  700 |   x  |
|___________________________|

Вам придется извинить мое удивительно плохое искусство ASCII.Поэтому мне нужен столбец D (x), чтобы выполнить проверку соседних ячеек, а затем преобразовать значения при необходимости.Вот критерии:

Если столбец B больше 0, все отлично работает, и я могу получить кофе.Если это не соответствует этому требованию, то мне нужно преобразовать А1 в соответствии с таблицей - например, 32 = 1420 и поместить в D.К сожалению, нет никакой связи между A и тем, что нужно преобразовать, поэтому о создании вычисления не может быть и речи.

В этом сценарии было бы идеально использовать оператор case или switch, но я не думаю, чтоэто встроенная функция в Excel.Я также думаю, что было бы сумасшествием связывать кучу =IF() заявлений вместе, что я делал около четырех раз, прежде чем решить, что это плохая идея (история моей жизни).

Ответы [ 11 ]

56 голосов
/ 31 марта 2011

Похоже на задание для VLOOKUP !

Вы можете поместить ваши отображения типа 32 -> 1420 в несколько столбцов где-то, а затем использовать функцию VLOOKUP для выполнения поиска.

21 голосов
/ 13 марта 2015

Без ссылки на исходную проблему (которая, я подозреваю, давно решена), я совсем недавно обнаружил хитрый прием, который заставляет функцию выбора работать точно так же, как оператор select case, без необходимости изменять данные. Есть только один улов: только одно из выбранных вами условий может быть верным в любой момент времени.

Синтаксис следующий:

CHOOSE( 
    (1 * (CONDITION_1)) + (2 * (CONDITION_2)) + ... + (N * (CONDITION_N)),
    RESULT_1, RESULT_2, ... , RESULT_N
)

При условии, что будет выполнено только одно из условий от 1 до N, все остальное равно 0, что означает, что числовое значение будет соответствовать соответствующему результату.

Если вы не уверены на 100%, что все условия являются взаимоисключающими, вы можете предпочесть что-то вроде:

CHOOSE(
    (1 * TEST1) + (2 * TEST2) + (4 * TEST3) + (8 * TEST4) ... (2^N * TESTN)
    OUT1, OUT2, , OUT3, , , , OUT4 , , <LOTS OF COMMAS> , OUT5
)

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

Честно говоря, не могу поверить, что мне потребовались годы, чтобы разобраться с этим, но я раньше этого не видел, поэтому решил оставить это здесь, чтобы помогать другим.

РЕДАКТИРОВАТЬ: В комментариях ниже @aTrusty: Глупые числа запятых можно исключить (и в результате оператор выбора будет работать до 254 случаев) с помощью формулы следующей формы:

CHOOSE(
    1 + LOG(1 + (2*TEST1) + (4*TEST2) + (8*TEST3) + (16*TEST4),2), 
    OTHERWISE, RESULT1, RESULT2, RESULT3, RESULT4
)

Обратите внимание на второй аргумент предложения LOG, который помещает его в базу 2 и заставляет все это работать.

Редактировать: за Ответ Дэвида , теперь есть реальное заявление о переключении, если вам повезло работать в офисе 2016. Помимо трудностей с чтением, это также означает, что вы получаете эффективность переключения, не только поведение!

14 голосов
/ 09 августа 2016

Функция переключения теперь доступна в Excel 2016 / Office 365

SWITCH (выражение, значение1, результат1, [значение по умолчанию или значение2, результат2],… [значение по умолчанию или значение3, результат3])

example:
=SWITCH(A1,0,"FALSE",-1,"TRUE","Maybe")

Поддержка Microsoft -Office

8 голосов
/ 30 марта 2011

Попробуйте это;

=IF(B1>=0, B1, OFFSET($X$1, MATCH(B1, $X:$X, Z) - 1, Y)

ГДЕ
X = столбцы, в которые вы индексируете
Y = количество столбцов слева (-Y) или справа (Y) от индексированного столбца, чтобы получить искомое значение
Z = 0, если точное совпадение (если вы хотите обрабатывать ошибки)

2 голосов
/ 16 января 2018

Я использовал это решение для преобразования однобуквенных цветовых кодов в их описания:

=CHOOSE(FIND(H5,"GYR"),"Good","OK","Bad")

Вы в основном ищите элемент, который пытаетесь декодировать в массиве, затем используете CHOOSE(), чтобы выбратьсвязанный элемент.Это немного компактнее, чем строить стол для VLOOKUP().

1 голос
/ 04 сентября 2018

Если у вас нет оператора SWITCH в вашей версии Excel (до Excel-2016), вот реализация VBA для него:

Public Function SWITCH(ParamArray args() As Variant) As Variant
    Dim i As Integer
    Dim val As Variant
    Dim tmp As Variant

    If ((UBound(args) - LBound(args)) = 0) Or (((UBound(args) - LBound(args)) Mod 2 = 0)) Then
        Error 450       'Invalid arguments
    Else
        val = args(LBound(args))
        i = LBound(args) + 1
        tmp = args(UBound(args))

        While (i < UBound(args))
            If val = args(i) Then
                tmp = args(i + 1)
            End If
            i = i + 2
        Wend
    End If

    SWITCH = tmp
End Function

Он работает точно так же, как и ожидалось, заменив, например, функцию SWITCH в Google Spreadsheet.

Синтаксис:

=SWITCH(selector; [keyN; valueN;] ...  defaultvalue)

, где

  • селектор - это любое выражение, которое сравнивается с ключами
  • key1, key2, ... - выражения, которые сравниваются с селектором
  • значение1, значение2, ... - это значения, которые выбираются, если селектор равен соответствующему ключу (только)
  • значение по умолчанию используется, если ни одна клавиша не соответствует селектору

Примеры:

=SWITCH("a";"?")                       returns "?"
=SWITCH("a";"a";"1";"?")               returns "1"
=SWITCH("x";"a";"1";"?")               returns "?"
=SWITCH("b";"a";"1";"b";TRUE;"?")      returns TRUE
=SWITCH(7;7;1;7;2;0)                   returns 2
=SWITCH("a";"a";"1")                   returns #VALUE!

Чтобы использовать его, откройте Excel, перейдите на вкладку Инструменты разработки, щелкните Visual Basic, щелкните правой кнопкой мыши на ThisWorkbook, выберите Вставить, затем Модуль, и, наконец, скопируйте код в редактор. Вы должны сохранить как книгу Excel для макросов (xlsm).

1 голос
/ 05 февраля 2015

Я понимаю, что это ответ на старый пост -

Мне нравится функция If () в сочетании с Index () / Match ():

=IF(B2>0,"x",INDEX($H$2:$I$9,MATCH(A2,$H$2:$H$9,0),2))

Функция if сравнивает то, что находится в столбце b, и если она больше 0, она возвращает x, если нет, она использует массив (таблицу информации), идентифицированный функцией Index () и выбранный Match () для возврата значение, которое соответствует.

Массив Index имеет абсолютное местоположение, установленное $H$2:$I$9 (знаки доллара), поэтому место, на которое он указывает, не изменится при копировании формулы. Строка со значением, которое вы хотите вернуть, идентифицируется функцией Match (). Функция Match () имеет дополнительное значение: ей не нужен отсортированный список для просмотра того, что требует Vlookup (). Match () может найти значение со значением: 1 меньше, 0 точно, -1 больше, чем. Я ставлю ноль после абсолютного Match () массива $H$2:$H$9, чтобы найти точное совпадение. Для столбца вводится то значение массива Index (), которое нужно вернуть. Я ввел 2, потому что в моем массиве возвращаемое значение было во втором столбце. Ниже мой индексный массив выглядел так:

32   1420

36   1650

40   1790

44   1860

55   2010

Значение в вашем столбце 'a' для поиска в списке находится в первом столбце в моем примере, а соответствующее значение, которое должно быть возвращено, находится справа. Справочная таблица может быть на любой вкладке в рабочей книге или даже в другом файле. -Book2 - это имя файла, а Sheet2 - это имя другой вкладки.

=IF(B2>0,"x",INDEX([Book2]Sheet2!$A$1:$B$8,MATCH(A2,[Book2]Sheet2!$A$1:$A$8,0),2))

Если вы не хотите, чтобы x возвращал, когда значение b больше нуля, удалите x для «пустого» / нулевого эквивалента или, возможно, поставьте 0 - не уверен, что вы хотите там.

Ниже показано начало функции с удаленным знаком x.

=IF(B2>0,"",INDEX...
1 голос
/ 02 июня 2014

Я знаю, что немного поздно ответить, но я думаю, что это короткое видео очень вам поможет.

http://www.xlninja.com/2012/07/25/excel-choose-function-explained/

По сути, оно использует функцию выбора.Он очень хорошо объясняет это в видео, поэтому я позволю сделать это вместо того, чтобы набирать 20 страниц.

В другом его видео объясняется, как использовать проверку данных для заполнения раскрывающегося списка, который можно выбрать из ограниченного диапазона..

http://www.xlninja.com/2012/08/13/excel-data-validation-using-dependent-lists/

Вы можете объединить два и использовать значение в раскрывающемся списке в качестве индекса для функции выбора.Хотя он не показал, как их объединить, я уверен, что вы можете понять это, поскольку его видео хороши.Если у вас возникли проблемы, дайте мне знать, и я обновлю свой ответ, чтобы показать вам.

0 голосов
/ 11 марта 2019

Если вы используете Office 2019 или Office 365, есть новая функция, которая действует аналогично функции CASE, которая называется IFS . Вот описание функции из документации Microsoft:

Функция IFS проверяет, выполняется ли одно или несколько условий, и возвращает значение, соответствующее первому условию TRUE. IFS может заменить несколько вложенных операторов IF, и его намного легче читать с несколькими условиями.

Ниже приведен пример использования:

=IFS(A2>89,"A",A2>79,"B",A2>69,"C",A2>59,"D",TRUE,"F")

Вы даже можете указать результат по умолчанию:

Чтобы указать результат по умолчанию, введите TRUE для вашего последнего аргумента логического_теста. Если ни одно из других условий не выполнено, будет возвращено соответствующее значение.

Функция результата по умолчанию включена в приведенный выше пример.

Подробнее об этом можно прочитать в Документация службы поддержки Microsoft

0 голосов
/ 18 января 2019

Microsoft заменяет SWITCH, IFS и IFVALUES только функцией CHOOSE.

=CHOOSE($L$1,"index_1","Index_2","Index_3")
...