捕获用户错误并在错误后重新启用application.events

时间:2018-11-20 13:13:55

标签: excel vba excel-vba

业余编码员再次寻求帮助:-)

我有下面的代码很好用,它从下拉验证列表中获取一个变量,并由于我并使用Private Sub Worksheet_Change(ByVal Target As Range)而自动执行命令。我的问题是,有时用户会在框中键入而不是选择它。

我得到

  

运行时错误91

因为它找不到用户键入的值。

如何捕获此错误并弹出消息以告知他们必须从下拉列表中进行选择?另外,由于它破坏了代码,因此将我的Application.EnableEvents设置为False,因为它没有完成ByVal Target As Range部分中重置为True的代码。

如果发生代码中断,如何将Application.EnableEvents重置为True

Sub Copy_From_Borrower_DBase()
    Dim myVal As String
    Dim sourceRng As Range
    myVal = Sheets("Main").Range("F2").Value ' dropdown list
    Set sourceRng = Worksheets("Borrower Database").Range("5:5").Find(What:=myVal, LookAt:=xlWhole) 'locate column where to copy from
    Worksheets("Main").Range("F5").Value = Worksheets("Borrower Database").Cells(5, sourceRng.Column).Value 'Borrower Name
    Worksheets("Main").Range("G6").Value = Worksheets("Borrower Database").Cells(6, sourceRng.Column).Value 'Income
End Sub

3 个答案:

答案 0 :(得分:3)

首先检查范围是否未返回Nothing(表示未找到术语)。 With的使用基本上是装饰性的,但是我认为对代码进行了一些整理。

Sub Copy_From_Borrower_DBase()

Dim myVal As String
Dim sourceRng As Range
myVal = Sheets("Main").Range("F2").Value ' dropdown list

With Worksheets("Borrower Database")
    Set sourceRng = .Range("5:5").Find(What:=myVal, LookAt:=xlWhole)
    If Not sourceRng Is Nothing Then
        Worksheets("Main").Range("F5").Value = .Cells(5, sourceRng.Column).Value 'Borrower Name"
        Worksheets("Main").Range("G6").Value = .Cells(6, sourceRng.Column).Value 'Income"
    Else
        MsgBox "whatever"
    End If
End With

End Sub

答案 1 :(得分:2)

要回答有关错误处理的问题:

Public Sub MyProcedure()
    Application.EnableEvents = False

    On Error Goto ENABLE_EVENTS 'if any error occurs after this line events get enabled.

    'stuff where an error could occur

ENABLE_EVENTS:
    Application.EnableEvents = True
    If Err.Number <> 0 Then
        MsgBox "an error occurred"
    End If
End Sub

有关错误处理的更多信息:VBA Error Handling – A Complete Guide

答案 2 :(得分:0)

我将首先尝试通过不允许出现问题来解决问题,如果失败了,那就担心错误处理。

由于您已经在调用Worksheet_Change并使用数据验证,因此这将检查验证单元格的值。如果其中有一个值,那么您的代码将运行。如果为空,则不会。数据验证会在有人输入的情况下清除该单元格,因此,无论他们在打到Worksheet_Change时键入什么内容,它都应该为空字符串。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$F$2" Then         ' Your Dropdown Validation Cell
        If Not Target.Value = "" Then
            Call Copy_From_Borrower_DBase
        End If
    End If
End Sub