Vba 使用match函数查找表中的文本
我正在尝试使用VBA在Excel中使用match函数。 这给了我一个不匹配的错误Vba 使用match函数查找表中的文本,vba,excel,excel-2010,Vba,Excel,Excel 2010,我正在尝试使用VBA在Excel中使用match函数。 这给了我一个不匹配的错误 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("
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
可以是数字或文本。现在,最后三行只是我试图测试Excel是否选取了正确的值
Sch
正确拾取文本和数字,但行
y = Application.Match(Sch, Worksheets("Sheet2").Range("R3:AD3"), 0)
给了我一个类型不匹配。问题是,如果
Sch
是数字,您将其转换为字符串
Dim Sch As String
Sch = Worksheets("Sheet2").Range("R36").Value
然后尝试将字符串Sch
与范围(“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
为变体工作表功能
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
修改
Dim x为Variant
,然后再试一次(这同样适用于y
)嗨@ShaiRado,我照你说的做了,现在当Sch是文本时它可以工作了。但是,当Sch是一个数字时,它返回N/a。我在excel上也有这个函数,所以我知道match函数应该为y拾取一个行号,但它没有。但是,它在代码中没有给出错误。Match仅适用于单个行或列:不能在表中使用它。为此,您需要类似于Find()
@TimWilliams的东西,我只是使用它来查找NPS和Sch变量的列和行号。我不认为我在引用一个表。@Peh,你知道代码可能有什么问题吗?我认为是对variant的更改造成的。谢谢你能解释一下你在你写的代码中,在退出子代码下面做了什么吗?(从errorMatchX:)最后一部分仅用于正常的错误处理。Match
函数如果没有找到搜索therm,将抛出一个错误,代码将崩溃。使用On Error GoTo ERRORMATCH X
我们告诉VBA,如果发生错误,我们希望跳转到ERRORMATCH X:
给出一个错误消息框,并使用退出sub
中止sub。一定要区分x和y错误,我们有两个错误。阅读以了解更多信息。