2016-07-29 16 views
5

Tôi đang sử dụng Office 2007. Tôi có một macro PowerPoint sử dụng trang tính Excel để thực hiện vLookup. Tôi đã thực hiện một chức năng công khai cho vLookup. Nó hoạt động tốt khi tất cả các giá trị được cung cấp đúng cách. Bây giờ tôi đang cố gắng để nắm bắt lỗi cho những điều kiện mà không tìm thấy giá trị tra cứu. Mã chức năng là:Vlookup và 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 

tôi gọi chức năng này từ vĩ mô chủ yếu với các tuyên bố sau:

varGatherNumber = v_lookup(varDateTime, Lit_Sched_Table_Lookup, 5, vbFalse) 

Mã này hoạt động tốt khi không có lỗi. Vấn đề là khi tra cứu không thành công, tôi bị ném vào Debug trỏ đến,

varResult = objExcelAppVL.Application.WorksheetFunction.VLookup 

.. statement. Nó không bao giờ được báo cáo If IsError(varResult)... khi có lỗi vlookup. Làm thế nào tôi có thể bẫy một lỗi vLookup đúng cách?

+1

Bạn thường điền vào nhiều hàng (hoặc cột) với việc sử dụng lặp lại chức năng này? – Jeeped

+2

Xóa '.WorksheetFunction' để' Application.Vlookup (... ' –

+0

Cảm ơn @ScottCraner. Gỡ bỏ .WorksheetFunction đã khắc phục được sự cố của tôi. Tôi đánh giá cao sự giúp đỡ của bạn. – user3138025

Trả lời

5

WorksheetFunction object không chuyển giá trị lỗi trở lại biến thể; nó chỉ đơn giản là cuộn cảm trên chúng. Sử dụng Excel Application object mà không có WorksheetFunction để có thể làm việc với một giá trị lỗi. Bạn đã tạo một đối tượng Excel.Application; dùng nó.

Cuộc gọi lặp lại để xây dựng (và hủy) một đối tượng ứng dụng với CreateObject function có thể tránh được bằng cách thực hiện khai báo biến đối tượng tĩnh. Điều này đặc biệt hữu ích trong một UDF có thể được sao chép xuống một cột dài.

Trang tính gốc VLOOKUP function được viết để cho phép tham chiếu toàn bộ cột mà không bị phạt; cắt ngắn các tham chiếu cột đầy đủ thành thuộc tính Worksheet.UsedRange sẽ giúp chức năng này.

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 

Tôi thấy bạn đặc biệt trả về chuỗi để số và ngày sẽ là văn bản tương đương. Tôi cho rằng đây là cách tốt nhất để nhận các giá trị trong PowerPoint.

udf_vlookup

Các vấn đề liên quan