一元加运算符在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相关?
在其中一些例子中,例如WORKDAY
和QUOTIENT
, +
正在将范围转换为数组
许多旧的Analysis ToolPak
函数,如WORKDAY
, NETWORKDAYS
, WEEKNUM
等不会接受范围作为参数,但在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评估方法(或[]快捷方式)不像CELL
或INDIRECT
。 检查这种公式的解决方法是使用下面的代码粘贴到一个新的模块:
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