簡體   English   中英

即使使用IsError,Excel VBA Vlookup返回錯誤2042

[英]Excel VBA Vlookup return error 2042 even if using IsError

以下代碼不起作用。 我的VLOOKUP函數收到2042錯誤,但是無論如何我都無法解決。 我一直在使用ISERROR,但它仍然無法正確捕獲整個宏。 如果運行本地窗口,則可以看到要搜索的值存儲在數組“ arr”中(如果未在“目標”范圍內找到),即使后面的條目也返回2042。

Sub test()
ThisWorkbook.Activate

Worksheets.add

Worksheets("Test4").Range("A1:T110").copy Destination:=ActiveSheet.Range("A1")

With ActiveSheet

    Dim Search_Array As Variant
    Search_Array = Range("C2", Range("C1").End(xlDown)) 'use this array to loop through the value to search for


    Dim Target_MatchValue As Integer
    Dim Target_Range As Range
    Dim arr As Variant
    Dim counter As Integer
    Dim n As Integer



    counter = 0
    n = 0
    Target_MatchValue = 0

    For counter = LBound(Search_Array) To UBound(Search_Array)
        Target_MatchValue = 0

        Target_MatchValue = Application.Match(Search_Array(counter, 1), .Range("H2:H200"), 0) - 1 
        Set Target_Range = .Range(.Cells(2 + n, 8), .Cells(1000, 9))           

        arr = Application.VLookup(Search_Array(counter, 1), Target_Range, 2, False)

            If IsError(arr) Then
                .Range(Cells(1 + counter, 6), Cells(1 + counter, 6)).value = "N/A"
            Else
                .Range(Cells(1 + counter, 6), Cells(1 + counter, 6)).value = arr 'Return the value of the array in this cell
            End If



        Target_Range.Select

        If Target_MatchValue = 0 Then

            n = n + 1

            ElseIf Target_MatchValue > 0 Then
            n = n + Target_MatchValue
        End If



Next counter

End With

End Sub

Sub test()

Dim Search_Array As Variant
Dim Target_MatchValue As Variant
Dim Target_Range As Range
Dim arr As Variant
Dim counter As Integer
Dim n As Integer



Worksheets("Test4").Range("A1:T110").copy Destination:=ActiveSheet.Range("A1")
With ActiveSheet

'data must be ordered in order to apply the non-repetitive condition
Search_Array = Sheet1.Range("A2", Sheet1.Range("A1").End(xlDown)) 'use this array to loop through the value to search for


n = 0

With ActiveSheet
    For counter = LBound(Search_Array) To UBound(Search_Array)

        Target_MatchValue = 0
        Target_MatchValue = Application.Match(Search_Array(counter, 1), .Range(Cells(2 + n, 4), Cells(1000, 4)), 0) 'The problem was here. "A1:T110" did not allowed to the shifting range to change. Now this code will return the value used for the shifting range
        Set Target_Range = .Range(Cells(2 + n, 4), Cells(1000, 5))  'this is supposed to work as a shifting range allowing to match entries without making repetitions. I used the MATCH function in order to set the start of the range. i.e. if there is a match in the target table the range will shift from the location of the match downwards. If the match is at on the same level then it does not shift the range in order to match the same-level entry afterwards it is supposed to shift by one unit in order to prevent repetitions.
        'target_range.select Activate this code in order to see the macro in action
        arr = Application.VLookup(Search_Array(counter, 1), Target_Range, 2, False) 'store the vlookup value in an array in order to increase the efficiency the code and to speed up the whole proces

            If IsError(arr) Then
                .Cells(2 + n, 2).value = "" 'if the macro does not find anything, no value will be recorded anywhere

                Else
                .Cells(1 + n + Target_MatchValue, 2).value = Search_Array(counter, 2)  'Return the value of the search_array in this cell so to match column A values with column D values if they are found

            End If

            If IsError(arr) Then
                    n = n
                ElseIf Target_MatchValue = 0 Then 'if the macro does not find anything, the shifting range does not shift so that subsequent values can be searched in the same range without missing precious matches
                    n = n + 1

                ElseIf Target_MatchValue > 0 Then 'if there is a matching value between Column A and Column B, the shifting range shifts by the n + the distance between the the current vlookupvalue and the found value. Note that Data must be stored in a filtered order otherwise vlookup will not work correctly
                    n = n + Target_MatchValue

            End If
    Next counter

End With

End Sub

將您的Target_MatchValue As Variant聲明Target_MatchValue As Variant這樣就不會引發任何錯誤,而是當IsError(Target_MatchValue) (如果找不到匹配項),您將不得不處理要執行的操作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM