Функция доступа для соответствия нескольким критериям для нескольких выходов (или Excel)

Мне интересно, есть ли простая функция, которая будет соответствовать определенным критериям для различных выходов. Довольно сложно описать, но то, что я хочу, это что-то вроде:

=function([criteria],[output],[criteria],[output],......) 

Так, например:

 =function([SiteID]=1,"Global",[SiteID]=2,"IT",[SiteID]=3,"DE",[SiteID]=4,"NL",[SiteID]=5,"AU") 

Я знаю, что я могу использовать инструкции If для этого, но это делает его очень сложным, надеясь, что для него существует простая функция, но его трудно найти, поскольку это сложные критерии.

Это было бы идеально для Access, но было бы очень полезно в Excel .

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

В полной реализации SQL у вас будет доступ к операторам CASE которые позволят нечто гораздо более близкое к тому, что вы действительно хотите. Я считаю, что настоящая жалоба на вложенные заявления IF или IIF заключается в том, как трудно их читать и поддерживать. Тем не менее, вы можете использовать IF несколько нетрадиционным способом, который вам может быть легче читать, например

 =If(<condition1>,"Output 1","") & If(<condition2>,"Output 2","") & If(<condition3>,"Output 3","") 

Однако, если выполнено более одного из условий, вы получите все выходные данные, возвращенные в той же ячейке / поле, с вложенным IF подходом вы получите только результат, соответствующий самому раннему условию. Один из способов обойти это (может быть, лучше) – сделать все выходы стандартной длиной (проложить их с пробелами), а затем обернуть всю вещь чем-то вроде

 =TRIM(LEFT(TRIM(<output from concatenated ifs as above>),<standardised length>)) 

Оригинальный ответ для «Точных» совпадений

В Excel естественным способом достижения этой цели является использование функции VLOOKUP . В Access вы присоединитесь к таблице. В обоих случаях вы хотите, чтобы таблица или диапазон сохраняли переводы:

 +--------+----------+ | SiteID | SiteName | +--------+----------+ | 1 | Global | | 2 | IT | | 3 | DE | | 4 | NL | | 5 | AU | +--------+----------+ 

В Excel

 =VLOOKUP( arg1, arg2, arg3, arg4) 

arg1 : ячейка, содержащая значение, которое вы хотите перевести

arg2 : диапазон, содержащий таблицу поиска

arg3 : номер столбца, который вы хотите вернуть из таблицы поиска. В этом случае 2.

arg4 : Тип соответствия. Вы хотите найти точное совпадение, поэтому укажите здесь FALSE (или ноль)

В доступе

Создайте новую таблицу под названием «Сайты» в своей базе данных и добавьте соответствующие данные. Теперь в окне запроса введите исходную таблицу, содержащую значения для поиска, и новую таблицу сайта. Нажмите и перетащите поле «SiteID» из основной таблицы в соответствующее поле в новой таблице сайта. Теперь вы можете добавить столбец SiteName в свой запрос.

Изменить: для интервальных совпадений, а не для точных совпадений

В Excel

В Excel вы можете использовать VLOOKUP для этого. Здесь я представляю себе такую ​​таблицу:

 +--------+------------------------------+ | Salary | CompanyCar | +--------+------------------------------+ | 0 | No company car | | 20000 | Access to shared company car | | 50000 | Own company car - basic | | 100000 | Own company car - executive | +--------+------------------------------+ 

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

Теперь используйте VLOOKUP как указано выше, но для аргумента 4:

arg4 : Тип соответствия. Это не точное совпадение (не уверен, как это назвать), поэтому укажите здесь TRUE (или 1)

В доступе

Добавьте дополнительный столбец в таблицу:

 +--------+------------------------------+------------+ | Salary | CompanyCar | UpperBound | +--------+------------------------------+------------+ | 0 | No company car | 20000 | | 20000 | Access to shared company car | 50000 | | 50000 | Own company car | 100000 | | 100000 | Executive level company car | NULL | +--------+------------------------------+------------+ 

Теперь вместо объединения двух таблиц просто попробуйте «поплавать» отдельно в окне запроса. Это создает то, что называется CROSS JOIN . Нам нужно ограничить совпадение только соответствующими строками, используя предложение WHERE .

В сетке для критериев добавьте Заработную плату и UpperBound. Все следующие критерии:

 +---------------------+-------------------------------+ | Salary | UpperBound | +---------------------+-------------------------------+ | <= [EmployeeSalary] | > [EmployeeSalary] or is null | +---------------------+-------------------------------+ 

В представлении SQL это эквивалентно:

 WHERE Salary <=[EmployeeSalary] and (UpperBound > [EmployeeSalary] or UpperBound is null) 

Я просто наткнулся на лучший ответ на этот вопрос. За годы, прошедшие с тех пор, как я прекратил использование MS Access, они представили новую встроенную функцию. Он работает почти так же, как тот, который я создал в исходной версии этого ответа. Он называется SWTICH доступа к SWTICH (*). Он работает следующим образом:

 Switch ( <condition1>, <output1> [,<condition2>, <output2> ... ] ) 

Если условие не выполнено, оно вернет NULL . Если вы хотите по умолчанию (например, ELSE ), просто установите последнюю парад из условия / TRUE, <default output> .

На момент написания этой страницы была доступна страница поддержки Microsoft для этой функции.

(*) Excel имеет функцию SWITCH , но она делает что-то еще.

Мой оригинальный ответ – все еще актуальный для Excel

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

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

 Function MULTI_IF(ParamArray Inputs()) As Variant Dim Output As Variant Output = False 'This is the output when no conditions are met For x = 0 To UBound(Inputs) - 1 Step 2 On Error GoTo ErrorStep '<-- Added to prevent errors being thown for NULLs and other bad input If CBool(Inputs(x)) = True Then Output = Inputs(x + 1) Exit For End If Next x MULTI_IF = Output Exit Function ErrorStep: Inputs(x) = False '<-- Assume condition is false where it can't be converted to Boolean Resume End Function 

Вы должны иметь возможность использовать его из Excel точно так же, как описано. После пробной версии в Access я добавил некоторую обработку ошибок (см. Комментарии выше) и включил их в редактирование здесь.

Если ни одно из условий не будет выполнено, оно выведет False . Вы можете изменить это в коде или когда вы используете функцию реализовать условие Else , создав конечную пару condition / output ...,TRUE,"Default Here") .

  • EXCEL увеличивает строку ячейки, на которую ссылается 11
  • Excel - разбиение содержимого с использованием средних и левых функций с переменной длиной Тема и возврат
  • Использование интерфейсов в vba для использования одной и той же функции для разных типов типов
  • как получить подпрограмму в excel vba, чтобы что-то вернуть?
  • Удаление определенных слов из строки текста в Excel
  • Количество уникальных идентификаторов среди дубликатов
  • запись формулы excel с несколькими параметрами для одного параметра
  • Excel не отбрасывает исходные данные, несмотря на слияние ячеек, что вызывает проблемы с функциями (например, сумма)
  • Суммируйте последние два числа в отфильтрованном столбце в Excel
  • Расчет Excel UDF должен возвращать «исходное» значение
  • Использование реестра для установки принтера по умолчанию Только VBA, когда принтер активен
  • Давайте будем гением компьютера.