使用VBA执行vlookup



我正在使用以下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中既可以有数字值,也可以有字符值,因此应该声明数据类型VariantE_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

最新更新