2016-05-01 252 views
0

我正在使用以下vba代碼執行vlookup。奇怪的是,它只有在查找值(單元格C1)中有文本時才起作用。如果單元格C1中的查找值是一個數字(不是文本),它不起作用。任何想法爲什麼?使用VBA執行vlookup

Sub FINDVAL() 
    On Error GoTo MyErrorHandler: 
    Dim E_name As String 
    E_name = Range("C1").Value 
    If Len(E_name) > 0 Then 
     Sal = Application.WorksheetFunction.VLookup(E_name, Sheet1.Range("A1:B100000"), 2, False) 
     MsgBox "Salary is : $ " & Sal 
    Else 
     MsgBox ("You entered an invalid value") 
    End If 
    Exit Sub 
MyErrorHandler: 
    If Err.Number = 1004 Then 
     MsgBox "Employee Not Present in the table." 
    End If 
    End Sub 
+3

因爲你 「暗淡」 E_Name爲字符串,我想。所以你通過VLookup一個字符串,這意味着它只會匹配字符串?從文檔中,關於函數中的第四個參數:「如果range_lookup參數爲FALSE,則VLOOKUP將僅查找完全匹配」。爲什麼不傳遞'Range(「C1」)而不是E_name? –

+0

考慮將E_Name標註爲Variant類型,以便它可以接收文本或數字。還要確保你在Excel中使用的公式以你想要的方式在Excel中工作,然後再將它放到VBA工作表函數中。您可能還需要考慮指定您使用哪個工作表來引用C1。 –

回答

0

要回答未來引用的問題,如果由於某種原因需要將變量聲明爲字符串,但也會遇到整數。你可以做這樣的事情。

If Len(E_name) > 0 Then 
     If IsNumeric(E_name) Then 
      Sal = Application.WorksheetFunction.VLookup(CDbl(E_name), Sheet1.Range("A1:B100000"), 2, False) 
     Else 
      Sal = Application.WorksheetFunction.VLookup(E_name, Sheet1.Range("A1:B100000"), 2, False)    
     End If 
     MsgBox "Salary is : $ " & Sal 
Else 
     MsgBox ("You entered an invalid value") 
End If 
+1

我建議你的意思是'CDbl(E_name)'...因爲尋找「1.5」可能會導致錯誤'CInt(E_name)' –

+0

@DirkReichel,很好的捕獲。我沒有想到有十進制數字。謝謝。 – 2016-05-01 22:29:12

0

這是因爲你在聲明變量E_nameString。這種聲明後的任何變量初始值將只接受String值。

只有當你確信它的所有實例都將是相同的數據類型的定義變量的數據類型

在這種情況下,因爲你可以有數字和字符值C1,你應該申報的數據類型Variant這是一個普遍的數據類型的E_name

如有疑問,請使用TypeName()方法檢查變量的數據類型。

例子:

Public Sub variantTest() 
    Dim E_name As Variant 

    E_name = "John" 
    Debug.Print E_name & ":" & TypeName(E_name)  'Prints "John:String" 

    E_name = 2 
    Debug.Print E_name & ":" & TypeName(E_name)  'Prints "2:Integer" 

    E_name = 9.99 
    Debug.Print E_name & ":" & TypeName(E_name)  'Prints "9.99:Double" 

    E_name = #1/1/2016# 
    Debug.Print E_name & ":" & TypeName(E_name)  'Prints "01-01-2016:Date" 
End Sub