如何在 excel 中为 vlookup 提供替代方案
How to provide alternatives for vlookup in excel
我创建了一个宏来自动生成报告。我想在代码的一部分中提供 vlookup 其他值的替代方法,如果它找不到它们的话。我不能正确地运行。它不会粉碎或说任何话,但我给它的最后一个选择是,它不会执行它。更详细地说,它不会使用 "C2" 查找值。
下面提供了最后一个替代方案
cell3.Formula = "=IF(ISERROR(VLOOKUP(A2&""P2"",MARM!A:G,7,0)),"""",IF(VLOOKUP(A2&""P2"",MARM!A:G,7,0)=0,"""",VLOOKUP(A2&""C2"",MARM!A:G,7,0)))"
下面提供了带有 vlookup 的全部代码
With Range("J2:J" & LastRow)
.Formula = "=IF(ISERROR(VLOOKUP(A2&""B2"",MARM!A:G,7,0)),"""",IF(VLOOKUP(A2&""B2"",MARM!A:G,7,0)=0,"""",VLOOKUP(A2&""B2"",MARM!A:G,7,0)))"
.Value = .Value
End With
Dim cell3 As Range
For Each cell3 In Range("J2:J" & LastRow)
If IsEmpty(cell3.Value) = True Then
cell3.Formula = "=IF(ISERROR(VLOOKUP(A2&""P2"",MARM!A:G,7,0)),"""",IF(VLOOKUP(A2&""P2"",MARM!A:G,7,0)=0,"""",VLOOKUP(A2&""C2"",MARM!A:G,7,0)))"
End If
Next cell3
这个公式应该有效(根据您最后的评论):
IFERROR(VLOOKUP(A2&""B2"",MARM!A:G,7,0),IFERROR(VLOOKUP(A2&""P2"",MARM!A:G,7,0),IFERROR(VLOOKUP(A2&""C2"",MARM!A:G,7,0),""Not Found"")))
我看到的问题是@Jeeped 提到的那个问题,它将针对每一行的单元格 A2
放置查找。不过,这可以通过将每个对 A2
的引用更改为
来进行调整
... (A" & cell3.Row & ""B2""...
或者您可以捕获 cell3.Row 作为变量
Dim myRow as Long
myRow = cell3.Row
... (A" & myRow & ""B2""...
我注意到的第一件事是 cell3.Formula 初始 if-condition 没有条件:
"=If(
ISERROR(VLOOKUP(A2&""P2"",MARM!A:G,7,0)), _ 'PROBLEM; you have values, are they <> something?
"""", _ 'True-function
IF( _ 'False-function
VLOOKUP(A2&""P2"",MARM!A:G,7,0)=0, _ 'Has legit condition
"""", _ 'True-function
VLOOKUP(A2&""C2"",MARM!A:G,7,0) _ 'False-function
) _
)"
我建议节省一个步骤,只是不要使用 VBA 插入公式,而是让 VBA 进行计算,类似于:
cell3.Formula= Application.IfError( Application.VLookup( ... etc.
我创建了一个宏来自动生成报告。我想在代码的一部分中提供 vlookup 其他值的替代方法,如果它找不到它们的话。我不能正确地运行。它不会粉碎或说任何话,但我给它的最后一个选择是,它不会执行它。更详细地说,它不会使用 "C2" 查找值。 下面提供了最后一个替代方案
cell3.Formula = "=IF(ISERROR(VLOOKUP(A2&""P2"",MARM!A:G,7,0)),"""",IF(VLOOKUP(A2&""P2"",MARM!A:G,7,0)=0,"""",VLOOKUP(A2&""C2"",MARM!A:G,7,0)))"
下面提供了带有 vlookup 的全部代码
With Range("J2:J" & LastRow)
.Formula = "=IF(ISERROR(VLOOKUP(A2&""B2"",MARM!A:G,7,0)),"""",IF(VLOOKUP(A2&""B2"",MARM!A:G,7,0)=0,"""",VLOOKUP(A2&""B2"",MARM!A:G,7,0)))"
.Value = .Value
End With
Dim cell3 As Range
For Each cell3 In Range("J2:J" & LastRow)
If IsEmpty(cell3.Value) = True Then
cell3.Formula = "=IF(ISERROR(VLOOKUP(A2&""P2"",MARM!A:G,7,0)),"""",IF(VLOOKUP(A2&""P2"",MARM!A:G,7,0)=0,"""",VLOOKUP(A2&""C2"",MARM!A:G,7,0)))"
End If
Next cell3
这个公式应该有效(根据您最后的评论):
IFERROR(VLOOKUP(A2&""B2"",MARM!A:G,7,0),IFERROR(VLOOKUP(A2&""P2"",MARM!A:G,7,0),IFERROR(VLOOKUP(A2&""C2"",MARM!A:G,7,0),""Not Found"")))
我看到的问题是@Jeeped 提到的那个问题,它将针对每一行的单元格 A2
放置查找。不过,这可以通过将每个对 A2
的引用更改为
... (A" & cell3.Row & ""B2""...
或者您可以捕获 cell3.Row 作为变量
Dim myRow as Long
myRow = cell3.Row
... (A" & myRow & ""B2""...
我注意到的第一件事是 cell3.Formula 初始 if-condition 没有条件:
"=If(
ISERROR(VLOOKUP(A2&""P2"",MARM!A:G,7,0)), _ 'PROBLEM; you have values, are they <> something?
"""", _ 'True-function
IF( _ 'False-function
VLOOKUP(A2&""P2"",MARM!A:G,7,0)=0, _ 'Has legit condition
"""", _ 'True-function
VLOOKUP(A2&""C2"",MARM!A:G,7,0) _ 'False-function
) _
)"
我建议节省一个步骤,只是不要使用 VBA 插入公式,而是让 VBA 进行计算,类似于:
cell3.Formula= Application.IfError( Application.VLookup( ... etc.