我正在尝试根据在" TSDate"中输入的日期编写查找批次ID的代码。字段。
尝试在VBA中使用Application.VLookup函数时,我一直收到错误2042:
'Timesheet Date
Private Sub TSdate_KeyDown(ByVal KeyCode As _
MSForms.ReturnInteger, ByVal shift As Integer)
Dim TimesheetDate As Date
Dim batch As Variant
Dim DRange As Range
Set DRange = Range("Table_PayPeriods")
If KeyCode = 13 Or KeyCode = 9 Then
TSDate.Value = Format(TSDate.Value, "dd-mmm-yy")
TimesheetDate = TSDate.Value
batch = Application.VLookup(TSDate.Value, DRange, 2, 0)
MsgBox (DRange(2, 2))
BatchID.Text = batch
End If
End Sub
消息框证明正在查找的数据被正确拉出,问题是我在"批次"变量
任何帮助将不胜感激。谢谢!
答案 0 :(得分:4)
Application.VLookup
将在找不到查找值时返回Error 2042
。
您需要测试错误,并妥善处理:
If KeyCode = 13 Or KeyCode = 9 Then
TSDate.Value = Format(TSDate.Value, "dd-mmm-yy")
TimesheetDate = TSDate.Value
batch = Application.VLookup(TSDate.Value, DRange, 2, 0)
If IsError(batch) Then
'Do something
Else
MsgBox (DRange(2, 2))
BatchID.Text = batch
End If
End If
对于为什么找不到值,如果没有关于输入数据和相应格式的更多详细信息,则无法回答 - 可能该值确实不存在,或者可能是出现存在但实际上不存在:(通常我希望字符串与日期类型不匹配,反之亦然)。
如果单元格包含日期类型值(即使它们格式化到看起来像字符串,也会出现错误。在这种情况下,将字符串输入(TSDate.Value
)转换为Date类型,并将 转换为Long类型,并使用其等效的长数字执行Vlookup:
batch = Application.VLookup(CLng(CDate(TSDate.Value)), DRange, 2, 0)
如果表格中不存在日期值字面,您仍需要处理错误。