如何改进这种查找(找到最后的相关项目)?

时间:2013-12-14 09:27:35

标签: excel excel-vba excel-2007 vba

其中一个浪费我工作时间的报告是名册。它是当前分配给特定客户的每个员工的多站点,多合同列表。目前,它有20多个字符串,超过6,000行,针对3个不同的数据集进行索引。不是世界上最大的混乱,但仍然是一种痛苦。它几乎都是excel,因为我在某种程度上没有Access的商业案例。

但是这个怪物的一部分是分开的。每个网站Site Totals一个标签,每次代理人都经过培训时都会列出。第二个标签(同样,每个网站一个)Site Data仅显示最近的培训课程,以及他们在该课程中拥有的凭据。

第二个标签由此数组公式的变体驱动 - Last_Row是另一个标签上的命名范围,而列A是Site Totals上UID列的轴。为了便于阅读,我把它拆开了:

=IF(INDEX('Site Totals'!B:B,LARGE(($A2=INDIRECT("'Site Totals'!$A$1:$A$"&Last_Row))*
 (INDIRECT("'Site Totals'!B1:B"&Last_Row)<>"")*
 ROW(INDIRECT("'Site Totals'!$A$1:$A$"&Last_Row)),1))="Trainer",
 "",
 INDEX('Site Totals'!B:B,LARGE(($A2=INDIRECT("'Site Totals'!$A$1:$A$"&Last_Row))*
 (INDIRECT("'Site Totals'!B1:B"&Last_Row)<>"")*
 ROW(INDIRECT("'Site Totals'!$A$1:$A$"&Last_Row)),1)))

我知道这个公式的作用,但我不知道如何改进它。这个公式需要更改,因为它目前大约有5亿个计算(我不允许删除历史数据),计算工作簿需要3个小时...如果它没有崩溃Excel第一

我对VBA和/或自定义函数持开放态度,但更喜欢使用原生Excel函数。我无法安装任何东西,因此任何解决方案都必须是原生Excel,并且必须与Excel 2007兼容。

2 个答案:

答案 0 :(得分:0)

如果您的来源是数据透视表,请尝试使用GETPIVOTDATA功能。您可以在没有INDIRECTINDEX的情况下完成所需的工作。

答案 1 :(得分:0)

我所理解的是,每个人都已经/没有参加过培训,并且您想要检索该培训的名称,如果他没有,则需要在单元格中留出空白。如果此描述正确,您可以尝试此表格,按ctrl + shift + enter执行。

=IFERROR(INDEX('Site Totals'!B$1:B$12,MATCH(A2&"Trainer",'Site Totals'!A$1:A$12&'Site Totals'!B$1:B$12)),"")

这里A2包含了这个人的名字。如果你能提供一些样本数据,我可以更精确地使用这个公式,但我建议不要使用整个B&amp; “站点总计”中的列工作正常,因为这将明确减慢计算过程,而您可以使用B1:B8000或更小的范围来加速过程。希望有所帮助。