业余编码员再次寻求帮助:-)
我有下面的代码很好用,它从下拉验证列表中获取一个变量,并由于我并使用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
答案 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