代码自动填充“INDEX”数组公式并重新调整查找列中的新唯一值

时间:2017-05-05 13:14:51

标签: excel vba excel-vba

我正在建立一个宏来获取一个部门需要的产品列表(他们每天发送一个新的产品),并根据仓库中每个项目的每个位置的报告引用它。到目前为止,我已将其设置为计算产品ID在位置列表(x)中出现的次数,并将其复制到新工作表x多次。现在我需要它来获取产品的大小并填充另一列,以便我可以索引Product ID&大小,找到位置。该表将被打印并提供给人们拉动产品,而无需他们查看系统并找到列表中所有内容的位置(目前大约需要一个小时。)

现在的问题是,我无法在不破坏第二个唯一值的第一个实例的情况下自动填充公式。我找到了一个解决方法,但我不知道如何开始在vba中自动化它。

D2中的

数组公式=

{=INDEX(Report!D:G,SMALL(IF(Report!D:G=$A2,ROW(Report!D:G)),ROW(A1)),4)}

当它下降到A列中的第二个唯一值时,它会断开并显示为

{=INDEX(Report!D:G,SMALL(IF(Report!D:G=$A7,ROW(Report!D:G)),ROW(A6)),4)}

但是通过将最后一个ROW函数更改回A1,它可以正常工作:

{=INDEX(Report!D:G,SMALL(IF(Report!D:G=$A7,ROW(Report!D:G)),ROW(A1)),4)}

Formula breaks in first instance of 2nd unique value in Column A

enter image description here

Formula works in first instance of 2nd unique value in Column A by changing final ROW function back to "A1" and dragging down.

enter image description here

我尝试在公式中添加IFERROR:

{=IFERROR(INDEX(Report!D:G,SMALL(IF(Report!D:G=$A2,ROW(Report!D:G)),ROW(A1)),4),INDEX(Report!D:G,SMALL(IF(Report!D:G=$A2,ROW(Report!D:G)),ROW($A$1)),4))}

但显然这没效果。更令人绝望的是。

有没有办法通过检测A列中的更改并仅将公式中的最后一个ROW函数还原为A1来自动化VBA中的过程?

或者,是否有通过自动填充工作的公式?

感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

试试这个数组公式:

=INDEX(Report!G:G,SMALL(IF(Report!D:D=$A2,ROW(Report!D:D)),COUNTIF($A$2:A2,A2)))

作为数组公式,需要在退出编辑模式时使用Ctrl-Shift-Enter而不是Enter来确认。如果操作正确,Excel会将{}放在公式周围。

注意: 我已经留下了完整的列引用,这在使用数组公式时很糟糕,因为它们将迭代遍历每个单元格,无论它是否具有值或不。这将超过一百万计算PER公式。这会减慢您的计算时间,甚至可能会崩溃。

建议您仅引用那些包含数据的单元格。

处理数据的一种方法是在小变量内部进行引用。我们可以用INDEX / MATCH做到这一点:

=INDEX(Report!G:G,SMALL(IF(Report!D$1:INDEX(Report!D:D,MATCH(1E+99,Report!D:D))=$A2,ROW(Report!D$1:INDEX(Report!D:D,MATCH(1E+99,Report!D:D)))),COUNTIF($A$2:A2,A2)))

现在,公式将自动将引用的结尾设置为报表单的D列中的最后一个单元格,并且不会产生额外的非必要循环。