Vlookup和ISERROR

5

我使用的是 Office 2007。我有一个 PowerPoint 宏,使用 Excel 工作表执行 vLookup。我为 vLookup 制作了一个公共函数。当所有值正确提供时,它运行得很好。现在我正在尝试捕获那些查找值未被找到的情况下的错误。函数代码如下:

Public Function v_lookup _
            (lookup_value As Variant, _
            table_array As Range, _
            col_index_num As Integer, _
            range_lookup As Boolean) _
            As String

Dim varResult           As Variant
Dim objExcelAppVL       As Object
Set objExcelAppVL = CreateObject("Excel.Application")
objExcelAppVL.Visible = False

varResult = objExcelAppVL.Application.WorksheetFunction.VLookup _
            (lookup_value, _
            table_array, _
            col_index_num, _
            range_lookup)
If IsError(varResult) Then varResult = ""
v_lookup = varResult

objExcelAppVL.Quit
Set objExcelAppVL = Nothing

End Function

我从主要的宏中使用以下语句调用此函数:
varGatherNumber = v_lookup(varDateTime, Lit_Sched_Table_Lookup, 5, vbFalse)

当没有错误时,这段代码工作得很好。问题是当查找失败时,我会被抛到Debug并指向该处,

 varResult = objExcelAppVL.Application.WorksheetFunction.VLookup

...语句。当vlookup出现错误时,它永远不会到达If IsError(varResult)...语句。我该如何正确捕获vLookup错误?


1
你通常会使用这个函数来填充许多行(或列)吗? - user4039065
2
移除“.WorksheetFunction”,这样Application.Vlookup(... - Scott Craner
谢谢@ScottCraner。移除.WorksheetFunction解决了我的问题。感谢您的帮助。 - user3138025
是的,@Jeeped。我多次调用这个函数,每次传入不同的变量和查找列。 - user3138025
1个回答

5
WorksheetFunction对象不会将错误值传回到变量,它只是无法处理它们。使用不带WorksheetFunction的Excel Application对象即可处理错误值。您已经创建了一个Excel.Application对象,请使用它。
通过将对象变量声明为静态,可以避免重复使用CreateObject函数构造(和销毁)应用程序对象。这在UDF中特别有用,因为该函数可能会被复制到长列中。
本地工作表VLOOKUP函数编写成允许完整列引用而不受罚款;将完整列引用截断为Worksheet.UsedRange属性将有助于此函数。
Option Explicit

Public Function v_lookup(lookup_value As Variant, _
                         table_array As Range, _
                         col_index_num As Integer, _
                         Optional range_lookup As Boolean = False) As String

    Dim varResult           As Variant
    Static objExcelAppVL    As Object


    'only create the object if it doesn't exist
    If objExcelAppVL Is Nothing Then
        Set objExcelAppVL = CreateObject("Excel.Application")
        objExcelAppVL.Visible = False
    End If

    'restrict full column references to the worksheet's .UsedRange
    Set table_array = objExcelAppVL.Intersect(table_array.Parent.UsedRange, table_array)

    varResult = objExcelAppVL.VLookup(lookup_value, _
                                      table_array, _
                                      col_index_num, _
                                      range_lookup)

    If IsError(varResult) Then varResult = ""
    v_lookup = varResult

    'do not destruct static vars - they are reused on subsequent calls
    'objExcelAppVL.Quit
    'Set objExcelAppVL = Nothing

End Function

我看到你专门返回一个字符串,因此数字和日期将以它们的文本等效形式呈现。我认为这是在PowerPoint中接收值的最佳方式。 udf_vlookup

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接