按日期范围显示在新选项卡上的过滤列表
A filtered list displayed on a new tab by date ranges
Excel好久不在我的范围内了,这个感觉很简单。寻找用于过滤列表的公式,但结果位于新选项卡上。
我发现的最接近的东西是这个 FILTER 函数,但正如网站上所说,它是将于 2019 年发布的一项新功能。所以我无法访问它,因为我正在使用 Excel 2013.
我正在尝试过滤日期范围字段,因此本周的所有条目都将过滤到新选项卡。
因此,在新选项卡上使用 2019 年 10 月 6 日至 2019 年 10 月 12 日这一周的日期进行过滤将 return 仅显示前 2 行。
我已经尝试过 FILTER 功能,不,它在 MS Excel 2013 中不起作用。我也查看了 VLOOKUP,不。我知道 PIVOT 不是我想要的。我想避免 VBA 脚本编写,因为这最终会交给非开发人员。
最后过滤当前table不会满足我的objective.
此处有多条通往罗马的道路,但我们假设 Sheet1
上的示例数据:
公式(只是一个例子)
这是我在 Sheet2
上的结果:
A2
中的公式:
=IFERROR(INDEX(Sheet1!A:A,SMALL(IF((Sheet1!$A:$A>=TODAY()-WEEKDAY(TODAY(),2)+1)*(Sheet1!$A:$A<=TODAY()-WEEKDAY(TODAY())+7)=1,ROW(Sheet1!$A:$A),""),ROW(A1))),"")
Note: It's an array formula and needs to be entered through CtrlShiftEnter
向下并向右拖动
AdvancedFilter(因为您似乎也对该选项感兴趣)
只是为了添加这个选项(虽然涉及一些体力劳动)
如果您像这样设置第二个 sheet:
A2
中的公式:
=">="&TEXT(TODAY()-WEEKDAY(TODAY(),2)+1,"yyyy/mm/dd")
A3
中的公式:
="<="&TEXT(TODAY()-WEEKDAY(TODAY(),2)+1,"yyyy/mm/dd")
现在,重要的是从要将数据拉入的 sheet 启动 AdvancedFilter
。并分配适当的范围
结果如下:
要自动更新此 AdvancedFilter
,您需要一个简单的 VBA,因此将以下内容粘贴为 Sheet1
上的 Worksheet_Change()
事件:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng1 As Range, rng2 As Range
Dim lr1 As Long, lr2 As Long
With Sheet1
lr1 = .Cells(.Rows.Count, 1).End(xlUp).Row
Set rng1 = .Range("A1:C" & lr1)
End With
With Sheet2
lr2 = .Cells(.Rows.Count, 1).End(xlUp).Row
If lr2 > 3 Then
Set rng2 = .Range("A5:C" & lr2)
rng2.ClearContents
End If
rng1.AdvancedFilter xlFilterCopy, .Range("A1:C3"), .Range("A5")
End With
End Sub
现在您可以在 Sheet1
中添加数据,它会自动更新 AdvancedFilter
,速度会很快。但是如果你想远离 VBA,一定要使用我自己提供的公式,或者使用 @RonRosenFeld 的 ListObject 的更有效的方法。
Advanced Filter
只会复制到同一个工作表。
对于公式,您可以使用 AGGREGATE
函数和 Small
函数以及要忽略的选项,按顺序创建相关行号和 return 它们的数组错误。
然后使用它 INDEX
到数组中,IFERROR
负责将公式向下拖动多于现有的行。
例如,使用表格和结构化引用:在您想要结果的右上角单元格中:
=IFERROR(INDEX(Table1_2,AGGREGATE(15,6,1/((Table1_2[[Dates]:[Dates]]>=From)*(Table1_2[[Dates]:[Dates]]<=To))*ROW(Table1_2)-ROW(Table1_2[#Headers]),ROWS(:1)),COLUMNS($A:A)),"")
向右和向下填充以填充您的矩阵,参考应自动调整。
将 Table
更改为任何 table 的名称,或使用绝对寻址。
Excel好久不在我的范围内了,这个感觉很简单。寻找用于过滤列表的公式,但结果位于新选项卡上。
我发现的最接近的东西是这个 FILTER 函数,但正如网站上所说,它是将于 2019 年发布的一项新功能。所以我无法访问它,因为我正在使用 Excel 2013.
我正在尝试过滤日期范围字段,因此本周的所有条目都将过滤到新选项卡。
因此,在新选项卡上使用 2019 年 10 月 6 日至 2019 年 10 月 12 日这一周的日期进行过滤将 return 仅显示前 2 行。
我已经尝试过 FILTER 功能,不,它在 MS Excel 2013 中不起作用。我也查看了 VLOOKUP,不。我知道 PIVOT 不是我想要的。我想避免 VBA 脚本编写,因为这最终会交给非开发人员。
最后过滤当前table不会满足我的objective.
此处有多条通往罗马的道路,但我们假设 Sheet1
上的示例数据:
公式(只是一个例子)
这是我在 Sheet2
上的结果:
A2
中的公式:
=IFERROR(INDEX(Sheet1!A:A,SMALL(IF((Sheet1!$A:$A>=TODAY()-WEEKDAY(TODAY(),2)+1)*(Sheet1!$A:$A<=TODAY()-WEEKDAY(TODAY())+7)=1,ROW(Sheet1!$A:$A),""),ROW(A1))),"")
Note: It's an array formula and needs to be entered through CtrlShiftEnter
向下并向右拖动
AdvancedFilter(因为您似乎也对该选项感兴趣)
只是为了添加这个选项(虽然涉及一些体力劳动)
如果您像这样设置第二个 sheet:
A2
中的公式:
=">="&TEXT(TODAY()-WEEKDAY(TODAY(),2)+1,"yyyy/mm/dd")
A3
中的公式:
="<="&TEXT(TODAY()-WEEKDAY(TODAY(),2)+1,"yyyy/mm/dd")
现在,重要的是从要将数据拉入的 sheet 启动 AdvancedFilter
。并分配适当的范围
结果如下:
要自动更新此 AdvancedFilter
,您需要一个简单的 VBA,因此将以下内容粘贴为 Sheet1
上的 Worksheet_Change()
事件:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng1 As Range, rng2 As Range
Dim lr1 As Long, lr2 As Long
With Sheet1
lr1 = .Cells(.Rows.Count, 1).End(xlUp).Row
Set rng1 = .Range("A1:C" & lr1)
End With
With Sheet2
lr2 = .Cells(.Rows.Count, 1).End(xlUp).Row
If lr2 > 3 Then
Set rng2 = .Range("A5:C" & lr2)
rng2.ClearContents
End If
rng1.AdvancedFilter xlFilterCopy, .Range("A1:C3"), .Range("A5")
End With
End Sub
现在您可以在 Sheet1
中添加数据,它会自动更新 AdvancedFilter
,速度会很快。但是如果你想远离 VBA,一定要使用我自己提供的公式,或者使用 @RonRosenFeld 的 ListObject 的更有效的方法。
Advanced Filter
只会复制到同一个工作表。
对于公式,您可以使用 AGGREGATE
函数和 Small
函数以及要忽略的选项,按顺序创建相关行号和 return 它们的数组错误。
然后使用它 INDEX
到数组中,IFERROR
负责将公式向下拖动多于现有的行。
例如,使用表格和结构化引用:在您想要结果的右上角单元格中:
=IFERROR(INDEX(Table1_2,AGGREGATE(15,6,1/((Table1_2[[Dates]:[Dates]]>=From)*(Table1_2[[Dates]:[Dates]]<=To))*ROW(Table1_2)-ROW(Table1_2[#Headers]),ROWS(:1)),COLUMNS($A:A)),"")
向右和向下填充以填充您的矩阵,参考应自动调整。
将 Table
更改为任何 table 的名称,或使用绝对寻址。