Проблема с функцией соответствия, возвращающей несоответствие типов (VBA EXCEL) - PullRequest
0 голосов
/ 25 февраля 2019

Я получаю сообщение об ошибке при использовании функции Match и не могу найти проблему, не могли бы вы мне помочь?Я также хотел бы знать, можем ли мы сделать то же самое, используя функцию Find.

Я назвал диапазон с именем DataListName, он расположен на листе «Данные» (имя идентификатора) или «База данных» (листname) 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' Не удалось получить свойство Match класса WorksheetFunction

Просто для информации, если это может помочь, у меня открыта другая рабочая книга, фактически моя книга открыла другую, но, как вы можете видеть в моем коде, у меня есть ссылка на ws.data, поэтому я не знаюесли факт открытия другой книги вызывает эту ошибку или что

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Я использовал следующий код для обхода ошибки

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

End If

0 голосов
/ 25 февраля 2019

Как объяснено в комментариях, когда вы устанавливаете диапазон в значение, вы создаете 2-мерный массив, который Match не будет поддерживать.Вместо этого перепишите ваш код следующим образом:

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

Вот еще несколько примеров использования функции поиска, которые могут оказаться полезными:

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

Вот пример соответствия, используемого с методом для обработки ошибок, если ничего не найдено:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...