使用匹配函数在表中查找文本

时间:2017-05-11 05:35:52

标签: excel vba excel-vba excel-2010

我正在尝试使用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)

给我一​​个类型不匹配。

1 个答案:

答案 0 :(得分:1)

问题是如果Sch是数字并且您将其转换为带有

的字符串
Dim Sch As String
Sch = Worksheets("Sheet2").Range("R36").Value

然后您尝试将字符串SchRange("R3:AD3")匹配,但此操作失败,因为范围内没有字符串Sch,只有数字Sch

另外,您应该注意到Application.MatchApplication.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

因此我建议如下:

  1. 声明NPSSch作为变体
  2. 始终使用WorksheetFunction
  3. 所以我们最终得到了这个......

    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