我正在用ASP.NETMVC创建一个ExcelElectron 表格.
当我设置具有范围的公式时
cell.Formula = "=SUM(FLOOR(I2:I12/2,0.01))";
Excel在该范围前添加@
=SUM(FLOOR(@I2:I13/2,0.01))
Excel无法计算此公式,它显示为#VALUE!
我怎么能在没有得到@
符号的情况下设置这个公式呢?
我正在用ASP.NETMVC创建一个ExcelElectron 表格.
当我设置具有范围的公式时
cell.Formula = "=SUM(FLOOR(I2:I12/2,0.01))";
Excel在该范围前添加@
=SUM(FLOOR(@I2:I13/2,0.01))
Excel无法计算此公式,它显示为#VALUE!
我怎么能在没有得到@
符号的情况下设置这个公式呢?
我无法访问您正在使用的Excel版本(2013),但以下是我对您所看到的问题的理解.如果你只是说FLOOR(I2:I13/2,0.01)
,那么预期的行为是模棱两可的:
I2:I13
的范围内.I2:I13
开始 for each 单元格创建一个楼层单元格.当Excel添加对动态数组的支持时,他们更改了公式语言以消除两种行为的歧义:
Excel升级后的公式语言与旧语言几乎相同,只是它使用@运算符来指示可能发生隐式交集的位置,而旧语言则以静默方式执行此操作.因此,在动态数组Excel.It's important to note that your formulas will continue to calculate the same way they always have中打开时,您可能会注意到@‘S出现在一些公式中.
如果在新版本的Excel中打开较旧的Excel文件,您将看到他们在范围前添加了一个@
符号,以表明它使用隐式交集行为--@
符号告诉新版本的Excel使用与旧版本相同的行为.因此,我可以使用FLOOR(@I2:I13/2,0.01)
来模拟旧的Excel行为:
2
到13
的一行上,这将给出第I
列中的值在该行的下限.#VALUE!
.我suspect(但无法测试),保存文件与公式中的@
仍然会留下文件向后兼容的旧版本,因为它应该使用预先存在的行为.
现在,如果我使用公式SUM(FLOOR(@I2:I13/2,0.01))
,它不会给出从I2
到I3
的所有楼层的总和:它给出的是与当前单元格相同行的single cell层的总和.因为只有一个单元格,所以总和等于该单元格的FLOOR(@I2:I13/2,0.01)
.由于这模仿了旧版本的Excel的行为,我猜这就是为什么您会看到#VALUE!
的结果:您的单元格在2到13的范围之外的行中.
换句话说,我认为你看到的是你试图使用的公式的自然结果,即使你在Excel 2013中手动将原始公式输入到该单元格中,你也会看到同样的行为.
另一方面,SUMPRODUCT
function意味着要在数组上执行操作,我认为这是您想要的工作方式.如果您使用SUMPRODUCT(FLOOR(I2:I13/2,0.01))
,这应该不会触发隐式交集,因此它不会添加@
符号,您应该得到给定范围内所有单元格的楼层总和.SUMPRODUCT
可以追溯到Excel2007.