Excel vLookup返回0

我正在使用两个非常大的表,我正在尝试使用vba和vlookups来匹配其中的数据。

工作表是每一列,其结构如下:

参考表:
ID_Ref(2/4)
Q1234
W1234
R1234

查找表
ID_Lookup
Q1234
P1234
X1234

我感兴趣的是确定在查找SHEET但不在参考表中的行。 我在每张表中有大量的行(查找时约130k,参考约90k),当我尝试手动input公式时,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))) 

产生与复制不同的不匹配logging数量

 =IFERROR(MATCH(A2,'2_4'!$A$1:$A$79145,0),"") 

我在这里做错了什么?

MATCH函数比VLOOKUP函数甚至COUNTIF函数更有效率,如果你想要做的就是certificate存在。

 With Sheets("Lookup).Range("B3:B133780") .Formula = "=iferror(match(a3, '2_4'!A:A, 0), """")" .cells = .value2 End With 

在B列的工作表“2_4”中,您将留下空白单元格和包含匹配行号的单元格。

这是yoru公式,它看起来狡猾!

 '=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)) 

在查询列右侧的列中的单元格中的值(我将假设是列A,并从第2行开始。请尝试此单元格B2中的公式,然后复制并粘贴它:

 =NOT( ISNA( VLOOKUP($A2,'2_4'!$A$1:$A$79145,1, FALSE) ) ) 

当一个值被发现时,这将返回true,否则返回false。

我觉得你需要重新阅读VLOOKUP上的手册页,因为你没有正确使用它。

您可能会喜欢使用function区>>公式选项卡>>计算选项来在编辑时自动计算,但我不认为这是必要的。

哈维

这里有一个不同的方法使用ADO(从这个答案改编,但修改为使用Excel 2007年以后的连接string,并确定唯一的项目是唯一的查找表)我假定查找表称为“查找”参考表被称为“参考”,我们识别的项目列表将被输出到名为“数据”的表格 – 如果错误的话,用正确的名称replace。

在VBA编辑器中,转至工具>参考,并添加对“Microsoft ActiveX Data Objects 2.8 Library”的引用。 现在将其添加到标准的代码模块,然后运行它:

 Option Explicit Sub get_employees() Dim cn As ADODB.Connection Set cn = New ADODB.Connection ' Connection string for .xlsm files With cn .Provider = "Microsoft.ACE.OLEDB.12.0" .ConnectionString = "Data Source=" & ThisWorkbook.FullName & ";" & _ "Extended Properties=""Excel 12.0 Macro;IMEX=1;HDR=Yes"";" .Open End With Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset rs.Open "SELECT [Lookup$].[ID_Lookup] FROM [Lookup$] LEFT JOIN [Reference$] ON [Lookup$].[ID_Lookup] = " & _ "[Reference$].[ID_Ref] WHERE [Reference$].[ID_Ref] IS NULL", cn With Worksheets("Data") .Cells(2, 1).CopyFromRecordset rs End With rs.Close cn.Close End Sub 

这会尝试将查找表中的每个条目与参考表中的一个或多个相应条目进行匹配。 然后消除所有的匹配,只保留不匹配的查找条目。