我正在使用以下vba代码来执行vlookup。奇怪的是,它只在查找值(单元格C1)中有文本时才起作用。如果单元格C1中的查找值是数字(而不是文本),则它不起作用。有什么想法吗?
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
这是因为您将变量E_name
声明为String
。在这样的声明之后的任何变量初始化都将只接受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
为了回答未来引用的问题,如果出于某种原因需要将变量声明为字符串,但也会遇到整数。你可以这样做。
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