我目前在我的数据中使用数组公式来查找列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数组的语法,以找到匹配的行。
答案 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秒
正如您所看到的,减少对实际使用内容的列引用会极大地提高效率。数组公式通过计算所有其他内容来处理。计算负荷呈指数增长 随着引用的单元格行的增加。
如果您的数据不断变化并且您不知道要处理多少行,请使用命名范围,并使用动态定义的引用:。例如:
=$AA$2:INDEX($AA:$AA, MATCH(1e99, $C:$C))
您的数组公式现在看起来类似于以下内容。
=$AA$2:INDEX($AA:$AA, MATCH("zzz", $C:$C))
命名范围将随着可用数据量的增长而缩小。