在公式中反转Excel中的列表

j8yoct9x  于 2023-01-14  发布在  其他
关注(0)|答案(7)|浏览(140)

所以有很多方法可以反转一个列表,把它变成一个新的列表,使用helper列,我已经写了一些代码,确实使用helper列来反转一个列表,然后使用它。
我想知道如何在sumproduct中不使用helper列的情况下反转列表-例如,

=sumproduct(Reverse(A1:A3),B1:B3)
lf3rwulv

lf3rwulv1#

此数组公式将反转垂直数组的顺序:

= INDEX(B18:B21,N(IF({1},MAX(ROW(B18:B21))-ROW(B18:B21)+1)))

此外,这将反转水平阵列:

= INDEX(A1:D1,N(IF({1},MAX(COLUMN(A1:D1))-COLUMN(A1:D1)+1)))
    • 编辑**

更一般地说,要垂直翻转一个 * matrix *,而不仅仅是一个 * array *(它只是一个一维矩阵),请使用以下数组公式:(例如,范围A1:D2

= INDEX(A1:D2,N(IF({1},MAX(ROW(A1:D2))-ROW(A1:D2)+1)),
              N(IF({1},COLUMN(A1:D2)-MIN(COLUMN(A1:D2))+1)))

要水平翻转矩阵,请使用以下命令:

= INDEX(A1:D2,N(IF({1},ROW(A1:D2)-MIN(ROW(A1:D2))+1)),
              N(IF({1},MAX(COLUMN(A1:D2))-COLUMN(A1:D2)+1)))

还有一个额外的好处......可以在一次拍摄中水平翻转矩阵和垂直翻转矩阵(即旋转180度):

= INDEX(A1:D2,N(IF({1},MAX(ROW(A1:D2))-ROW(A1:D2)+1)),
              N(IF({1},MAX(COLUMN(A1:D2))-COLUMN(A1:D2)+1)))

实际上,这里的最后一个可以更普遍地用于翻转水平或垂直阵列。

ftf50wuq

ftf50wuq2#

这将满足您的要求:

=SUMPRODUCT(INDEX(A:A,N(IF(1,{3;2;1}))),B1:B3)

要使其更动态一些,可以使用以下数组公式:

=SUM(INDEX(A:A,N(IF(1,LARGE(ROW(A1:A3),ROW(A1:A3)))))*B1:B3)

由于是数组公式,在退出编辑模式时需要使用Ctrl-Shift-Enter确认,而不是使用Enter。

x0fgdtte

x0fgdtte3#

找到了一个在最新Excel版本中工作的简单解决方案:

=SORTBY(*rowarray*, column(*rowarray*),-1)

=SORTBY(*columnarray*, row(*columnarray*),-1)
eufgjt7s

eufgjt7s4#

不管怎样,这里有另一种完全不同的方法来反转数组(我将其作为一个单独的答案发布,只是因为它与我已经提供的另一个答案是苹果和桔子)。
除了通过反转索引来反转数组的顺序之外,还可以使用矩阵乘法(MMULT)来实现这一点。
例如,如果A1:A3中的数据为{1;3;5},则以下矩阵乘法可有效地反转此数组:

[0 0 1]   [1]   [5]
[0 1 0] * [3] = [3]
[1 0 0]   [5]   [1]

为了生成上面10的矩阵,可以这样做(为了可读性,添加了换行符):

= (ROW(INDEX(A:A,1):INDEX(A:A,ROWS(A1:A3)))=
  (COLUMN(INDEX(1:1,ROWS(A1:A3)))-COLUMN(INDEX(1:1,1):INDEX(1:1,ROWS(A1:A3)))+1))+0

所以最后,反转这个数组的公式是:

= MMULT((ROW(INDEX(A:A,1):INDEX(A:A,ROWS(A1:A3)))=
  (COLUMN(INDEX(1:1,ROWS(A1:A3)))-COLUMN(INDEX(1:1,1):INDEX(1:1,ROWS(A1:A3)))+1))+0,A1:A3)

同样的思路也可用于反转水平数组。例如,如果A1:C1{1,3,5},则:

[0 0 1]
[1 3 5] * [0 1 0] = [5 3 1]
          [1 0 0]

注意10的矩阵这次是第二个参数而不是第一个参数。
使用相同的一般推理路线,您可以得到反转水平数组的公式。

= MMULT(A1:C1,(ROW(INDEX(A:A,1):INDEX(A:A,COLUMNS(A1:C1)))=
  (COLUMN(INDEX(1:1,COLUMNS(A1:C1)))-COLUMN(INDEX(1:1,1):INDEX(1:1,COLUMNS(A1:C1)))+1))+0)

N(IF(...))解决方案相比,该方法具有两个主要缺点,即:
1.它的方式更长。
1.它只适用于数字,因为MMULT需要数字,但是如果单元格包含任何内容(例如文本),则另一种方法有效。
直到最近我才了解到N(IF(...))替代方法,我一直在使用这个解决方案来反转没有helper列的数组。

lyfkaqu1

lyfkaqu15#

实际上,您可以让Question中的公式工作 (使用一个小UDF())
选择一个单元格并输入:

=SUMPRODUCT(reverse(A1:A3),B1:B3)

在一个标准模块中:

Public Function reverse(rng As Range)
    Dim ary(), N As Long, i As Long
    N = rng.Count
    ReDim ary(1 To N)
    i = N

    For Each r In rng
        ary(i) = r.Value
        i = i - 1
    Next r

    With Application.WorksheetFunction
        reverse = .Transpose(ary)
    End With
End Function

k97glaaz

k97glaaz6#

使用动态数组

这是我找到的最好的解决办法。

=SORTBY(list,SEQUENCE(ROWS(list),1,ROWS(list),-1))

https://exceljet.net/formula/reverse-a-list-or-range

llew8vvj

llew8vvj7#

= INDIRECT(ADDRESS(ROW()+COUNTA(A1:$A$3)+1-ROW(A1),1))

相关问题