Есть ли способ сокращения вложенных операторов If ... Then ... Else? - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь создать пользовательские функции Excel, чтобы уменьшить количество умственных задач в моем отделе.

Функция работает, но замораживает 32-битный Excel на минуту.Для справки, средняя рабочая нагрузка составляет> 10 000 строк ввода.

Function Function_Name(Input)
If Val(Input) = 0 Then
    Function_Name = Input
    ElseIf Val(Input) = 1 Then Function_Name = Input
    ElseIf Val(Input) >= 1110 And Val(Input) <= 1999 Then Function_Name = "1110"
ElseIf Val(Input) >= 3100 And Val(Input) <= 3199 Then Function_Name = "3100"
'Similar ElseIf statements go on for 40+ lines......'
ElseIf Val(Input) >= 5700 And Val(Input) <= 5799 Then Function_Name = "5710"
'Note that they do not always return the lower limit of Val(Input), but sometimes may'
End If
End Function

Функция обеспечивает точный вывод, однако обработка занимает много времени.Я хотел бы знать, есть ли способ улучшить внутреннюю логику, чтобы уменьшить риск сбоев Excel и оптимизировать обработку.

1 Ответ

1 голос
/ 26 сентября 2019

Удалите всю функцию, добавьте новый лист (скройте его, если необходимо), введите «Порог» в A1, «Значение» в A2, затем начните заполнять таблицу поиска (Ctrl + T), чтобы сделать ее действительной таблица , затем назовите ее, например, refTable):

Threshold   Value
        0   =NA()
     1100   1100
     1200   1200
     1300   1300
      ...   ...

Теперь, где бы вы ни использовали эту функцию (где B2 - ваш текущий «вход»):

=IFERROR(VLOOKUP(refTable[[Threshold]:[Value]], B2, TRUE), B2)

Последний аргумент TRUE заставляет функцию соответствовать наибольшему значению в столбце 1, которое не превышает значение поиска, поэтому 4256 будет соответствовать порогу 4200 с остановкой на уровне 4300.

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

=IF(B2>=1100,INT(B2/100)*100,B2)

Если входное значение больше или равно 1100, возьмите целочисленное значение этого входного значения, разделенное на 100, умножьте его на 100 (возможно, естьспособ использовать для этого также функцию округления);в противном случае просто верните ввод.Это должно вычислить почти мгновенно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...