计算设定日期范围内的唯一值
Count unique values in a set date range
我需要根据日期范围(可以是一天或几天)计算列中有多少个唯一值(名称)。
我的数据存储如下。
A 列 = 日期 mm/dd/yy
B 列 = 姓名
不幸的是,数据导入我的文件的方式没有给我任何其他选择,只能使用姓名作为唯一员工标识的参考,没有列出 ID。
想法是有 2 个单元格,"From" 和 "To" 输入日期以执行唯一值计算并将结果 return 到另一个单元格。
我已经或多或少地制作了我正在寻找的样本。您会找到一个我想输入日期的选项卡和一个包含示例数据库的选项卡。
http://public.justcloud.com/e04wqfgc89.83937591
这些唯一值将允许我执行报告所需的额外计算。
Results!S2 的公式应如下所示:
=SUMPRODUCT(((DB!$A:$A2>=A2)*(DB!$A:$A2<=B2))/(COUNTIFS(DB!$A:$A2,">="&A2,DB!$A:$A2,"<="&B2,DB!$B:$B2,DB!$B:$B2&"")+(DB!$A:$A2<A2)+(DB!$A:$A2>B2)))
我见过工作表设计者使用 MIN(A2:B2)
和 MAX(A2:B2)
来防止用户输入 Start 和 Stop 日期顺序错误,但我通常让用户自行破坏,因为他们无法区分 Date From 和 Date To.
你可以在 C2
中使用这个 "array formula"
=SUM(IF(FREQUENCY(IF((DB!A:A0>A2)*(DB!A:A0<B2),MATCH(DB!B:B0,DB!B:B0,0)),ROW(DB!B:B0)-ROW(DB!B)+1),1))
已通过 CTRL+SHIFT+ENTER
确认
试试这个
Sub test()
Dim oCell As Range, i&, LRow&: i = 1
Dim Group As Object: Set Group = CreateObject("Scripting.Dictionary")
Dim DtFrom As Date, DtTo As Date
With Sheets("Results")
DtFrom = .Cells(2, 1).Value
DtTo = .Cells(2, 2).Value
End With
LRow = Sheets("DB").Cells(Rows.Count, "B").End(xlUp).Row
For Each oCell In Sheets("DB").Range("A2:A" & LRow)
If Not Group.exists(oCell.Offset(, 1).Value) And oCell.Value <> "" And _
CDate(oCell.Value) >= DtFrom And CDate(oCell.Value) <= DtTo Then
Group.Add oCell.Offset(, 1).Value, i: i = i + 1
End If
Next
Sheets("Results").Cells(2, 3).Value = Group.Count
End Sub
我需要根据日期范围(可以是一天或几天)计算列中有多少个唯一值(名称)。
我的数据存储如下。
A 列 = 日期 mm/dd/yy
B 列 = 姓名
不幸的是,数据导入我的文件的方式没有给我任何其他选择,只能使用姓名作为唯一员工标识的参考,没有列出 ID。
想法是有 2 个单元格,"From" 和 "To" 输入日期以执行唯一值计算并将结果 return 到另一个单元格。
我已经或多或少地制作了我正在寻找的样本。您会找到一个我想输入日期的选项卡和一个包含示例数据库的选项卡。
http://public.justcloud.com/e04wqfgc89.83937591
这些唯一值将允许我执行报告所需的额外计算。
Results!S2 的公式应如下所示:
=SUMPRODUCT(((DB!$A:$A2>=A2)*(DB!$A:$A2<=B2))/(COUNTIFS(DB!$A:$A2,">="&A2,DB!$A:$A2,"<="&B2,DB!$B:$B2,DB!$B:$B2&"")+(DB!$A:$A2<A2)+(DB!$A:$A2>B2)))
我见过工作表设计者使用 MIN(A2:B2)
和 MAX(A2:B2)
来防止用户输入 Start 和 Stop 日期顺序错误,但我通常让用户自行破坏,因为他们无法区分 Date From 和 Date To.
你可以在 C2
中使用这个 "array formula"=SUM(IF(FREQUENCY(IF((DB!A:A0>A2)*(DB!A:A0<B2),MATCH(DB!B:B0,DB!B:B0,0)),ROW(DB!B:B0)-ROW(DB!B)+1),1))
已通过 CTRL+SHIFT+ENTER
确认试试这个
Sub test()
Dim oCell As Range, i&, LRow&: i = 1
Dim Group As Object: Set Group = CreateObject("Scripting.Dictionary")
Dim DtFrom As Date, DtTo As Date
With Sheets("Results")
DtFrom = .Cells(2, 1).Value
DtTo = .Cells(2, 2).Value
End With
LRow = Sheets("DB").Cells(Rows.Count, "B").End(xlUp).Row
For Each oCell In Sheets("DB").Range("A2:A" & LRow)
If Not Group.exists(oCell.Offset(, 1).Value) And oCell.Value <> "" And _
CDate(oCell.Value) >= DtFrom And CDate(oCell.Value) <= DtTo Then
Group.Add oCell.Offset(, 1).Value, i: i = i + 1
End If
Next
Sheets("Results").Cells(2, 3).Value = Group.Count
End Sub