Vlookup 单元格更改

Vvlookup on cell change

我正在尝试在 VBA 单元格值更改时执行 Vlookup,根据已更改的单元格查找值。

目前我有:

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("Frametype")) Is Nothing Then

 On Error GoTo MyErrorHandler:

 Range("Framewidth").Value = Application.WorksheetFunction.VLookup(Sheets("Frame Info").Range("FrameType"), Sheets("Frame Info").Range("FrameTable"), 7, False)

MyErrorHandler:
    If Err.Number = 1004 Then
        Range("Framewidth").Value = "error"
    End If
End If
End Sub

我试过将 VBA VLOOKUP 单独分配给一个按钮,它 returns 是正确的值,但是当它插入到此工作表更改时,它只 returns错误。

如有帮助将不胜感激。

1004 错误可能来自这里:

If Not Intersect(Target, Range("Frametype")) Is Nothing Then

如果 Range("Frametype") 不在工作表上,代码所在的位置。然后 Target 不能与它相交,它会抛出一个错误。根据您要执行的操作,将 Intersect() 行更改为:

If Not Intersect(Target, Range([Frametype].Address)) Is Nothing Then


在处理 Worksheet_Change 事件时,最好禁用事件,否则代码可能会进入循环。

另一个最佳实践想法是在 Error Handler 之前退出,如果可以 Exit Sub:

Private Sub Worksheet_Change(ByVal Target As Range)

    On Error GoTo MyErrorHandler:
    Application.EnableEvents = False

    If Not Intersect(Target, Range([Frametype].Address)) Is Nothing Then
    'If Not Intersect(Target, Range("Frametype")) Is Nothing Then
        With Worksheets("Frame Info")
            Range("Framewidth").Value = Application.WorksheetFunction.VLookup(.Range("FrameType"), _
                                                                .Range("FrameTable"), 7, False)
        End With
    End If

    Application.EnableEvents = True
    Exit Sub

MyErrorHandler:
    If Err.Number = 1004 Then Range("Framewidth").Value = "error"
    Application.EnableEvents = True

End Sub

就是这样!谢谢 :) 我已将代码更改为:

Private Sub Worksheet_Change(ByVal Target As Range)

    On Error GoTo MyErrorHandler:
    Application.EnableEvents = False

    If Not Intersect(Target, Range("Frametype")) Is Nothing Then

            Sheets("Specification").Range("Framewidth").Value = Application.WorksheetFunction.VLookup(Sheets("Specification").Range("Frametype"), _
                                                                Sheets("Frame Info").Range("FrameTable"), 7, False)

    End If

    Application.EnableEvents = True
    Exit Sub

MyErrorHandler:
    If Err.Number = 1004 Then Range("Framewidth").Value = "error"
    Application.EnableEvents = True

End Sub