VBA代码抛出错误号1004

时间:2017-04-27 08:28:21

标签: excel vba excel-vba runtime-error

使用MS Office 2010

这是我的第一个宏代码。 它与Vlookup非常相似,不同之处在于源数组中没有精确匹配而是范围。

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

如果查找值出现,Range和其他参数也匹配,那么这就是所需的值。

但是当我尝试运行此代码时,每行的功能EIL_Code 中都有错误号1004

我尝试将所有数据转换为特定类型,如String,Single等。

复制整个数据并从中删除所有格式,但仍然无效。

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

有什么建议吗?

1 个答案:

答案 0 :(得分: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添加到范围(或单元格)定义中。

如果.Cells(2).Value)中的CSng(.Cells(2).Value))没有保存可转换为单一数据类型的表达式,也会导致错误。

最后,我添加了三行代码来将您测试的每个表达式打印到立即窗口。您可以使用此类功能找出三者中的哪一个会产生问题。