2017-05-12 3 views
2

Ich fragte mich, ob jemand mir bitte helfen könnte. Ich habe ein sehr einfaches Benutzerformular erstellt, um Informationen zu protokollieren. Mein Problem ist jedoch, wenn eines der Felder leer ist, erhalte ich eine Fehlermeldung:WorksheetFunction error Sub oder Funktion nicht definiert

Sub oder Funktion nicht definiert.

Private Sub CommandButton1_Click() 

Dim iRow As Long 
Dim ws As Worksheet 
Set ws = Worksheets("Data") 

'find first empty row in database 
iRow = ws.Cells.Find(What:="*", SearchOrder:=xlRows, _ 
    SearchDirection:=xlPrevious, LookIn:=xlValues).Row + 1 

'check for a Name number 
    If Trim(QueryType.Value) = "" Then 
     QueryType.SetFocus 
      MsgBox "Please complete the form" 
     Exit Sub 
    End If 

    'copy the data to the database 
    ws.Cells(iRow, 1).Value = Format(Now, "DD/MM/YYYY") 
    ws.Cells(iRow, 2).Value = Format(Now, "HH:MM") 
    ws.Cells(iRow, 3).Value = Application.UserName 
    ws.Cells(iRow, 4).Value = CType.Value 
    ws.Cells(iRow, 5).Value = IName.Value 
    ws.Cells(iRow, 6).Value = QType.Value 
    ws.Cells(iRow, 7).Value = 1 
    ws.Cells(iRow, 8).Value = Format(Date, "MMM-YY") 
    'ws.Cells(iRow, 9).Value = Application.WorksheetFunction.VLookup(InternalName.Value, Sheet2.Range("C1:D23"), 2, 0) 
    'ws.Cells(iRow, 9).Value = Application.WorksheetFunction.IfError(VLookup(InternalName.Value, Sheet2.Range("C1:D23"), 2, 0), "") 
    ws.Cells(iRow, 10).Value = Application.WorksheetFunction.VLookup(InternalName.Value, Sheet2.Range("C1:E23"), 3, 0) 
    ws.Cells(iRow, 11).Value = "IB" 

Unload Me 

MsgBox "Data added", vbOKOnly + vbInformation, "Data Added" 

End Sub 

Das Problem in entweder einer der kommentierten aus Linien, wo ich den Fehler erhalten. Ich erhalte nur, wenn ich die Dropdown-Box leer lasse. Wenn es gefüllt ist, tritt kein Fehler auf. Ich könnte leicht eine zusätzliche Menüoption für "Nicht anwendbar" anpassen, aber es wäre eher leer. Hat jemand bitte irgendwelche Vorschläge?

+0

Welche Zeile ist markiert, wenn Sie debuggen? – Kelaref

+0

@Kelaref was auch immer iRow, 9 ich kommentieren. Entschuldigung, hätte ich sagen sollen. Ich hatte es ursprünglich nur als Vlookup. Als ich den Fehler bekam, dachte ich, dass eine Iferror-Funktion das Problem lösen würde, aber es führt zu demselben Ergebnis. – MBrann

Antwort

3

Drei Dinge.

1- VLookup ist keine VBA-Funktion für sich, es ist eine Member-Methode entweder des Application Objekts oder des WorksheetFunction Objekts. Sie sollten also VLookup von entweder qualifizieren, auch wenn Sie es in einer anderen Methode wie WorksheetFunction.IfError(...) hatten.

ws.Cells(iRow, 9).Value = 
WorksheetFunction.IfError(WorksheetFunction.VLookup(InternalName.Value, Sheet2.Range("C1:D23"), 2, 0), "") 
'       ^^^^^^^^^^^^^^^^^^ 

2- Die gleichen Verfahren, die in WorksheetFunction und in Application Objekten anders arbeiten. Im ersten Fall wird in VBA ein Fehler ausgelöst, wenn das Ergebnis ein Fehler ist (z. B .: keine Übereinstimmung für den gesuchten Wert). In letzterem Fall wird kein Fehler ausgelöst, aber der zurückgegebene Wert ist ein Error Variant. Diese letzte Form ist in der Regel sicherer für VBA, weil Sie nicht einige On Error Resume Next oder so haben müssen, aber Sie können einfach das Ergebnis mit If(IsError(result)) überprüfen.

3- Wenn Ihre Suchkriterien leer oder nicht übereinstimmend sind, wurde der Fehler aufgrund der Verwendung von WorksheetFunction.VLookup (gemäß 2) angezeigt. Wenn Ihre Absicht ist es, nur den sich ergebenden Wert gesetzt und gehen, können Sie Application.VLookup statt:

ws.Cells(iRow, 9).Value = Application.IfError(Application.VLookup(InternalName.Value, Sheet2.Range("C1:D23"), 2, 0), "") 

P. S. Ich persönlich bevorzuge Application. die meiste Zeit. Einige bevorzugen WorksheetFunction vor allem, weil es Intellisense bietet, aber ich finde, dass ziemlich nutzlos, weil die Argumente der Methoden in Intellisense sind unbenannt und unbenannt, d. H. VLookup(arg1, arg2, arg3, [arg4]) .. (Non-Sinn für mich).