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

Excel 捕获用户错误并在错误后重新启用application.events,excel,vba,Excel,Vba,业余程序员再次请求帮助:-) 下面的代码运行良好,它从下拉式验证列表中获取一个变量,并自动执行命令,因为我使用私有子工作表\u更改(ByVal Target As Range)。我遇到的问题是,有时用户会在框中键入内容,而不是选择它 我得到一份工作 运行时错误91 因为它找不到用户键入的值 我怎样才能捕捉到这个错误并弹出一条消息,告诉他们必须从下拉列表中进行选择?此外,由于它会中断代码,它会将我的应用程序.EnableEvents设置为False,因为它不会从重置为True的ByVal目标范围部

业余程序员再次请求帮助:-)

下面的代码运行良好,它从下拉式验证列表中获取一个变量,并自动执行命令,因为我使用
私有子工作表\u更改(ByVal Target As Range)
。我遇到的问题是,有时用户会在框中键入内容,而不是选择它

我得到一份工作

运行时错误91

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

我怎样才能捕捉到这个错误并弹出一条消息,告诉他们必须从下拉列表中进行选择?此外,由于它会中断代码,它会将我的
应用程序.EnableEvents
设置为
False
,因为它不会从重置为
True
ByVal目标范围
部分完成代码

在代码中断的情况下,如何将
应用程序.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

首先检查范围是否不返回任何内容(表示未找到术语)。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

要回答有关错误处理的问题,请执行以下操作:

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
Public Sub-MyProcedure()
Application.EnableEvents=False
如果在启用此行事件后发生任何错误,则转到启用_事件。
“可能发生错误的东西
启用\u事件:
Application.EnableEvents=True
如果错误号为0,则
MsgBox“发生错误”
如果结束
端接头

有关错误处理的更多信息:。

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

由于您已经在调用工作表_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

我应该把代码放在哪里?我必须从每个子节点调用它吗?关于错误处理的所有知识都在该指南中。实际上,这是一个示例,说明如何在过程中使用
EnableEvents=False
,并确保在发生错误时始终重新启用它。这不是你可以从你的潜艇上调用的东西,这是你在潜艇上的操作方式。这很好,你能帮我用代码看看记录是否存在,如果存在,用msgbox来表示是或否吗?很可能。这是一个单独的问题吗?嗯,是的,我想是的,我应该发布一个新问题吗?把这个标记为你的回答?是的,如果你问一个全新的问题,我想这可能是最好的。谢谢。虽然这可能会处理错误,但它并没有真正回答如何捕获错误以及如何在错误发生后重新启用事件的问题