从所选月份

时间:2016-03-06 14:14:00

标签: excel report

我需要在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。

任何帮助都高度赞赏,因为我在没有任何工作解决方案的情况下挣扎数小时。提前谢谢!

1 个答案:

答案 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行开始)
  • 您可以在两个字段B10B11
  • 中编写选择条件

为了区分不同的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;单元格B14B15中的结果。

之后我们可以使用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)。