Excel vLookup 返回 0
Excel vLookup Returning 0
我正在处理两个非常大的表,我正在尝试使用 vba 和 vlookups 将一个表中的数据与另一个表进行匹配。
作品sheet各为一栏,结构如下:
引用Sheet:
ID_Ref (2/4)
Q1234
W1234
R1234
...
查找 Sheet
ID_Lookup
Q1234
P1234
X1234
...
我有兴趣识别查找 SHeet 但不在参考 Sheet 中的行。我在每个 sheet 中都有大量行(查找中约 130k,参考中约 90k),并且 excel 在我尝试手动输入公式时一直崩溃。
因此,我正在尝试使用 VBA 来自动化该过程。问题是大多数行的以下函数 returns 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:$A145,1, FALSE)))
与向下复制相比,产生的不匹配记录数量不同
=IFERROR(MATCH(A2,'2_4'!$A:$A145,0),"")
我是不是做错了什么?
这是 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:$A145,1, FALSE) ) )
这将 return 找到值时为真,否则为假。
我认为您需要重新阅读 VLOOKUP 的手册页,因为您没有正确使用它。
您可能希望在编辑时使用功能区>>公式选项卡>>计算选项来关闭自动计算,但我认为没有必要。
哈维
A MATCH function is more efficient than a VLOOKUP function or even a COUNTIF function 如果你只想证明存在。
With Sheets("Lookup).Range("B3:B133780")
.Formula = "=iferror(match(a3, '2_4'!A:A, 0), """")"
.cells = .value2
End With
您将留下空白单元格和包含工作表“2_4”B 列中匹配行号的单元格。
这是一种使用 ADO 的不同方法(改编自 this answer,但已修改为使用 Excel 2007 年以后的连接字符串,并仅识别查找所特有的项目 sheet .) 我假设查找 sheet 被称为 "Lookup",引用 sheet 被称为 "Reference" 并且我们识别的项目列表将输出到 sheet 称为 "Data" - 如果这些是错误的,请替换为正确的名称。
在 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
这会尝试将查找 sheet 中的每个条目与参考 sheet 中的一个或多个对应条目进行匹配。然后它会消除所有匹配项,只保留不匹配的查找条目。
我正在处理两个非常大的表,我正在尝试使用 vba 和 vlookups 将一个表中的数据与另一个表进行匹配。
作品sheet各为一栏,结构如下:
引用Sheet:
ID_Ref (2/4)
Q1234
W1234
R1234
...
查找 Sheet
ID_Lookup
Q1234
P1234
X1234
...
我有兴趣识别查找 SHeet 但不在参考 Sheet 中的行。我在每个 sheet 中都有大量行(查找中约 130k,参考中约 90k),并且 excel 在我尝试手动输入公式时一直崩溃。
因此,我正在尝试使用 VBA 来自动化该过程。问题是大多数行的以下函数 returns 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:$A145,1, FALSE)))
与向下复制相比,产生的不匹配记录数量不同
=IFERROR(MATCH(A2,'2_4'!$A:$A145,0),"")
我是不是做错了什么?
这是 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:$A145,1, FALSE) ) )
这将 return 找到值时为真,否则为假。
我认为您需要重新阅读 VLOOKUP 的手册页,因为您没有正确使用它。
您可能希望在编辑时使用功能区>>公式选项卡>>计算选项来关闭自动计算,但我认为没有必要。
哈维
A MATCH function is more efficient than a VLOOKUP function or even a COUNTIF function 如果你只想证明存在。
With Sheets("Lookup).Range("B3:B133780")
.Formula = "=iferror(match(a3, '2_4'!A:A, 0), """")"
.cells = .value2
End With
您将留下空白单元格和包含工作表“2_4”B 列中匹配行号的单元格。
这是一种使用 ADO 的不同方法(改编自 this answer,但已修改为使用 Excel 2007 年以后的连接字符串,并仅识别查找所特有的项目 sheet .) 我假设查找 sheet 被称为 "Lookup",引用 sheet 被称为 "Reference" 并且我们识别的项目列表将输出到 sheet 称为 "Data" - 如果这些是错误的,请替换为正确的名称。
在 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
这会尝试将查找 sheet 中的每个条目与参考 sheet 中的一个或多个对应条目进行匹配。然后它会消除所有匹配项,只保留不匹配的查找条目。