Excel 跳过函数错误并继续下一次检查(VLOOKUP)
我正在运行一个基本的VLOOKUP来获取员工的电子邮件地址 但是,当lookup值输入数组中不存在的雇员名称时,将抛出一个错误 我添加了一个“On Error Resume Next”,但这只会导致剩余的电子邮件地址成为遇到的最后一个电子邮件地址,而不是继续搜索并使用当前员工作为搜索变量 我想要的是当数组中不存在搜索变量Excel 跳过函数错误并继续下一次检查(VLOOKUP),excel,vba,Excel,Vba,我正在运行一个基本的VLOOKUP来获取员工的电子邮件地址 但是,当lookup值输入数组中不存在的雇员名称时,将抛出一个错误 我添加了一个“On Error Resume Next”,但这只会导致剩余的电子邮件地址成为遇到的最后一个电子邮件地址,而不是继续搜索并使用当前员工作为搜索变量 我想要的是当数组中不存在搜索变量ProjectManName时,跳过该行,继续正常搜索。然后我会去手动填写空的电子邮件地址 Dim myLookupValue As Range Dim strResult As
ProjectManName
时,跳过该行,继续正常搜索。然后我会去手动填写空的电子邮件地址
Dim myLookupValue As Range
Dim strResult As String
Dim lngLastRow As Long
Dim lngLoop As Long
Dim ProjectManName As String
Set myLookupValue = Worksheets("Employees").Range("A1", Worksheets("Employees").Range("B1").End(xlDown))
With Worksheets("Project Summary")
lngLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
For lngLoop = 2 To lngLastRow
On Error Resume Next
ProjectManName = .Cells(lngLoop, 1).Value
strResult = Application.WorksheetFunction.VLookup(ProjectManName, myLookupValue, 2, False)
Range("K" & lngLoop).Value = strResult
ActiveCell.Offset(1, 0).Select
Next
End With
另外,对于myLookupValue,我是否需要工作表(“员工”)的第二个实例?当我没有这样做时,它也给出了一个错误,因为范围中的第二个单元格查看的是当前工作表,而不是员工工作表
最后,如何将范围(“K”&lngLoop).Value
中的“K”替换为第一个空列
当lookup值输入数组中不存在的雇员名称时,将抛出一个错误
这完全是出于设计Application.WorksheetFunction
函数是早期绑定的,会引发错误而不是返回错误,这是完全惯用的VB行为
看起来您需要“Excel工作表”行为,其中出错的工作表函数将返回一个单元格显示为\N/a
的Variant/Error
值:该Variant/Error
值使iError
返回True
,并且只能合法地与其他错误值进行比较,例如,CVErr(xlErrNa)
与许多COM类型一样,Excel.Application
接口是可扩展的,这意味着可以在运行时向其添加成员。事实证明,它是通过工作表函数
接口的成员有效扩展的,因此应用程序.VLookup
不仅编译得非常好(就像应用程序.任何东西
),它是一个后期绑定的实现,其行为与工作表单元格调用工作表函数时的行为完全相同:它返回一个变量/错误
值,而不是引发标准的惯用运行时错误。。。假设所有参数都正确(后期绑定调用不会获得IntelliSense/autocomplete),因为如果您输入错误(Option Explicit
无法保存您)或参数错误,则可能会引发错误438或1004
但是您无法捕获字符串中的返回值
——当查找产生错误
值时,这将是一个类型不匹配错误(您不能强制将该类型转换为变量
)
也就是说,早期绑定版本通常应该是首选的,因为它只适用于IntelliSense<代码>错误时继续下一步正确使用在此处可能会有所帮助-只需将查找拉入其自己的范围:
For lngLoop = 2 To lngLastRow
ProjectManName = .Cells(lngLoop, 1).Value
[ActiveSheet.]Range("K" & lngLoop).Value = GetProjectManager(ProjectManName)
'ActiveCell.Offset(1, 0).Select '<~ why?
Next
至于myLookupValue
(坏名字:应该是myLookupRange
或lookupSource
或lookupTable
-“lookup value”通常被理解/理解为您正在寻找的值)-您绝对需要参考员工表(不合格的范围
调用是产生错误1004的一个很好的方法)-这并不意味着需要从工作表
集合中取消对该对象的引用两次-如上所示…请注意,通过将查找移到其自己的范围,我们还消除了调用方甚至需要关心查找源表的需要
当lookup值输入数组中不存在的雇员名称时,将抛出一个错误
这完全是出于设计。Application.WorksheetFunction
函数是早期绑定的,会引发错误而不是返回错误,这完全是VB惯用的行为
看起来您需要“Excel工作表”行为,其中出错的工作表函数将返回单元格显示为#N/a
的Variant/Error
值:该Variant/Error
值使iError
返回True
,并且只能合法地与其他错误值进行比较,例如CVErr(xlErrNa)
与许多COM类型一样,Excel.Application
接口是可扩展的,这意味着可以在运行时向其添加成员。事实证明,它是通过WorksheetFunction
接口的成员有效扩展的,因此Application.VLookup
不仅编译得非常好(与Application.anythingwhich
)一样,它是一个后期绑定的实现,其行为与工作表单元格调用工作表函数时的行为完全相同:它返回一个变量/错误
值,而不是引发一个标准的、惯用的运行时错误……假设所有参数都正确(后期绑定调用不会获得IntelliSense/autocomplete),因为如果您输入错误(Option Explicit
无法保存您)或参数错误,可能会引发错误438或1004
但是您无法捕获字符串中的返回值
——当查找产生错误
值时,这将是一个类型不匹配错误(您不能强制将该类型转换为变量
)
也就是说,早期绑定版本通常应该是首选版本,仅适用于IntelliSense。错误恢复下一步
在此处正确使用可能会有所帮助-只需将查找拉入其自己的范围:
For lngLoop = 2 To lngLastRow
ProjectManName = .Cells(lngLoop, 1).Value
[ActiveSheet.]Range("K" & lngLoop).Value = GetProjectManager(ProjectManName)
'ActiveCell.Offset(1, 0).Select '<~ why?
Next
至于myLookupValue
(坏名字:应该是myLookupRange
或lookupSource
或lookupTable
-“lookup value”通常被理解/理解为您正在寻找的值)-您绝对需要参考员工表(不合格的Range
调用是产生错误1004的一个很好的方法)-确实如此
Private Function GetProjectManager(ByVal name As String) As String
Dim source As Range
With Worksheets("Employees")
On Error Resume Next
GetProjectManager = Application.WorksheetFunction.VLookup(name, .Range("A1", .Range("B1").End(xlDown)), 2, False)
On Error GoTo 0
End With
End Function
dim lc as long
lc = sheets("project summary").cells(1, sheets("project summary").columns.count).end(xltoleft).column