【问题标题】:Problem with Match function returning Type Mismatch (VBA EXCEL)Match函数返回类型不匹配的问题(VBA EXCEL)
【发布时间】:2019-02-25 16:53:23
【问题描述】:

我在使用匹配功能时遇到错误,我找不到问题所在,请您帮帮我好吗? 我也想知道我们是否可以使用 Find 功能做同样的事情。

我命名了名为DataListName 的范围,它位于工作表“数据”(ID 名称)或“数据库”(工作表名称)中 DataListName 代表列 C

DataListName=数据库!$C:$C

我正在尝试在 C 列中找到行,文本 ListABC

这是我的代码:

Dim ListNameArr As Variant
Dim LookupRow As Long
Dim ListNameValue As String


ListNameValue ="ListABC"

With wsData

ListNameArr = .Range("DataListName").Value

LookupRow = Application.WorksheetFunction.Match(ListNameValue, ListNameArr, 0)

end with

任何人都可以向我解释错误在哪里?如果我可以用 Find 方法做同样的事情,如何以及哪个更好?

编辑:

如果我按照建议替换

LookupRow = Application.WorksheetFunction.Match(ListNameValue, ListNameArr, 0)

通过

LookupRow = Application.WorksheetFunction.Match(ListNameValue, .Range("DataListName"), 0),我没有类型不匹配了,但是另一个错误,

运行时错误“1004”无法获取匹配属性 WorksheetFunction 类

仅供参考,如果可能有帮助,我打开了另一个工作簿,实际上我的工作簿打开了另一个工作簿,但是正如您在我的代码中看到的那样,我有 ws.data 的参考,所以我不知道如果打开另一个工作簿的事实导致此错误或什么

【问题讨论】:

  • ListNameArr = .Range("DataListName").Value 创建一个二维数组,而 MATCH 不适用于二维数组。只需使用 MATCH 中的范围:LookupRow = Application.WorksheetFunction.Match(ListNameValue, .Range("DataListName"), 0)
  • 啊,我不知道 Match 不支持二维数组,我会试一试并告诉你...你能告诉我如何用 find 做到这一点吗?我读到 find 和 match 也一样,什么更好?
  • 对于单列查找匹配更快。我根本不使用 Find 那么多,所以除了 MicroSoft 在他们自己的文档中已经编写的内容之外,我无法提供帮助。
  • 这是从垂直范围进行批量填充的性质,数组变成二维的。一维数组是水平的。
  • 第二个维度是1,对于一个列,第一个维度是行数。

标签: excel vba


【解决方案1】:

正如 cmets 中所解释的,当您将范围设置为值时,您正在执行 Match 不支持的 2-dim 数组。而是改写你的代码如下:

Dim ListNameArr As Range, LookupRow As Long, ListNameValue As String

ListNameValue = "ListABC"

Set ListNameArr = wsData.Range("DataListName")

LookupRow = Application.WorksheetFunction.Match(ListNameValue, ListNameArr, 0)

以下是您可以如何利用 Find 列 C 并返回该行。如果您想更改搜索范围,希望您可以根据需要进行调整。

LookupRow = ListNameArr.Cells.Find(What:=ListNameValue, _
        LookIn:=xlFormulas, _
        LookAt:=xlPart, _
        SearchOrder:=xlByRows, _
        SearchDirection:=xlNext, _
        MatchCase:=False, _
        SearchFormat:=False).Row

Here's some other examples 使用 find 功能你可能会觉得有用:

Sub Find_Example_WithLoop()
    Dim CL As Range, FirstFoundAddress As String
    Dim WS As Worksheet: Set WS = ActiveSheet

'FIND SYNTAX By PGCodeRider

'LOOKIN: xlFormulas , xlValues , or xlNotes
'LookAT: xlWhole or XlPart
'SearchOrder: xlByRows or xlByColumns
'SearchDirection: xlNext or xlPrevious
'MatchCase: True or False
'FindNext - Continues a search that was begun with the Find method. Finds the next cell that matches those same conditions.

    ' Find first instance on sheet
   Set CL = WS.Cells.Find(What:="BOOOOM", _
        After:=WS.Cells(1, 1), _
        LookIn:=xlFormulas, _
        LookAt:=xlPart, _
        SearchOrder:=xlByRows, _
        SearchDirection:=xlNext, _
        MatchCase:=False, _
        SearchFormat:=False)
    If Not CL Is Nothing Then
        ' if found, remember location, else ends if-statement

        FirstFoundAddress = CL.Address

        Do
            'DO SOMETHING!!

            ' find next instance
           Set CL = WS.Cells.FindNext(After:=CL)
            ' repeat until finds original cell
       Loop Until FirstFoundAddress = CL.Address

    End If
    Next
End Sub

下面是一个 match 与一个方法一起使用的例子,如果没有找到就处理错误:

Sub matchExample()
Dim text2match As String: text2match = "matchME"
Dim rng2Match As Range: Set rng2Match = Range("A:A")


'should return an integer
On Error GoTo notGOOD
MsgBox Application.WorksheetFunction.Match(text2match, rng2Match, 0)
On Error GoTo 0

Exit Sub

notGOOD:
MsgBox "Couldn't find " & text2match


End Sub

【讨论】:

  • 我会将你的答案标记为精选答案,即使它不是我最后使用的答案,但因为你努力提供帮助,你应该得到声望奖励。非常感谢您的帮助
【解决方案2】:

我用下面的代码绕过了错误

Dim Var As Variant
Var = Application.Match(ListNameValue, .Range("DataListName"), 0)
If Not IsError(Var) Then
LookupRow = CLng(Var)
Else
LookupRow = 0

如果结束

【讨论】:

  • 为什么不去掉“不”并反转 if/else 条件?稍微简单一点。
  • 因为Not iserror里面的代码是大代码这是部分代码,else里面的代码只有一行lookupronw=0,所以我更喜欢上面的大代码发现更容易阅读
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
相关资源
最近更新 更多