为什么工作表IF()函数的语法具有与UDF不同的可选参数?

4 excel vba if-statement worksheet-function excel-vba

从来没有真正深入思考这个,但为什么=IF()函数要求你传递逗号,即使最后2个参数是可选的?

=IF(logical_test, [value_if_true], [value_if_false])
Run Code Online (Sandbox Code Playgroud)

为什么我们不能称之为

=IF(TRUE)
Run Code Online (Sandbox Code Playgroud)

获取TRUE(logical_test评估为TRUE 时的默认返回值)

我们不得不称它为中间提供两个逗号,即使在保留参数缺失/空...

=IF(TRUE, ,)
Run Code Online (Sandbox Code Playgroud)


在UDF中使用可选参数时,我们不需要传递逗号(原始IF的版本更简单,错误处理未实现,因为这里不需要)

Public Function MYIF(logical_test, Optional value_if_true$ = "TRUE", Optional value_if_false$ = "FALSE")
    MYIF = IIf(Evaluate(logical_test), value_if_true, value_if_false)
End Function
Run Code Online (Sandbox Code Playgroud)

从电子表格调用时,我们可以省略逗号

=MYIF(TRUE)
Run Code Online (Sandbox Code Playgroud)

任何人,除了Spolsky;),都知道为什么我们需要在使用本机时提供逗号=IF()


我在Excel 2010中,但只是注意到2007需要2个参数 ..但是,在2010年,函数定义显示第一个需要,最后2个可选.任何解释?


更新:

我知道=1=1=AND(TRUE,FALSE)语法,我不是在寻找替代短版本的=IF().相反,我要问的是

为什么需要提供原始逗号,=IF()因为最后2个参数是可选参数?

Jea*_*ett 5

"可选参数"显然对Excel函数有两个不同的含义:

  1. 可选参数可以省略;

  2. 可以省略可选参数的.

有时两者都被允许,有时只允许#2.

查看以下文档IF:

IF(logical_test, [value_if_true], [value_if_false])

[...]

value_if_false 可选的.[...]

如果logical_test求值为FALSE省略value_if_false参数 [...],则该IF函数返回逻辑值FALSE.

如果logical_test计算结果为FALSE的值value_if_false省略参数 [...],该IF函数返回值0(零).

好的,两者都是允许的.所以=IF(FALSE,)(参数省略)返回FALSE,而=IF(FALSE,,)(参数那里但值省略)返回0.

但是对于这个value_if_true论点,根据文档只允许选项#2.没有规定完全省略这一论点; 仅支持省略其值.所以=IF(TRUE,)=IF(TRUE,,)(参数那里但值省略)都返回0,而=IF(TRUE)(完全省略参数)不受支持,因此不编译.

以上描述了记录和支持的行为.当然,这并不能回答"为什么"就是这样的更深层次的问题.我的回答是,我不知道.我确信Excel的制造商有充分的理由,或者至少认为他们做到了.


至于UDF,它们是用VBA编写的,它们的Optional参数由VBA的规则控制,这些规则是不同的.在VBA函数中没有省略"参数的值"这样的事情.