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

时间:2015-06-27 15:45:10

标签: excel excel-vba excel-formula vba

这个看似微不足道的操作在公式中的许多情况下都很有用:

A 即可。否则会引发错误的函数:

N(+A1:C3)

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

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

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

'$lastname'

我对此几乎没有发现 - 也许这是一个新发现。

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

3 个答案:

答案 0 :(得分:5)

在某些例子中,例如对于WORKDAYQUOTIENT+正在将范围转换为数组

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

=AVERAGE(WEEKNUM(A1:A3))

其中A1:A3包含日期

....它会返回错误

但是此版本(使用 CTRL + SHIFT + ENTER 输入的数组)将为您提供周数的平均值:< / p>

=AVERAGE(WEEKNUM(+A1:A3))

答案 1 :(得分:1)

有趣的问题。这显然是某种幕后类型转换。我还没有在C中测试过您的示例,但有趣的是,在前两种情况下,一元+可以被+ 0或Value()替换:

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

jekyll

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

答案 2 :(得分:1)

各种测试证实了Barry Houdini提出的阵列解释的范围。我在VBE观察窗口中包含了一些结果供参考:

enter image description here

监视窗口返回返回的有价值的详细信息,这些详细信息在常规公式评估窗口中不可用。请注意,[+A1:A3]返回变量数组,而[A1:A3]返回范围引用。此方法还显示带有数组参数的OFFSETINDIRECT返回范围引用的数组。要强制进行数组评估,可以将公式包装在TRANSPOSE中。

作为一般技术,将公式复制到即时窗口并用方括号括起来,然后在即时窗口中选择公式并拖动到监视窗口。通常不需要单独的代码,但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