Excel:对数据集进行sorting的公式

我有一个Excel数据表,它看起来像这样: 在这里输入图像说明

我基本上想创build一个公式,将在电子表格的另一部分创build表格,但只显示上面的索引值,但仍按datesorting。 如果您要过滤只显示索引大于0.5但仍按升序排列的行,则情况也是如此。

我不知道如何开始这个,任何帮助表示赞赏。

该解决scheme使用5个function:

  • IFERROR
  • 指数
  • 骨料
  • 比赛

基于上述公式,这应该适用于Excel 2010及以上版本。

我做了一个调整你的源数据,这是我给它一个date的标题。 如果这是一个问题,我们可以硬编码列查看。

IFERROR函数用作捕获所有显示“”而不是错误消息,当您复制公式超出结果的数量。 在这种情况下,它只是一个格式化的东西。

INDEXfunction是我们在解决scheme中的主力。 INDEX函数的格式是:

 INDEX(range/array/table to search in, row to look in, column to look in) 

在你的情况下,我假设源数据在A2开始,去D11和行1是一个标题行。 这导致公式的开发看起来如此:

 IFERROR(INDEX($A$2:$D$11,row number, column number),"") 

让我们先看看那个列号,因为它更容易一些。 我假设我们正在build立以J1开头的新表。 所以在J2中,我需要确定我们需要查看源表中的哪一列。所以我使用MATCH函数:

 MATCH(What I am look for, In this 1D range, for a match type of 1,0 or -1) 

所以在这个例子中,它变成:

 MATCH(J$1,$A$1:$D$1,0) 

注意正在使用的锁$。 J没有锁,所以我们复制权J会改变,但$ 1不会。

现在我们可以用这个替代方法代替我们正在开发的方程:

 IFERROR(INDEX($A$2:$D$11,row number,MATCH(J$1,$A$1:$D$1,0)),"") 

现在我们只需要find要查找的行号。我们将使用一个称为AGGREGATE的特殊函数。 是什么使得它特别的是:A)它有许多function,B)至less有两个这些function将执行ARRAY公式计算,而不使公式成为一个数组。 我们将使用数组部分来开发符合我们标准的行号列表。 你的例子只有1个标准,那就是索引必须大于5.从数组构build列表看起来像这样:

 ROW($A$2:$D$11)*($B$2:$B$11>$H$3) 

H3是我存储的条件编号的单元格。它locking它,所以它不会随着公式的复制而改变。 我们正在使用的范围也一样。 这将生成一个0和行号的列表。 AGGREGATE函数有第二个参数,我们可以用来忽略错误。 因此,如果我们能够做出所有这些错误,他们将被忽略,而不是我们最终结果的一部分。 我们可以通过除以逻辑testing来做到这一点,这个testing产生1为真,0为假。 这将改变上述公式:

 ROW($A$2:$D$11)/($B$2:$B$11>$H$3) 

由于示例列表按照升序sorting,我们希望保留该顺序,因此我们将告诉聚合以保持行号按升序sorting,因此将需要使用聚合的SMALL子函数。 因此,AGGREGATE函数将如下所示:

 AGGREGATE(15,6,ROW($A$2:$D$11)/($B$2:$B$11>$H$3),SOME K VALUE) 

几乎在那里,只需要弄清楚什么是价值。 这实际上只是一个整数计数器,我们需要从1开始,每增加一个复制下来。 所以我们使用行function。

选项A)

 ROW(A1) 

选项B)

 ROW(A2)-1 

如果单元格A1移动到某个地方,我会select使用选项B,这会使我们感到困惑。 由于A2不太可能被移动,所以我使用它。 -1是减去A2之上的标题行数。 现在AGGREGATE函数看起来像这样:

 AGGREGATE(15,6,ROW($A$2:$D$11)/($B$2:$B$11>$H$3),ROW(A2)-1) 

当我们复制下来的时候,会给我们提供一个行号列表。 为了使它相对于我们正在查找的索引范围,我们将需要从结果中减去1以得到正确的索引号。

 AGGREGATE(15,6,ROW($A$2:$D$11)/($B$2:$B$11>$H$3),ROW(A2)-1)-1 

现在我们知道要在哪一行看什么列以及我们在看什么表,所以我们的最终function应该是:

 =IFERROR(INDEX($A$2:$D$11,AGGREGATE(15,6,ROW($A$2:$D$11)/($B$2:$B$11>$H$3),ROW(A2)-1)-1,MATCH(J$1,$A$1:$D$1,0)),"") 

概念validation

概念验证

但回到这个公式版本,如果date看起来是增加的,那就用这个来得到第一行的索引> .5(例如)G2

 =IFERROR(INDEX(A$2:A$11,MATCH(TRUE,($B$2:$B$11>0.5),0)),"") 

这将获得从G3开始的下一行: –

 =IFERROR(INDEX(A$2:A$11,MATCH(1,($B$2:$B$11>0.5)*($A$2:$A$11>$G2),0)),"") 

其中这两个都需要input数组公式使用Ctrl Shift Enter

VBA解决scheme可能看起来像这样。 正如你所看到的,第一种方法很老派:其他人可能会提出一个更短的方法,但正如在评论中提到的那样,这很简单。

 Sub CopyFilter() Dim sht As Worksheet Dim fromRange, toRange As Range Dim LastRow, LastCol, fromRow, toRow As Long Dim i, j As Long Set sht = ThisWorkbook.Worksheets("Sheet1") Set fromRange = Range("A1") Set toRange = Range("G1") LastRow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row LastCol = sht.Range("A1").CurrentRegion.Columns.Count toRange.CurrentRegion.ClearContents ' Copy Header For j = 1 To LastCol toRange.Cells(1, j) = fromRange.Cells(1, j) Next j 'Copy data toRow = 1 For i = 2 To LastRow If fromRange.Cells(i, 2) > 0.5 Then toRow = toRow + 1 For j = 1 To LastCol toRange.Cells(toRow, j) = fromRange(i, j) Next j End If Next I End Sub 

我不得不承认,这种更现代的方法要短得多,而且还要复制格式(date)而不仅仅是数值: –

 Sub QuickFilter With ActiveSheet.Range("A1") 'Select .CurrentRegion.Select ' Filter in place .AutoFilter _ field:=2, _ Criteria1:=">" & ActiveSheet.Range("H3").Value ' Copy Selection.Copy Destination:=ActiveSheet.Range("J1") 'Clear filters .AutoFilter 'Clear selection .Select End With End Sub 

在这里输入图像说明 学分到@ n8