一元加运算符在Excel公式中做什么?

这看似平凡的操作可以在公式中的许多情况下有用:

A。 否则会抛出错误的函数:

QUOTIENT(+A1:A3,4) WORKDAY(+A1:A3,7) 

B。 将范围转换为数字 – 即任何文本为零:

 N(+A1:C3) 

C。 返回来自不同工作表的混合数据的数组:

 CELL("contents",IF(1,+INDIRECT({"Sheet1!A1","Sheet2!B2","Sheet3!C3"}))) 

我在这方面发现很less – 也许这是一个新的发现。

这个问题部分是出于利益的考虑,部分是为了看看是否有人可以进一步阐明或寻找其他可能的应用 – excel或vba相关?

在其中一些例子中,例如WORKDAYQUOTIENT+正在将范围转换为数组

许多旧的Analysis ToolPak函数,如WORKDAYNETWORKDAYSWEEKNUM等不会接受范围作为参数,但在Excel 2007或更高版本的Excel版本中,他们将接受数组作为参数 – 使用+0-- (或显然+)将范围转换为一个数组,所以在Excel 2007中,如果你使用这样的公式:

=AVERAGE(WEEKNUM(A1:A3))

A1:A3包含date

….它会返回一个错误

但是这个版本(使用CTRL + SHIFT + ENTERinput的数组)将会为您提供星期数的平均值:

=AVERAGE(WEEKNUM(+A1:A3))

有趣的问题。 这显然是某种幕后的types转换。 我还没有在C中testing过你的例子,但是有趣的是,在前两种情况下,一元+可以被+ 0或者Value()代替:

 QUOTIENT(A1:A3 + 0,4) WORKDAY(A1:A3 + 0,7) N(A1:C3 + 0) 

要么

 QUOTIENT(Value(A1:A3),4) WORKDAY(Value(A1:A3),7) N(Value(A1:C3)) 

至于为什么会发生这种情况 – 我不知道。 有些函数似乎将它们的参数作为string传递给Excel,当在数组公式中使用它们并将0(这是一元加号所做的)强制它们转换为数字时。 在VBA中,我不认为应该使用这个技巧,因为它会导致代码模糊,但是知道数组公式会很有用。

各种testing证实Barry Houdini提出的arrays解释范围。 我在这里提供了一些VBE观察窗口的结果供参考:

在这里输入图像说明

监视窗口返回在正常公式评估窗口中不可用的返回数据types的有价值的细节。 请注意, [+A1:A3]返回一个variables数组,而[A1:A3]返回一个范围引用。 该方法还显示OFFSET和带数组参数的INDIRECT返回范围引用的数组。 要强制进行数组评估,可以在TRANSPOSE包装公式。

作为一种常规技术,将公式复制到即时窗口中,并将其放在方括号中,然后在即时窗口中select公式并拖到观察窗口。 通常不需要单独的代码,但VBA评估方法(或[]快捷方式)不像CELLINDIRECT 。 检查这种公式的解决方法是使用下面的代码粘贴到一个新的模块:

 Dim v Function eval(formula As String) v = Empty With Application .Goto "SetV(" & .ConvertFormula(formula, xlA1, xlR1C1) & ")" End With eval = v End Function Public Function SetV(Value) As Range v = Value Set SetV = Selection End Function