我需要在Excel中创建某种基本报告。
主要问题是我收集数据的数据库是将部门分配存储在三列中,但只存储每个新分配的Start_Date。
所以文件看起来像:
Pers_ID Department_ID Start_Date
1001 01 2012-01-01
1001 02 2013-05-01
1001 05 2015-08-01
我需要某种检查单元格的公式(例如A1是" 2013-08-01)并在给定时间返回Pers_ID的Department_ID。
我试着计算所有日期和" A1"之间的最小差异。使用数组公式但这也可能导致将来分配department_ID。
任何帮助都高度赞赏,因为我在没有任何工作解决方案的情况下挣扎数小时。提前谢谢!
答案 0 :(得分:0)
根据您的列表,我添加了额外的记录来测试公式,如下所示:
Pers_ID Department_ID Start_Date
1001 01 2012-01-01
1001 02 2013-05-01
1001 05 2015-08-01
1002 02 2012-05-01
1002 04 2013-01-01
1003 01 2016-01-01
Selection criteria
Person: 1002
Date: 2016-03-06
Intermediate Results
Begin: <First formula below>
End: <Second formula below>
Results
Dept. <The last formula goes here>
做出以下假设:
Pers_ID
A1
(因此您的数据从第2行开始)B10
和B11
为了区分不同的Pers_ID
,我们首先必须知道特定Pers_ID
的许多记录都在您的数据源和哪个位置。由于数据按Pers_ID
排序,我们只需搜索出现的第一行:
MATCH(B10;A2:A7;0) // will return 4 as it's the 4th line in the range A2:A7
并计算指定Pers_ID
的出现频率:
COUNTIF(A2:A7;B10) // will return 2
为了简化最终公式,我们可以&#34;缓存&#34;单元格B14
和B15
中的结果。
之后我们可以使用OFFSET()
函数创建一个范围。我们从数据集的开头开始,根据我们的计算移动范围 down 。请注意MATCH() - 1
,因为如果所需Pers_ID
位于第一行(因此指定偏移量为0),我们就不必移动范围。使用COUNTIF
的结果,我们指定范围的高度:
OFFSET(B2;MATCH(B9;A2:A7;0)-1;0;COUNTIF(A2:A7;B9)) // without "cache"
OFFSET(B2;B14-1;0;B15) // with "cache"
OFFSET(B2;4-1;0;2) // partially evaluated
他们都将B5:B6作为Pers_ID = 1002
要选择范围中的相应行,请使用INDEX()
包裹公式:
INDEX(OFFSET(B2;B14-1;0;B15);<Row>;<Column>)
要选择的<Column>
很简单。由于我们没有在OFFSET()
公式中指定宽度,因此范围仅为1列宽,因此要选择的列将为1:
INDEX(OFFSET(B2;B14-1;0;B15);<Row>;1)
<Row>
有点棘手。我们需要在C
列中指定日期范围,其高度与我们对Pers_ID
&#39}的范围相同。
我们主要使用与现在相同的公式,但我们不想在B11
中搜索指定的日期,而是搜索最接近的日期(这意味着确切的日期或更早的日期)。为此,我们使用SMALL()
...
SMALL(OFFSET(C2;B14-1;0;B15);COUNTIF(OFFSET(C2;B14-1;0;B15);"<="&B11)) // returns 2013-01-01 (in fact it returns 41275 which is the 1st March 2013)
...并确定范围内的行号,并附上MATCH()
:
MATCH(SMALL(OFFSET(C2;B14-1;0;B15);COUNTIF(OFFSET(C2;B14-1;0;B15);"<="&B11));OFFSET(C2;B14-1;0;B15);0) // returns 2
然后整个公式是:
// Without "cache"
=INDEX(OFFSET(B2;MATCH(B10;A2:A7;0)-1;0;COUNTIF(A2:A7;B10));MATCH(SMALL(OFFSET(C2;MATCH(B10;A2:A7;0)-1;0;COUNTIF(A2:A7;B10));COUNTIF(OFFSET(C2;MATCH(B10;A2:A7;0)-1;0;COUNTIF(A2:A7;B10));"<="&B11));OFFSET(C2;MATCH(B10;A2:A7;0)-1;0;COUNTIF(A2:A7;B10));0);1)
// With "cache"
=INDEX(OFFSET(B2;B14-1;0;B15);MATCH(SMALL(OFFSET(C2;B14-1;0;B15);COUNTIF(OFFSET(C2;B14-1;0;B15);"<="&B11));OFFSET(C2;B14-1;0;B15);0);1)
也许有更容易/更清晰的方法来实现这一点(例如我不熟悉的数组公式或VBA)。