2017-05-12 122 views
2

我想知道是否有人可以幫助我。我創建了一個非常簡單的用戶表單來記錄信息。然而,我的問題是,當其中一個字段爲空時,我收到一條錯誤消息:工作表功能錯誤子或功能未定義

未定義子或函數。

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 

的問題是在任,我收到錯誤註釋掉線之一。我只收到,如果我離開下拉框空。如果填充,則不會發生錯誤。我可以輕鬆地爲「不適用」選擇一個額外的菜單選項,但寧可只是空白。有沒有人有任何建議?

+0

哪一行在調試時突出顯示? – Kelaref

+0

@Kelaref無論哪個iRow,9我都取消註釋。對不起,我應該說。我原本只是把它看作是一個虛擬主機。當我得到錯誤時,我認爲Iferror函數可以解決問題,但它會產生相同的結果。 – MBrann

回答

3

三件事。

1- VLookup本身不是VBA函數,它是Application對象或WorksheetFunction對象的成員方法。因此,即使您使用另一種方法(如WorksheetFunction.IfError(...))中的,您也應該通過獲得VLookup

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

2-在WorksheetFunctionApplication對象相同的方法不同的方式工作。在前者中,如果結果是錯誤(例如:與搜索值不匹配),則VBA中會出現錯誤。在後者中,沒有錯誤發生,但返回的值是Error Variant。後一種形式通常對VBA更安全,因爲你不需要有一些On Error Resume Next左右,但你可以用If(IsError(result))來檢查結果。

3-當您的搜索條件爲空或無法匹配時,由於使用了WorksheetFunction.VLookup(根據2),導致出現錯誤。如果你的意圖是剛剛設置的結果值並繼續,您可以使用Application.VLookup代替:

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

附:大多數時候我個人比較喜歡Application.。有些人更喜歡WorksheetFunction,主要是因爲它提供了Intellisense,但我覺得這很沒用,因爲Intellisense中方法的參數是未命名的和未定義的,即VLookup(arg1, arg2, arg3, [arg4]) ..(對我來說是無意義的)。