Excel:查找特定时间范围内的值

Excel:查找特定时间范围内的值,excel,excel-formula,lookup,Excel,Excel Formula,Lookup,想象一下,我有两个电子表格,一个是关于住在我的房子里的房客的,另一个是关于房客离开后在房子里进行的维修。这是他们的样子。 租约: Property ID | Tenant ID | Start of Tenancy | End of Tenancy | Start of next tenancy 1 | 1 | 01/01/2001 | 30/01/2001 | 15/02/2001 1 | 2 |

想象一下,我有两个电子表格,一个是关于住在我的房子里的房客的,另一个是关于房客离开后在房子里进行的维修。这是他们的样子。 租约:

 Property ID | Tenant ID | Start of Tenancy | End of Tenancy | Start of next tenancy
 1           | 1         | 01/01/2001       | 30/01/2001     | 15/02/2001
 1           | 2         | 15/02/2001       | 28/02/2001     | 15/03/2001
 1           | 3         | 15/03/2001       | 30/03/2001     | 15/04/2001
 2           | 4         | 15/01/2001       | 30/01/2001     | 31/01/2001
 2           | 4         | 31/01/2001       | 30/04/2001     | 05/05/2001
 2           | 5         | 05/05/2001       | 05/06/2001     | 20/06/2001
 3           | 6         | 03/05/2001       | 15/08/2001     | 30/08/2001
 3           | 7         | 30/08/2001       | 15/10/2001     | 15/11/2001
 4           | 1         | 31/01/2001       | 30/04/2001     | 15/05/2001
 4           | 8         | 15/05/2001       | 30/08/2001     | 30/09/2001
修理:

 Property ID | Repair Issued Date |
 1           | 08/03/2001         |
 1           | 10/04/2001         |
 2           | 03/05/2001         |
 2           | 15/06/2001         |
 3           | 18/08/2001         |
 4           | 10/05/2001         |
 4           | 15/09/2001         |
我需要在修缮之前找出谁是房客。因此,我需要匹配“物业ID”,如果“维修发布日期”介于“租赁结束”和“下一个租赁开始”之间,则分配“租户ID”。举个简单的例子,属性“1”中的第一次修复发生在2001年3月8日,它位于租户“2”的无效范围之间,因此将租户ID分配给下一列

通常,如果每个房产只有一个租户,我可以做一个简单的查找,但这会使我的情况复杂化

我试着使用vlookup和dates函数,但找不到方法


感谢您的帮助

您似乎正在寻找一个包含多个匹配行号条件的索引。通过在丢弃错误的同时强制所有不匹配的内容进入错误状态,可以使用聚合返回行号

=INDEX(B:B, AGGREGATE(15, 6, ROW($1:$11)/((A$1:A$11=G2)*(D$1:D$11<=H2)*(E$1:E$11>=H2)), 1))
=索引(B:B,聚合(15,6,行($1:$11)/(A$1:A$11=G2)*(D$1:D$11=H2)),1))

您似乎在寻找一个包含多个匹配行号条件的索引。通过在丢弃错误的同时强制所有不匹配的内容进入错误状态,可以使用聚合返回行号

=INDEX(B:B, AGGREGATE(15, 6, ROW($1:$11)/((A$1:A$11=G2)*(D$1:D$11<=H2)*(E$1:E$11>=H2)), 1))
=索引(B:B,聚合(15,6,行($1:$11)/(A$1:A$11=G2)*(D$1:D$11=H2)),1))

您可以使用SUMIFS函数来完成此操作。如果只有一个租户ID,则将所有匹配的租户ID相加将生成租户ID:

=SUMIFS(B:B,A:A,G2,D:D,"<" & H4,E:E,">" & H2)
=SUMIFS(B:B,A:A,G2,D:D,”&H2)
正如@Tom Sharpe所建议的,您可以测试多个匹配项,并将其“出错”:

=IF(COUNTIFS(A:A,G2,C:C,"<" & H2,E:E,">" & H2)>1,"#MULTIPLE FOUND",SUMIFS(B:B,A:A,G2,C:C,"<" & H2,E:E,">" & H2))
=IF(COUNTIFS(A:A,G2,C:C,“&H2)>1,“#找到多个”,SUMIFS(B:B,A:A,G2,C:C,“&H2))

您可以使用SUMIFS函数完成此操作。如果只有一个租户ID,则将所有匹配的租户ID相加将生成租户ID:

=SUMIFS(B:B,A:A,G2,D:D,"<" & H4,E:E,">" & H2)
=SUMIFS(B:B,A:A,G2,D:D,”&H2)
正如@Tom Sharpe所建议的,您可以测试多个匹配项,并将其“出错”:

=IF(COUNTIFS(A:A,G2,C:C,"<" & H2,E:E,">" & H2)>1,"#MULTIPLE FOUND",SUMIFS(B:B,A:A,G2,C:C,"<" & H2,E:E,">" & H2))
=IF(COUNTIFS(A:A,G2,C:C,“&H2)>1,“#找到多个”,SUMIFS(B:B,A:A,G2,C:C,“&H2))

我认为这不是个坏主意。也许你可以用COUNTIFS来检查只有一个?谢谢@TomSharpe,我已经改变了答案来利用这个想法。我不认为这是个坏主意。也许你可以用COUNTIFS来检查是否只有一个?谢谢@TomSharpe,我已经改变了答案来利用这个想法。这很完美,公式完全符合我的需要。但有两个问题。首先,因为我有相当大的数据集(126000行和20000行),所以不可能将其放大。第二,在某些情况下,我得到#NUM!错误,即使引用是正确的。如果我处理的是126K行,我将转到VBA并完全在二维变量数组中工作,然后将值整体返回工作表。使用本机工作表公式时,没有任何东西不会导致明显的计算延迟。
#REF错误来自未找到匹配项,可以使用IFERROR包装避免。我无法对#REF#进一步发表评论!错误,因为我没有复制问题的数据。这是完美的,公式完全符合我的需要。但有两个问题。首先,因为我有相当大的数据集(126000行和20000行),所以不可能将其放大。第二,在某些情况下,我得到#NUM!错误,即使引用是正确的。如果我处理的是126K行,我将转到VBA并完全在二维变量数组中工作,然后将值整体返回工作表。使用本机工作表公式时,没有任何东西不会导致明显的计算延迟。
#REF错误来自未找到匹配项,可以使用IFERROR包装避免。我无法对#REF#进一步发表评论!错误,因为我没有再现问题的数据。