VLookup问题以及可能的解决方法

时间:2020-07-14 06:45:42

标签: vba vlookup

这是我的第一篇文章,但是我已经在我的工作中使用了两年。对于像我这样的VBA新手来说,它被证明是宝贵的参考。 我有一个很大的工作表,用于排班和显示员工的工作时间。我正在尝试在下面的代码中使用vlookup生成已知操作人员的联系电话和供应商详细信息,到目前为止,这很容易,但是却说一行已填充了vlookup表上不存在的操作人员的详细信息(通常是如果是这样,如果我在事实之后单击详细信息或将详细信息复制到单元格中,vlookup将运行并删除手动输入的详细信息。基本上,我希望excel仅在存在匹配项并且遇到错误时才单独运行手动输入的数据,才运行vlookup。 这是我到目前为止所拥有的。

Private Sub worksheet_change(ByVal Target As Range)

Dim RNG1 As Range
Dim RNG2 As Range
Dim RNG3 As Range

Set RNG1 = Sheet1.Range("A1:A30") 'RANGES WHERE AN OPERATIVE NAME IS PLACED
Set RNG2 = Sheet1.Range("DQ:D30")
Set RNG3 = Sheet81.Range("G1:G30")

If Not Intersect(Target, Union(RNG1, RNG2, RNG3)) Is Nothing Then
    Set MyRange = Sheet1.Range("A2:C497") 'TABLE WHERE VLOOKUP DATA IS STORED ON SEPERATE SHEET

    Target.Offset(0, 2) = Application.IfError(Application.VLookup(Target.Value, MyRange, 3, False), "")
    Target.Offset(0, 1) = Application.IfError(Application.VLookup(Target.Value, MyRange, 2, False), "")
End If
Exit Sub

enter image description here

1 个答案:

答案 0 :(得分:0)

我在这里使用Find是因为Match不能在多列范围内使用。

Private Sub worksheet_change(ByVal Target As Range)

Dim RNG1 As Range
Dim RNG2 As Range
Dim RNG3 As Range
Dim r As Range

Set RNG1 = Sheet1.Range("A1:A30") 'RANGES WHERE AN OPERATIVE NAME IS PLACED
Set RNG2 = Sheet1.Range("D1:D30")
Set RNG3 = Sheet81.Range("G1:G30")

If Not Intersect(Target, Union(RNG1, RNG2, RNG3)) Is Nothing Then
    Set MyRange = Sheet2.Range("A2:C497") 'TABLE WHERE VLOOKUP DATA IS STORED ON SEPERATE SHEET
    Set r = Union(RNG1, RNG2, RNG3).Find(what:=Target.Value, lookat:=xlWhole, MatchCase:=False, SearchFormat:=False)
    If Not r Is Nothing Then   'name is found
        Target.Offset(0, 2) = Application.VLookup(Target.Value, MyRange, 3, False)
        Target.Offset(0, 1) = Application.VLookup(Target.Value, MyRange, 2, False)
    End If
End If

End Sub