【问题标题】:How can this lookup (find the last relevant item) be improved?如何改进此查找(查找最后一个相关项目)?
【发布时间】:2014-01-02 02:45:11
【问题描述】:

花名册是我在工作中浪费大量时间的报告之一。这是当前分配给特定客户的每个员工的多站点、多合同列表。目前,它有 6,000 多行,20 多列,针对 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 兼容。

【问题讨论】:

  • 在我的脑海中,删除Trainer 的检查已经可以加快速度了。这是因为您已经在应用您需要的公式,然后检查它是否符合您的 IF 条件,如果检查结果为 @,则仅重复整个计算987654327@。另外,就个人而言,我认为此时 UDF 更有帮助,因此无需多次应用 INDIRECT,这已经是一个相对较慢的公式。
  • @BK201 在这种情况下什么是 UDF?

标签: excel excel-2007 vba


【解决方案1】:

如果您的源是数据透视表,请尝试使用 GETPIVOTDATA 函数。没有INDIRECTINDEX,你也许可以完成你想要的。

【讨论】:

  • 源不是枢轴​​,它是单行条目的列表。我使用该数据的轴来获取唯一的 UID 列表。
【解决方案2】:

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

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

此处 A2 包含此人的姓名。如果您可以提供一些示例数据,我可以更准确地使用此公式,但我建议不要在站点总计工作表中使用整个 B 和列,因为这肯定会减慢计算过程,您可以使用 B1:B8000 或更小的范围,加快进程。希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 2022-01-21
    • 2015-06-09
    • 2023-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多