Excel 是否有缩短嵌套If…Then…Else语句的方法?

Excel 是否有缩短嵌套If…Then…Else语句的方法?,excel,vba,Excel,Vba,我正在尝试创建自定义Excel函数,以减少我所在部门的体力劳动 该函数可以工作,但会将32位Excel冻结一分钟以上。作为参考,平均工作负载大于10000行输入 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

我正在尝试创建自定义Excel函数,以减少我所在部门的体力劳动

该函数可以工作,但会将32位Excel冻结一分钟以上。作为参考,平均工作负载大于10000行输入

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崩溃的风险并简化处理。

放弃整个函数,添加新的工作表,如果必须隐藏它,在A1中键入阈值,在A2中键入值,然后开始填充查找表Ctrl+T,使其成为实际表,然后命名,例如refTable:

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

=IFERROR(VLOOKUP(refTable[[Threshold]:[Value]], B2, TRUE), B2)
TRUE final参数使函数匹配第1列中不大于查找值的最大值,因此4256将匹配4200阈值,在4300以下停止

这假设查找值不能用简单的数学计算,即5710结果不是打字错误。否则,有一个简单的、性能更好的替代方案:

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

如果输入大于或等于1100,取该输入的整数值除以100,再乘以100,可能还有一种方法可以使用舍入函数;否则只需返回输入。时间的问题不在于IF/ELSEIF/ELSE函数,而在于迭代的行数大于10000行。将值批量加载到变量数组中并迭代该数组。对该函数所做的任何操作都不会加快代码的速度。如果有切点,可以使用二进制搜索查找某个对象所在的时间间隔,但如果Excel处于冻结状态,这不可能是主要问题。对于一个具体的例子,二进制搜索可以通过嵌套的条件来实现,这些条件实现了可读性、性能、可维护性和代码质量方面的功能。。。低声明变量总是…明智的-有没有理由将数值作为文本输出?另外,不要将数值与数字格式混为一谈-如果此函数意味着输出任何用于或可能用于任何类型数学的内容,则您需要的是数字,而不是看起来像数字的字符串。最后,考虑使用一个显式的转换函数,比如CLNG,而不是VAL,这样当区域设置和不同的工作站使用不同的小数分隔符时,你可能会遇到问题。马蒂厄,非常感谢你的另一种解决方案。表是我最初用作规则引用的,它已经包括阈值,我将其命名为lower_limit、upper_limit和result。如果我的理解正确,我可以将您提供的VLOOKUP公式中的列名替换为我自己的列名。在任何情况下,我都会尝试这个解决方案,并让您知道它是否有效。再次感谢您的帮助。@Marat_Muginov您只需要下限-最重要的部分是升序排序,也是VLOOKUP真正的最终参数。
=IF(B2>=1100,INT(B2/100)*100,B2)