使用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
有什么建议吗?
答案 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))
没有保存可转换为单一数据类型的表达式,也会导致错误。
最后,我添加了三行代码来将您测试的每个表达式打印到立即窗口。您可以使用此类功能找出三者中的哪一个会产生问题。