2015-02-09 104 views
0

我已經在這裏編寫了一些代碼,由極其有用的用戶Jeeped幫助。唯一的問題是,我收到錯誤Invalid Procedure Call or Argument當查找找到結果。如果發現結果,它似乎很好。Excel VBA無效的過程調用或vlookup找不到結果時的參數

我希望它只是返回#N /好像它找不到結果。你能幫我解決這個問題嗎?另外我還有500列可以做到這一點,所以如果有更簡單的方法來解決這個問題,那就太棒了。我仍然在學習VBA。非常感謝。如果VRange對象是什麼

Dim v As Long, vWSs As Variant, Mrange As Range, Vrange As Range 
    Dim wsMaster As Worksheet: Set wsMaster = Workbooks("LBImportMacroTemplate.xlsm").Worksheets("MasterTab") 
    Dim mf_iA_TEXT As String: mf_iA_TEXT = "iA" 
    Dim mf_pLN_TEXT As String: mf_pLN_TEXT = "pLN" 
    'ET CETERA 
    vWSs = Array("B", "E", "L", "I", "T") 
    With Workbooks("LBImportMacroTemplate.xlsm") 
     Set Mrange = Nothing: Set Vrange = Nothing 
' 
With ActiveSheet 
    lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row 
    MsgBox lastrow 
End With 
' 
For v = LBound(vWSs) To UBound(vWSs) 
    If CBool(Application.CountIf(.Sheets(vWSs(v)).Range("A2:ZA2"), mf_iA_TEXT)) Then 
     Set Mrange = .Sheets(vWSs(v)).Range("A2:ZA2") 
     Set Vrange = .Sheets(vWSs(v)).Range("A:ZA") 
     mf_iA = Application.Match(mf_iA_TEXT, Mrange, 0) 
Exit For 
    End If 
Next v 
For i = 2 To lastrow 
    wsMaster.Cells(i, 2) = Application.VLookup(wsMaster.Cells(i, 1), Vrange, mf_iA, 0) 
Next i 
Set Mrange = Nothing 
Set Vrange = Nothing 
' 
For v = LBound(vWSs) To UBound(vWSs) 
    If CBool(Application.CountIf(.Sheets(vWSs(v)).Range("A2:ZA2"), mf_pLN_TEXT)) Then 
     Set Mrange = .Sheets(vWSs(v)).Range("A2:ZA2") 
     Set Vrange = .Sheets(vWSs(v)).Range("A:ZA") 
     mf_pLN = Application.Match(mf_pLN_TEXT, Mrange, 0) 
Exit For 
    End If 
Next v 
For i = 2 To lastrow 
    wsMaster.Cells(i, 3) = Application.VLookup(wsMaster.Cells(i, 1), Vrange, mf_pLN, 0) 
Next i 
Set Mrange = Nothing 
Set Vrange = Nothing 
+0

的'Application.Vlookup'返回一個錯誤值的錯誤'2042'當結果無法找到,並且應當在目標打印該單元格爲'#N/A'。你描述的錯誤必須是由於除了沒有找到vlookup以外的東西。 – 2015-02-09 19:45:22

+0

如果'Vrange是Nothing',這個錯誤肯定會發生。 – 2015-02-09 19:53:00

+0

您能指出哪兩個VLOOKUP語句導致失敗? – 2015-02-09 19:56:15

回答

1

VLookup語句將失敗,所描述的錯誤消息。

很難理解你想要做什麼,但我會盡力將其分解。這裏有一個循環,返回TrueCBool表達式的第一個實例。

For v = LBound(vWSs) To UBound(vWSs) 
    If CBool(Application.CountIf(.Sheets(vWSs(v)).Range("A2:ZA2"), mf_iA_TEXT)) Then 
     Set Mrange = .Sheets(vWSs(v)).Range("A2:ZA2") 
     Set Vrange = .Sheets(vWSs(v)).Range("A:ZA") 
     mf_iA = Application.Match(mf_iA_TEXT, Mrange, 0) 
     Exit For 
    End If 
Next v 

此時假設環路由Exit For聲明退出,VRange對象應該存在並且是一個有效的範圍內,所以下一個循環不應失敗:

For i = 2 To lastrow 
     wsMaster.Cells(i, 2) = Application.VLookup(wsMaster.Cells(i, 1), Vrange, mf_iA, 0) 
    Next i  

無論其如果第一個循環完成而沒有「找到」值mf_iA_Text,那麼VRange對象不是有效範圍,那會導致err要麼。

推薦通過將第二循環中的第一內部修改:

For v = LBound(vWSs) To UBound(vWSs) 
    If CBool(Application.CountIf(.Sheets(vWSs(v)).Range("A2:ZA2"), mf_iA_TEXT)) Then 
     Set Mrange = .Sheets(vWSs(v)).Range("A2:ZA2") 
     Set Vrange = .Sheets(vWSs(v)).Range("A:ZA") 
     mf_iA = Application.Match(mf_iA_TEXT, Mrange, 0) 

     For i = 2 To lastrow 
      wsMaster.Cells(i, 2) = Application.VLookup(wsMaster.Cells(i, 1), Vrange, mf_iA, 0) 
     Next i 

     Exit For 
    End If 
Next v 
+0

嗨大衛,你的代碼修訂的工作原理是,如果沒有找到該列,它將不返回任何內容。不是#N/A,只是空白,但我實際上認爲這是首選,我可能會這樣做,所以它給了用戶一個msgbox,說它無論如何都找不到該列的任何內容。所以,我打算把這個標記爲正確的。非常感謝你的幫助!! – msim 2015-02-10 20:20:59

相關問題