Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 跳过函数错误并继续下一次检查(VLOOKUP)_Excel_Vba - Fatal编程技术网

Excel 跳过函数错误并继续下一次检查(VLOOKUP)

Excel 跳过函数错误并继续下一次检查(VLOOKUP),excel,vba,Excel,Vba,我正在运行一个基本的VLOOKUP来获取员工的电子邮件地址 但是,当lookup值输入数组中不存在的雇员名称时,将抛出一个错误 我添加了一个“On Error Resume Next”,但这只会导致剩余的电子邮件地址成为遇到的最后一个电子邮件地址,而不是继续搜索并使用当前员工作为搜索变量 我想要的是当数组中不存在搜索变量ProjectManName时,跳过该行,继续正常搜索。然后我会去手动填写空的电子邮件地址 Dim myLookupValue As Range Dim strResult As

我正在运行一个基本的VLOOKUP来获取员工的电子邮件地址

但是,当lookup值输入数组中不存在的雇员名称时,将抛出一个错误

我添加了一个“On Error Resume Next”,但这只会导致剩余的电子邮件地址成为遇到的最后一个电子邮件地址,而不是继续搜索并使用当前员工作为搜索变量

我想要的是当数组中不存在搜索变量
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