这是我的第一篇文章,但是我已经在我的工作中使用了两年。对于像我这样的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
答案 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