我正在使用循环使用以下代码从另一个工作簿中的值更新一个工作簿中的值:
Option Explicit
Sub DateFinder()
Dim rw As Long, x As Range
Dim extwbk As Workbook, twb As Workbook
' Turn off notifications
Application.ScreenUpdating = False
Set twb = ThisWorkbook
Set extwbk = Workbooks.Open("C:\Test.xlsx")
' Refresh UsedRange (get rid of "Ghost" cells)
Set x = extwbk.Worksheets("Sheet1").UsedRange
With twb.Worksheets("Sheet1")
For rw = 2 To .Cells(Rows.Count, "G").End(xlUp).Row
.Cells(rw, "Q") = Application.VLookup(.Cells(rw, "G").Value2, 4, False)
Next rw
End With
' Close workbook
extwbk.Close savechanges:=False
' Turn on screen updating
Application.ScreenUpdating = True
' Message Box showing that process is complete.
MsgBox "Done!"
End Sub
一切正常但我想更改代码以用空格替换#N / A结果。我搜索了网站,发现了以下解决方案,但没有一个能为我工作:
.Cells(rw, "Q") = IfError(Application.VLookup(.Cells(rw, "G").Value2, x, 4, False), "")
.Cells(rw, "Q") = "=IFERROR(Application.VLookup(.Cells(rw, "G").Value2, x, 4, False),"""",Application.VLookup(.Cells(rw, "G").Value2, x, 4, False))"
.Cells(rw, "Q") = "=IF(ISNA(VLOOKUP(.Cells(rw, "G").Value2, x, 4, False)),"""",(VLOOKUP(.Cells(rw, "G").Value2, x, 4, False)))
我得到了所有三种解决方案的编译错误。如果有人能帮助我使用正确的配方,这将是伟大的。谢谢。
答案 0 :(得分:2)
您可能需要将IfError
视为Application
班级的成员,请尝试:
.Cells(rw, "Q") = Application.IfError(Application.VLookup(.Cells(rw, "G").Value2, 4, False), "")
另一种方法是将Application.VLookup
的结果分配给变量(否则,类型不匹配将在赋值时引发),然后检查错误。这是您使用IIF
和IsError
函数检查错误的方法。如果出错,则转换为空字符串:
Dim val As Variant
val = Application.VLookup(.Cells(rw, "G").Value2, 4, False)
.Cells(rw, "Q") = IIF(IsError(val),vbNullString,val)
答案 1 :(得分:0)
使用IfError
对函数进行环绕。但是,在将来而不是使用vlookup
时,我建议使用Index-Match。你可以在这里阅读:
https://www.deskbright.com/excel/using-index-match/
Index/Match
是两个函数的组合,其净结果比vlookup
更好,更容易。
此外,如果您需要转置数据,则需要使用hlookup
代替vlookup
。 Index Match会为您处理一切。