2017-04-27 125 views
-1

使用MS Office 2010的VBA代碼拋出錯誤編號1004

這是我的第一個宏代碼。 它非常像一個Vlookup,不同之處在於在源數組中,沒有完全匹配,而是一個範圍。

Size1 >= CSng(Worksheets("Sheet2").Cells(StartNumber, 2)) And Size1 <= CSng(Worksheets("Sheet2").Cells(StartNumber, 3))) 

如果查找值進來的範圍和其他參數也匹配,那就是所需的值。

但是,當我試圖運行這段代碼有錯誤數1004功能EIL_Code的每一行。

我嘗試了所有的數據轉換成specfic類型如String,單等

複製了完整的數據並刪除其中的所有格式,但是,它仍然不工作。

Sub CommandButton1_Click() 

    On Error GoTo MyErrorHandler: 

' Table1 = Sheet1.Range("A1:S4386") 
' Table2 = Sheet2.Range("A1:L1927") 

    EndNumber = 4386 

    For StartNumber = 2 To EndNumber 
     Spec_Item = CStr(Worksheets("Sheet1").Cells(StartNumber, 1)) 
     Size1_LT = CSng(Worksheets("Sheet1").Cells(StartNumber, 2)) 
     Size2_LT = Worksheets("Sheet1").Cells(StartNumber, 3) 

     Sheet1.Cells(StartNumber, 4) = EIL_Code(Spec_Item, Size1_LT) 

    Next StartNumber 


MyErrorHandler: 
    If Err.Number = 1004 Then 
     MsgBox "Employee Not in the table." 

    ElseIf Err.Number = 13 Then 
     MsgBox "Employee Not Present in the table." 

    End If 


End Sub 

Function EIL_Code(ByVal Spec_Item As String, ByVal Size1 As Single) As String 

    On Error GoTo MyErrorHandler: 

    EndNumber1 = 1927 

    For StartNumber1 = 2 To EndNumber1 

     If (Spec_Item = CStr(Worksheets("Sheet2").Cells(StartNumber, 1))) And (Size1 >= CSng(Worksheets("Sheet2").Cells(StartNumber, 2)) And Size1 <= CSng(Worksheets("Sheet2").Cells(StartNumber, 3))) Then 
      EIL_Code = CStr(Worksheets("Sheet2").Cells(StartNumber, 4)) 
     End If 

    Next StartNumber1 

MyErrorHandler: 
    If Err.Number = 1004 Then 
     MsgBox "Error Number 1004." 

    ElseIf Err.Number = 13 Then 
     MsgBox "Error Number 13." 
    End If 


End Function 

有什麼建議?

+4

你在代碼中得到'.Cells(StartNumber,1)',但你的for循環使用'StartNumber1'而不是'StartNumber'。我建議聲明所有變量並使用'Option Explicit'來避免這種情況。請參見[VBA最佳實踐 - 始終使用'Option Explicit'](http://stackoverflow.com/documentation/excel-vba/1107/vba-best-practices)。 –

+0

@Peh:它的工作。謝謝很多指出錯誤。 也感謝您使用「Option Explicit」的建議,從現在開始。 –

回答

0

您的代碼提供了很多發生錯誤的可能性。我重新編寫它以使其可讀。

With Worksheets("Sheet2").Rows(StartNumber) 
    ' Debug.Print CStr(.Cells(1).Value) 
    ' Debug.Print CSng(.Cells(2).Value) 
    ' Debug.Print CSng(.Cells(3).Value) 
    If (Spec_Item = CStr(.Cells(1).Value)) And _ 
        (Size1 >= CSng(.Cells(2).Value)) And _ 
        (Size1 <= CSng(.Cells(3).Value)) Then 
     EIL_Code = CStr(.Cells(4).Value) 
    End If 
End With 

最重要的,也許,你應該在你的代碼頁的頂部使用Option Explicit,這樣可以VBA指出命名的錯誤給你。其次,不要混淆VBA或你自己或兩者,不要宣稱你是在談論一個細胞還是它的價值。如果要引用其值,請始終將.Value添加到範圍(或單元格)的定義中。

如果CSng(.Cells(2).Value))中的.Cells(2).Value)不包含可以轉換爲Single數據類型的表達式,則也會導致錯誤。

最後,我添加了三行代碼來打印您測試到立即窗口的每個表達式。您可以使用這些功能找出三者中的哪一個產生問題。