我正在尝试使用VBA在Excel中使用匹配功能。 它给了我一个不匹配的错误。
Sub pipe_size()
Dim x As Single
Dim y As Single
Dim NPS As Single
Dim Sch As String
Dim z As Single
NPS = Worksheets("Sheet2").Range("R35").Value
Sch = Worksheets("Sheet2").Range("R36").Value
'x is column number, y is row number
x = Application.Match(NPS, Worksheets("Sheet2").Range("Q5:Q33"), 0)
'y = Application.Match(Sch, Worksheets("Sheet2").Range("R3:AD3"), 0)
Worksheets("Sheet2").Range("Y34").Value = Sch
Worksheets("Sheet2").Range("Y35").Value = x
'Worksheets("Sheet2").Range("Y36").Value = y
End Sub
NPS
只是一个数字,但Sch
可以是数字或文字。现在,最后3行只是我试图测试Excel是否正在获取正确的值。
Sch
正确选取文字和数字,但
y = Application.Match(Sch, Worksheets("Sheet2").Range("R3:AD3"), 0)
给我一个类型不匹配。
答案 0 :(得分:1)
问题是如果Sch
是数字并且您将其转换为带有
Dim Sch As String
Sch = Worksheets("Sheet2").Range("R36").Value
然后您尝试将字符串Sch
与Range("R3:AD3")
匹配,但此操作失败,因为范围内没有字符串Sch
,只有数字Sch
。
另外,您应该注意到Application.Match
和Application.WorksheetFunction.Match
之间存在差异。第一个是VBA函数,第二个与工作表中使用的工作表函数=MATCH()
相同。
他们的行为不同:
v = Application.Match(7, Array(1, 2, 3), 0)
此处将错误2042分配给变量v
。 VBA无法捕获任何错误。
但是这个
v = WorksheetFunction.Match(7, Array(1, 2, 3), 0)
导致运行时错误1004可被VBA捕获,如
On Error Resume Next
v = WorksheetFunction.Match(7, Array(1, 2, 3), 0)
Debug.Print Err.Number
On Error GoTo 0
因此我建议如下:
NPS
和Sch
作为变体WorksheetFunction
所以我们最终得到了这个......
Sub pipe_size()
Dim x As Variant, y As Variant
Dim NPS As Variant, Sch As Variant
NPS = Worksheets("Sheet2").Range("R35").Value
Sch = Worksheets("Sheet2").Range("R36").Value
'x is column number, y is row number
On Error GoTo errorMatchX
x = Application.WorksheetFunction.Match(NPS, Worksheets("Sheet2").Range("Q5:Q33"), 0)
On Error GoTo errorMatchY
y = Application.WorksheetFunction.Match(Sch, Worksheets("Sheet2").Range("R3:AD3"), 0)
On Error GoTo 0
Worksheets("Sheet2").Range("Y34").Value = Sch
Worksheets("Sheet2").Range("Y35").Value = x
Worksheets("Sheet2").Range("Y36").Value = y
Exit Sub
errorMatchX:
If Err.Number = 1004 Then
MsgBox "x did not match."
Else
MsgBox "Error: " & Err.Number & ": " & Err.Description, vbCritical, Err.Source, Err.HelpFile, Err.HelpContext
End If
Exit Sub
errorMatchY:
If Err.Number = 1004 Then
MsgBox "y did not match."
Else
MsgBox "Error: " & Err.Number & ": " & Err.Description, vbCritical, Err.Source, Err.HelpFile, Err.HelpContext
End If
End Sub