= MATCH () эквивалент для многомерных диапазонов - PullRequest
1 голос
/ 24 августа 2011

У меня есть лист Excel, где ячейки A1-C20 = =INT(RAND()*10).Это мой диапазон данных.Ячейка E1 = 1, E2 = 2, E3 = 3 и т. Д. Это значения, которые я пытаюсь найти.Я установил ячейку F1 = =MATCH(E1,A:C,0), F2 = =MATCH(E1,A:C,0) и т. Д.

Однако все функции MATCH возвращают #N/A, поскольку входной диапазон является многомерным.Как проверить, существует ли заданное значение (1, 2, 3, 4 и т. Д.) В многомерном диапазоне (A1-C20)?

/ edit: Эта функция работает,но это больше, чем мне нужно.Есть ли способ заставить его возвращать только TRUE или FALSE, в зависимости от того, находится ли искомое значение в диапазоне?

Function OzgridLookup(Find_Val As Variant, Occurrence As Long, Table_Range As Range, _
 Offset_Cols As Long, Optional Column_Lookin As Long, Optional Row_Offset As Long) As Variant

Dim lLoop As Long
Dim FoundCell As Range

    If Column_Lookin = 0 Then 'No column # specified
        With Table_Range
            'Top left cell has Find_Val & Occurrence is 1
            If Table_Range.Cells(1, 1) = Find_Val And Occurrence = 1 Then
              OzgridLookup = .Cells(1, 1)(1, Offset_Cols + 1)
              Exit Function 'All done :)
            Else 'No column # specified so search all for _
                    nth Occurrence reading left to right
             Set FoundCell = .Cells(1, 1) 'Set cell variable for Find start
                For lLoop = 1 To Occurrence 'Loop as many times as Occurrences _
                 and each time Set "FoundCell" to start next Find from
                  Set FoundCell = _
                        Table_Range.Find(What:=Find_Val, After:=FoundCell, _
                            LookIn:=xlValues, LookAt:=xlWhole, _
                            SearchOrder:=xlRows, SearchDirection:=xlNext)
                Next lLoop
            End If
        End With
    Else 'column # specified
      With Table_Range.Columns(Column_Lookin) 'Work with column # specified
        Set FoundCell = .Cells(1, 1) 'Set cell variable for Find start
            For lLoop = 1 To Occurrence 'Loop as many times as Occurrences _
                 and each time Set "FoundCell" to start next Find from
                  Set FoundCell = _
                        Table_Range.Find(What:=Find_Val, After:=FoundCell, _
                            LookIn:=xlValues, LookAt:=xlWhole, _
                            SearchOrder:=xlRows, SearchDirection:=xlNext)
            Next lLoop
      End With
    End If

    OzgridLookup = FoundCell.Offset(Row_Offset, Offset_Cols)

End Function

1 Ответ

5 голосов
/ 24 августа 2011

Вы можете использовать COUNTIF, чтобы сделать это, поскольку вам нужно только узнать, присутствует ли номер (не его местоположение).

=COUNTIF(A:C,E1)>0

Это вернет «ИСТИНА», если он присутствует, «ЛОЖЬ»если это не так.

Просто для удовольствия, вот решение для функции листа, которое возвращает адрес ячейки, который соответствует значению поиска.Он использует тот факт, что вы ищете только в 3 столбцах.

=IF(ISERROR(MATCH(E1,A:A,0)),IF(ISERROR(MATCH(E1,B:B,0)),IF(ISERROR(MATCH(E1,C:C,0)),"Not found.","C"&MATCH(E1,C:C,0)),"B"&MATCH(E1,B:B,0)),"A"&MATCH(E1,A:A,0))

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

Public Function MDMATCH(srchfor As String, lookin As Range) As String

Application.Volatile
Dim RngArray() As Variant
Dim topleft As String
Dim tmpval As String

topleft = lookin.Address
topleft = Left(topleft, InStr(topleft, ":") - 1)
tmpval = "Not found."
RngArray = lookin

For i = 1 To UBound(RngArray, 2)
    If tmpval = "Not found." Then
        For j = 1 To UBound(RngArray, 1)
            If RngArray(j, i) = srchfor Then
                tmpval = Range(topleft).Offset(j - 1, i - 1).Address
                Exit For
            End If
        Next j
    Else
        Exit For
    End If
Next i
MDMATCH = tmpval
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...