【发布时间】:2015-05-12 22:48:18
【问题描述】:
我正在处理两个非常大的表,我正在尝试使用 vba 和 vlookups 来匹配一个与另一个中的数据。
每个工作表都是一列,结构如下:
参考表:
ID_Ref (2/4)
Q1234
W1234
R1234
...
查找表
ID_Lookup
Q1234
P1234
X1234
...
我有兴趣识别 Lookup SSheet 中但不在 Reference Sheet 中的行。我在每张表中有大量行(查找中约 130k,参考中约 90k),当我尝试手动输入公式时,excel 不断崩溃。
因此,我尝试使用 VBA 来自动化该过程。问题是下面的函数对大多数行返回 0,我不知道为什么。
Sub Vlookup()
With Sheets("Lookup).Range("B3:B133780")
.FormulaR1C1 = _
"=IF(VLOOKUP(RC[-1],2_4!R1C1:R79145C1,1)=RC[-1],VLOOKUP(RC[-1],2_4!R1C1:R79145C2,1,FALSE),VLOOKUP(RC[-1],2_4!R1C1:R79145C2,1,FALSE))"
.Value = .Value
End With
End Sub
感谢任何帮助!
编辑 5/13:
我尝试了@HarveyFrench 和@Jeeped 提到的方法,得到了两个不同的结果。
复制下来:
=NOT(ISNA(VLOOKUP($A2,'2_4'!$A$1:$A$79145,1, FALSE)))
产生与复制不同数量的不匹配记录
=IFERROR(MATCH(A2,'2_4'!$A$1:$A$79145,0),"")
我在这里做错了吗?
【问题讨论】:
-
如果只是为了识别存在我会尽快使用 countif 而不是 cpu 密集型 VLookup。如果 countif 返回零,您就知道它不存在,任何高于零的都存在
-
根据数据的类型,您可以使用
Data->Remove Duplicates来减小它的大小。如果您只是测试两个列表中的项目,这将有效。您还可以调用函数Application.Match的VBA 版本并在VBA 中处理结果,而无需将公式放入工作表中。Application.Match在这里是理想的,因为您只是想测试存在。 -
MATCH function 的IFERROR function 将返回一个零长度字符串,虽然它不是真正的空白,但可以用COUNTBLANK function 计算。如果您想用 VLOOKUP 的 #N/A 计算 #N/A,请删除 IFERROR 包装器。