代码等效于数组公式

时间:2015-04-27 16:24:25

标签: arrays vba excel-vba rows matching

我目前在我的数据中使用数组公式来查找列O,Y和AA与当前行匹配的行,以及列A值不匹配的行,并返回匹配行的列C.

这是我的公式:

=INDEX(C:C,MATCH(1,(O:O=O2)*(Y:Y=Y2)*(AA:AA=AA2)*(A:A<>A2),0))

使用命名范围我已经能够使用VBA输入此公式,但我真正想要做的是使用VBA执行类似的功能并将结果值写入D列。

我在考虑可能是一个循环,对于从2到最后一行的每个i,找到匹配并写入单元格范围内的另一行(找到的行 3 < /em>).value to cell( i 4 ),但我不知道VBA数组的语法,以找到匹配的行。

1 个答案:

答案 0 :(得分:0)

虽然没有明确说明,但可以很容易地推断出您正在寻求使用VBA来提高计算/重新计算数组公式的效率。您尚未提供数据的范围(即行数),但您不太可能需要使用的完整列引用。以下计算周期时间基于~1000行静态数据。

你的数组公式:

=INDEX(C:C, MATCH(1, (O:O=O2)*(Y:Y=Y2)*(AA:AA=AA2)*(A:A<>A2), 0))

经过时间填写并计算:24.828秒

包含列引用的数组公式被截断为数据的实际范围:

=INDEX($C$2:$C$999, MATCH(1, ($O$2:$O$999=O2)*($Y$2:$Y$999=Y2)*($AA$2:$AA$999=AA2)*($A$2:$A$999<>A2), 0))

经过时间填写并计算:0.203秒

可比较的标准公式,其列引用被截断为数据的实际范围:

=INDEX($C$2:$C$999, MIN(INDEX(ROW($1:$998)+(($A$2:$A$999=A2)+($O$2:$O$999<>O2)+($Y$2:$Y$999<>Y2)+($AA$2:$AA$999<>AA2))*1E+99, , )))

经过时间填写并计算:0.257秒

正如您所看到的,减少对实际使用内容的列引用会极大地提高效率。数组公式通过计算所有其他内容来处理。计算负荷呈指数增长 随着引用的单元格行的增加。

如果您的数据不断变化并且您不知道要处理多少行,请使用命名范围,并使用动态定义的引用:。例如:

  1. 选择一个通常定义数据范围的列,并记下数据的性质。此方法略有不同,具体取决于您是处理真实数字还是文本。出于演示目的,C列有数字。
  2. 选择公式►定义的名称►名称管理器。 “名称管理器”对话框打开后,单击新建
  3. 名称:文本框中键入范围的友好名称;例如 MyColAA 。将范围:作为工作簿。
  4. 使用以下内容参考:

    =$AA$2:INDEX($AA:$AA, MATCH(1e99, $C:$C))

    这会将 myColAA 定义为与列C中最后一个数字匹配的行的AA2。如果列C:C中包含文本值,则使用以下内容:
    {{{ 1}}
  5. 重复列A:A,C:C,O:O和Y:Y。将上次使用的引用保留为C:C列,这样它们将始终具有相同的行数,但会更改其他列引用并为每个列引用一个新名称。
  6. 当您创建所有命名范围并返回工作表时,通过点击 F5 测试一个,在参考中输入 myColAA 文本框并单击确定
  7. 您的数组公式现在看起来类似于以下内容。

    =$AA$2:INDEX($AA:$AA, MATCH("zzz", $C:$C))

    命名范围将随着可用数据量的增长而缩小。