有没有一种缩短嵌套的If ... Then ... Else语句的方法?

时间:2019-09-25 20:14:19

标签: excel vba

我正在尝试创建自定义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 个答案:

答案 0 :(得分:1)

取消整个功能,添加一个新工作表(如果需要,可以隐藏它),在A1中键入“阈值”,在A2中键入“值”,然后开始填充查找表(Ctrl + T)以使其成为实际的< em> table ,然后命名,例如refTable):

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

现在无论您在哪里使用该功能(其中B2是您当前的“输入”):

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

最终的TRUE参数使函数与第一列中的最大值匹配,该最大值不大于查找值,因此4256将与4200阈值匹配,直到4300为止。

假设无法通过简单的数学计算得出查找值(即5710结果不是错字)。否则,有一个简单的,性能更好的替代方法:

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

如果输入大于或等于1100,则将该输入的整数值除以100,再乘以100(可能还有一种使用舍入函数的方法);否则,只需返回输入即可。那应该很快就可以计算出来。