2016-07-29 3 views
5

Я использую Office 2007. У меня есть макрос PowerPoint, который использует рабочий лист Excel для выполнения vLookup. Я сделал публичную функцию для vLookup. Он хорошо работает, когда все значения правильно поданы. Теперь я пытаюсь захватить ошибки для тех условий, где значение поиска не может быть найдено. Функция код:Vlookup и ISERROR

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 

.. заявление. Он никогда не попадает в инструкцию If IsError(varResult)..., когда есть ошибка vlookup. Как я могу правильно захватить ошибку vLookup?

+1

ли вы, как правило, заполнить много строк (или столбцов) с повторным использованием этой функции? – Jeeped

+2

Удалите '.WorksheetFunction' так' Application.Vlookup (... ' –

+0

Спасибо @ScottCraner. Удаление .WorksheetFunction исправил мою проблему. Я ценю вашу помощь. – user3138025

ответ

5

WorksheetFunction object не возвращает значения ошибки обратно к варианту; он просто задыхается от них. Используйте Excel Application object без функции WorksheetFunction, чтобы иметь возможность работать со значением ошибки. Вы уже создали объект Excel.Application; использовать это.

Повторяющийся вызов для создания (и уничтожения) объекта приложения с помощью CreateObject function можно избежать, сделав статическое объявление переменной объекта. Это особенно полезно в UDF, который может быть скопирован по длинному столбцу.

Собственный рабочий лист VLOOKUP function написан для обеспечения полной ссылки на столбцы без штрафных санкций; усечение полных ссылок столбца на свойство 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

Смежные вопросы