2016-05-01 20 views
0

Ich verwende den folgenden VBA-Code zum Ausführen eines vlookup. Seltsamerweise funktioniert es nur, wenn sich im Lookup-Wert Text befindet (Zelle C1). Wenn der Suchwert in Zelle C1 eine Zahl (kein Text) ist, funktioniert es nicht. Irgendwelche Gedanken warum?Verwenden von VBA zum Ausführen eines 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

Weil Sie E_Name als String "dimmen", würde ich denken. Sie übergeben VLookup also einen String, was bedeutet, dass nur Zeichenfolgen gefunden werden. Aus der Dokumentation zum vierten Argument in der Funktion: "Wenn das Argument range_lookup FALSE ist, findet SVERWEIS nur eine exakte Übereinstimmung". Warum nicht 'Range (" C1 ") statt E_name übergeben? –

+0

Erwägen Sie, E_Name als Variant-Typ zu bemaßen, sodass es entweder Text oder Zahlen empfangen kann. Stellen Sie außerdem sicher, dass die Formel, mit der Sie in Excel arbeiten, genau so arbeitet, wie Sie möchten, bevor Sie sie in VBA worksheetFunction platzieren. Sie sollten auch überlegen, welches Arbeitsblatt Sie für C1 verwenden. –

Antwort

0

Um die Frage für zukünftige Referenzen zu beantworten, wenn aus irgendeinem Grund Sie eine Variable als String deklarieren müssen, sondern auch ganze Zahlen begegnen. Sie können so etwas tun.

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

Ich schlage vor, du meintest 'CDbl (E_name)' ... weil die Suche nach "1.5" zu Fehlern mit 'CInt (E_name)' –

+0

@DirkReichel, guter Haken führen kann. Ich dachte nicht, dass es Dezimalzahlen gibt. Vielen Dank. –

0

Es ist, weil Sie die Variable E_name als String deklarieren. Jede Variableninitialisierung nach einer solchen Deklaration akzeptiert nur String Werte.

Definieren Sie nur den Datentyp der Variablen, wenn Sie sicher sind, dass alle Instanzen denselben Datentyp haben.

In diesem Fall, da Sie numerische sowie Zeichenwerte in C1 haben können, sollten Sie E_name des Datentyps Variant erklären, die ein universelles Datentyp ist.

Überprüfen Sie im Zweifelsfall den Datentyp Ihrer Variablen mit der Methode TypeName().

Beispiel:

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 
Verwandte Themen