2017-06-19 306 views
0

想象一下,我有两张电子表格,其中一张带有居住在我的房产中的租户,另一张带有在租户离开后在属性中完成的维修。这是他们的样子。 租赁:Excel:查找某个时间范围内的值

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'的第一次修复是在08/03/2001,属于Tenant'2'的无效范围,因此将租户ID分配到下一列。

通常情况下,如果每个属性只有一个租户,我可以做一个简单的查找,但这使我的情况变得复杂。

我试着玩vlookup和日期功能,但无法弄清楚它的方式。

感谢您的帮助

回答

1

你似乎在寻找与匹配的行数多标准的索引。行号可以通过AGGREGATE返回,通过在丢弃错误时强制不匹配的所有内容进入错误状态。

=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)) 

enter image description here

+0

这是完美的,公式的工作原理完全符合我的需要。但有两个问题。首先,由于我有非常大的数据集(126000行和20000行),因此无法扩展。其次,在某些情况下,我会获得#NUM!错误,即使参考是正确的。 – Dalibor

+0

如果我正在处理126K行,我将转移到VBA并完全在2-D变体阵列中工作,将值返回到工作表*集合*。使用原生工作表公式不会导致可观的计算滞后。 #REF!错误来自找不到匹配,并且可以通过IFERROR包装来避免。我无法进一步评论#REF!错误,因为我没有重现问题的数据。 – Jeeped

2

您可以用SUMIFS功能做到这一点。添加了相匹配的所有租户ID,只要始终只,将导致租户ID:

=SUMIFS(B:B,A:A,G2,D:D,"<" & H4,E:E,">" & H2) 

正如@汤姆夏普的建议,你可以测试多种比赛和“错误”那些出:

=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)) 
+1

我不认为这是一个坏主意。也许你可以使用COUNTIFS来检查只有一个? –

+0

谢谢@TomSharpe,我改变了利用这个想法的答案。 – CLR