Vba 使用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("

我正在尝试使用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("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错误,我们有两个错误。阅读以了解更多信息。