在excel公式中反转行

时间:2010-02-04 18:43:29

标签: excel

(A)SumProduct(A1:A3,B1:B3)== A1 * B1 + A2 * B2 + A3 * B3

相反,我所追求的是

(B)SumProduct(A1:A3,Reverse(B1:B3))== A1 * B3 + A2 * B2 + A3 * B1

在excel 2003 / excel 2007中有没有一种干净的方法来实现这一目标?这些值的自然排序是A1-> A3和B1-> B3,因此逆转细胞的含义是不令人满意的;但是在工作表的其他地方创建B1:B3的反转副本似乎很笨拙。

3 个答案:

答案 0 :(得分:3)

检查http://www.cpearson.com/EXCEL/lists.htm

中的“转置数据列表”主题

答案 1 :(得分:2)

我偶然发现了这个问题,因为我试图找到这个问题的答案,特别是与SUMPRODUCT一起使用的解决方案。

以前的帖子链接很有用,并且已经设计了以下内容。请注意,为简单起见,原始引用已更改,以使电子表格公式更易于理解。如果需要对列进行反转,则可以使用INDIRECT和R1C1参考样式实现必要的更改(INDIRECT,COLUMN和COLUMNS函数文档将证明是有用的)。

在Excel中(在Excel 2010中检查),在A6:A8中使用B6:B8中的数组的反转SUMPRODUCTs数组的公式(让我们说B8:B6)可以是

=SUMPRODUCT(A6:A8,N(OFFSET(B6:B8,ROWS(B6:B8)-ROW(INDIRECT("A1:A"& ROWS(B6:B8))),0)))

Excel的反转部分是N(OFFSET(B6:B8,ROWS(B6:B8)-ROW(INDIRECT("A1:A"& ROWS(B6:B8))),0)),它也可以在任何地方用作多单元数组公式(ctrl-shift-enter) - 要反转的数组是B6:B8。

简要说明:{OF}需要N()将OFFSET返回的引用转换为可在SUMPRODUCT中使用的值数组。 (OFFSET没有N()使公式在SUMPRODUCT中失效,并且它将大多数非数字转换为0,正如预期的那样,它将TRUE转换为1.)

OFFSET获取电子表格中的数组,并以相反的顺序放置值。 (在这种情况下,在3-1 = 2时偏移原始数据到新数组位置0,3-2 = 1变为1,最后3-3 = 0变为2.)ROW()函数创建一个连续数字数组可以从总数组的长度中减去[请注意,没有最终的S,A1:A3用于获得{1,2,...},直到原始数组/范围内的行数]

此公式在OpenOffice / LibreOffice电子表格应用程序中不起作用。但INDEX可以通过模拟方法变得更加灵活。

OpenOffice / LibreOffice可以使用相同的方法但使用INDEX函数。 OpenOffice / LibreOffice解决方案在Excel中不起作用,因为Excel不接受INDEX的row_num / col_num中的数组(任何数组作为参数,成为数组的单个顶部元素)。

在OpenOffice / LibreOffice中(在Apache OpenOffice 4中检查),在A6:A8中SUMPRODUCT一个数组的公式与B6:B8中的数组的反转可能是

=SUMPRODUCT(A6:A8,INDEX(B6:B8,1+ROWS(B6:B8)-ROW(INDIRECT("A1:A"& ROWS(B6:B8))),0))

OpenOffice的反转部分是INDEX(B6:B8,1+ROWS(B6:B8)-ROW(INDIRECT("A1:A"& ROWS(B6:B8))),0),它也可以在任何地方用作多单元数组公式(ctrl-shift-enter) - 要反转的数组是B6:B8。

使用这种方法的Excel版本(谢谢,XOR LX:see here)这可能非常有用,因为INDEX可以采用数组,而OFFSET只能引用工作表:

=SUMPRODUCT(A6:A8,INDEX(B6:B8,N(INDEX(1+ROWS(B6:B8)-ROW(INDIRECT("A1:A"& ROWS(B6:B8))),,)),0))

[正如Excel上面的OFFSET版本所发生的那样,带有N(INDEX([...] ,,)修改的公式在OpenOffice中不起作用,如果使用包装函数必须取出那个申请。]

该方法类似于Excel中用于OFFSET的方法。考虑到INDEX使用从1开始的索引而OFFSET从0开始。与前一种情况一样,从A1:A3中的行号动态创建数组,以用作数组和位置变化索引的模板

这个非常晚的答案不太可能对原版海报有所帮助,但它可以为未来有类似问题的用户节省时间。

答案 2 :(得分:1)

我看不到一个解决方案,它不涉及(a)VBA(或类似)中的自定义函数或(b)带有部分结果的额外列。

如果你不喜欢C列成为(隐藏)反向列表,你会接受C列成为如下列表:A1 * B3,A2 * B2,A3 * B1,然后可以求和吗?可以使用与@ e.tadeu的答案中提到的类似的公式来获得它(使用OFFET和ROW函数。)