匹配不工作Excel:错误1004无法获取匹配属性

时间:2014-02-17 21:49:42

标签: excel excel-vba vba

Sub Sales_Summary_Macro()

    Dim strMake, strModel, strCount As String
    Dim makeLoc, modelLoc, countLoc As Integer

    strMake = Application.InputBox("Make")
    strModel = Application.InputBox("Model")
    strCount = Application.InputBox("Count")

    If strMake <> False Then
        Debug.Print strMake
        Debug.Print strModel
        Debug.Print strCount
        makeLoc = WorksheetFunction.Match(strMake, Range("A1:A10"), 0)
        Debug.Print makeLoc
    End If

End Sub

我只想在三个不同的变量上获取用户的字符串输入,并找到包含每个变量的列。我单独尝试过Application.Match()和Match(),但似乎都不起作用。

3 个答案:

答案 0 :(得分:4)

不完全技术,不会发布代码。但是,有三件事:

一个,确保您的范围始终完全合格。例如,Range("A1:A10")还不够。您应该指定它应该位于哪个工作表上。如果您从另一个工作表调用此宏,它将给您一个错误的结果或抛出错误。

两个,没有太多细节:

    如果找不到匹配项,则
  1. Application.Match会返回错误值。这可以使用IsError来处理,这是simoco在他的回答中所做的。
  2. WorksheetFunction.Match 在找不到错误时抛出 1004错误。这与返回值不同。因此,这(稍微)难以处理。
  3. 最佳做法是始终使用第一个。

    ,VBE中的即时窗口是您最好的朋友。窗口中的简单?Application.Match("FindMe", [A1:A10], 0)可以帮助您检查您的公式是否符合类似预期的结果。

    Application.Match returning an error value

    如上面的屏幕截图所示,找不到任何字符串,并返回错误值。

    希望这有帮助!

答案 1 :(得分:2)

<强> UPD:

  

是否可以让它像C1一样返回单元格引用,然后在其他函数中使用该单元格引用

Sub Sales_Summary_Macro()
    Dim strMake As String, strModel  As String, strCount As String
    Dim makeLoc, modelLoc As Integer, countLoc As Integer
    Dim res As Range
    strMake = Application.InputBox("Make")
    strModel = Application.InputBox("Model")
    strCount = Application.InputBox("Count")

    If strMake <> "False" Then
        Debug.Print strMake
        Debug.Print strModel
        Debug.Print strCount
        On Error Resume Next
        'Set res = Range("A1:Z1").Find(What:=strMake, LookAt:=xlWhole, MatchCase:=False)
        Set res = Application.Index(Range("A1:A10"), Application.Match(strMake, Range("A1:A10"), 0))
        On Error GoTo 0
        If res Is Nothing Then
            MsgBox "Nothing found!"
            Exit Sub
        End If
        'Print address of result
        Debug.Print res.Address

        makeLoc = res.Value
        Debug.Print makeLoc
    End If
End Sub

BTW,

当您使用Dim strMake, strModel, strCount As String时,只有strCount的类型为StringstrMake, strModelVariant

Dim makeLoc, modelLoc, countLoc As Integer同样的事情 - 只有countLocInteger类型。

答案 2 :(得分:0)

这不是OP的直接答案,但是像我这样的人在尝试 TRAP vba Match错误时可能会发现此问题很有用。通常,我将使用它来测试数组中是否存在值。

使用Application.Worksheetfunction.Match时非常发疯,并且当不存在值时无法用True捕获IsError。甚至WorksheetFunction错误处理程序(iserrisNA等)也不会将其捕获为True,而是抛出 1004无法获得匹配的VBA错误。属性

这可以通过使用Application.Match而不是Application.WorksheetFunction.Match来解决。这是最违反直觉的,因为在输入Match之后Application.不会出现在智能感知中,也不会显示Application.Match(提示输入哪些字段。

同时使用Application.WorksheetFunction.Match 自动填充提示,可以理解的是,这些提示可以激发用户采用这种方法,然后感到困惑,为什么他们无法成功捕获错误。