加速数组公式

时间:2016-05-14 09:21:07

标签: arrays excel excel-vba excel-formula vba

我有以下公式,我将在下面解释:

{=SUM(IF(($G$1:$L$1=$O$1)*($G$2:$L$2=$O$2)*($G$3:$L$3=$O$3)*($G$4:$L$4=$O$4)*($G$5:$L$5=$O$5)*($G$6:$L$6=$O$6)*($G$7:$L$7=$O$7);G21:L21))}

这是工作表的样子:

enter image description here

G - L 列下,我们拥有所有数据的“数据库”。这些列将每季度累计添加(每季度约30列)。因此,几年后我们最终得到了一堆数据库列(1000 +列原始数据)。为了这个演示,我只包括那6列。

如您所见,每列包含特定参数,行 1 - 7 ,允许识别特定的CountryCode +项目代码+类别+会计年度,+ ...(等) 。这使我们能够追踪一个独特的特定项目并检索其数据。

我们之后在 O 列上的内容是我们正在尝试检索值的特定项目(您可以看到行 1 - 7 与在列 G 下(我们正在尝试检索此特定项目的值)。

enter image description here

这是我们的公式。我已经附上了。按 F2 时的样子如下。正如您所看到的, IF 语句首先只是检查特定列是否与 O 列下的预定义条件匹配,并且它将所有符合所有条件的列相加行 1-7

现在问题就在于此。我们有一个工作表,其中包含20个项目(例如O列),我们在那里使用这个数组公式来检索值。问题是使用这种方式检索数据需要很多时间。我们还通过VBA采用了一个原则,我们遍历所有单元格,然后我们插入一个公式,计算数组单元格,然后我们复制&将结果值粘贴到内部(这样我们就不会得到完整的数组公式)。然而,它仍需要LONG才能计算(1分钟左右)。

我想知道,如果有更好的解决方案如何以已经提到的格式检索数据(这意味着我们有一个特定的标准,我们试图找到)?也许SUMIFS会更好?还是sumproduct?甚至是强制性的不同解决方案?

我对任何可以加快这一进程的提案持开放态度。

2 个答案:

答案 0 :(得分:1)

我在2周前遇到过类似的问题。起初我使用辅助列/行。辅助列是连接每列中的7个字符串。然后只使用IF函数检查连接的文本是否匹配。例如,假设帮助行是每个样本的第8行,单元格G8公式将是

=CONCATENATE(G1,"|",G2,"|",G3,"|",G4,"|",G5,"|",G6,"|",G7)

并对其余部分(包括列O

)执行相同的操作
=CONCATENATE(O1,"|",O2,"|",O3,"|",O4,"|",O5,"|",O6,"|",O7)

然后做一个HLOOKUP

=HLOOKUP(O8,G8:L21,14,0)

就我而言,计算时间从10分钟减少到几秒钟!

或者我也找到了一种没有辅助列的方法,再次使用数组,但这个想法几乎相同,

根据您的样本,O21中的公式将是

=SUM(IF(CONCATENATE(G1:L1,G2:L2,G3:L3,G4:L4,G5:L5,G6:L6,G7:L7)=CONCATENATE(O1,O2,O3,O4,O5,O6,O7),G21:L21))

(我没有添加此公式的“|”分隔符,但最好这样做)

但最后我更喜欢辅助列方法。

供您参考

enter image description here

HTH

答案 1 :(得分:1)

为了提高性能,请避免多次重新计算相同的计算。

  

这使我们能够追踪一个独特的特定项目并检索其数据。

如果7个值的组合是唯一的,则使用数组公式在辅助单元格中计算所选项目的位置一次(例如O15)(使用 Ctrl + 确认移 + 输入

=MATCH(1;(G1:L1=O1)*(G2:L2=O2)*(G3:L3=O3)*(G4:L4=O4)*(G5:L5=O5)*(G6:L6=O6)*(G7:L7=O7);0)

O21中使用以下公式并向下拖动:

=INDEX(G21:L21;1;$O$15)