Как найти подходящую строку в Excel? - PullRequest
3 голосов
/ 21 сентября 2010

Дано

Ключ поиска

---------------------------
|   |  A  | B | C |   D   |
---------------------------
| 1 | 01  | 2 | 4 | TextA |
---------------------------

Лист Excel

------------------------------
|   |  A | B | C |   D   | E |
------------------------------
| 1 | 03 | 5 | C | TextZ |   |
------------------------------
| 2 | 01 | 2 | 4 | TextN |   |
------------------------------
| 3 | 01 | 2 | 4 | TextA |   |
------------------------------
| 4 | 22 | T | N | TextX |   |
------------------------------

Вопрос

Я хотел бы иметь такую ​​функцию: f (ключ) -> result_row.

Это означает, что при заданном ключе поиска (01, 2, 4, TextA) функция должна сообщить мне, чтосоответствующая строка равна 3 в приведенном выше примере.

Значения в ключе поиска (A, B, C, D) являются уникальным идентификатором.

Как получить номер строкисоответствующая строка?

Одно решение

Первое, что пришло мне в голову, - это использовать Visual Basic для приложений (VBA) для сканирования столбца A на «01».,Найдя ячейку, содержащую «01», я проверю соседние ячейки в столбцах B, C и D. соответствуют ли они моим критериям поиска.

Полагаю, этот алгоритм будет работать.Но: есть ли лучшее решение?

Версия

  • Excel 2000 9.0.8961 SP3
  • VBA 6.5

Однако, если вам случится узнать решение в каких-либо более высоких версиях Excel или VBA, мне также интересно узнать это.

Редактировать: 22.09.2010

Спасибо всем за ваши ответы.@MikeD: очень хорошая функция, спасибо!

Мое решение

Вот решение, которое я создал на прототипе.Это все жестко запрограммировано, слишком многословно и не является функцией, как в решении MikeD.Но я перепишу его в моем реальном приложении, чтобы получить параметры и вернуть значение результата.

Sub FindMatchingRow()
    Dim searchKeyD As Variant
    Dim searchKeyE As Variant
    Dim searchKeyF As Variant
    Dim searchKeyG As Variant

    Const indexStartOfRange As String = "D6"
    Const indexEndOfRange As String = "D9"

    ' Initialize search key
    searchKeyD = Range("D2").Value
    searchKeyE = Range("E2").Value
    searchKeyF = Range("F2").Value
    searchKeyG = Range("G2").Value


    ' Initialize search range
    myRange = indexStartOfRange + ":" + indexEndOfRange

    ' Iterate over given Excel range
    For Each myCell In Range(myRange)

        foundValueInD = myCell.Offset(0, 0).Value
        foundValueInE = myCell.Offset(0, 1).Value
        foundValueInF = myCell.Offset(0, 2).Value
        foundValueInG = myCell.Offset(0, 3).Value

        isUnitMatching = (searchKeyD = foundValueInD)
        isGroupMatching = (searchKeyE = foundValueInE)
        isPortionMatching = (searchKeyF = foundValueInF)
        isDesignationMatching = (searchKeyG = foundValueInG)
        isRowMatching = isUnitMatching And isGroupMatching And isPortionMatching And isDesignationMatching

        If (isRowMatching) Then
            Range("D21").Value = myCell.Row
            Exit For
        End If

    Next myCell
End Sub

Это лист Excel, который идет с кодом выше:

alt text

Ответы [ 3 ]

4 голосов
/ 21 сентября 2010

вот небольшая функция VBA, которую я часто использую для таких целей

Function FindInRange(InRange As Range, Arg As Range) As Integer
Dim Idx As Integer, Jdx As Integer, IsFound As Boolean

    FindInRange = 0
    IsFound = False

    For Idx = 1 To InRange.Rows.Count
        IsFound = True
        For Jdx = 1 To InRange.Columns.Count
            If InRange(Idx, Jdx) <> Arg(1, Jdx) Then
                IsFound = False
                Exit For
            End If
        Next Jdx

        If IsFound Then
            FindInRange = Idx
            Exit For
        End If
    Next Idx

End Function

InRange должен быть такой же ширины или шире, как Arg, но, конечно, может быть больше или меньше, чем ваш A: D

В листе с образцами введите в пустую ячейку "= findinrange (A1: D4, A3: D3)"

Формула вернет "0", если ничего не найдено, иначе строка #

Удачи - MikeD

0 голосов
/ 21 сентября 2010

Другой вариант - добавить новый столбец в таблицу Excel, где столбцы A: D объединяются, а затем использовать функцию lookup/sverweis.Вероятно, это будет быстрее, чем решение VBA.

0 голосов
/ 21 сентября 2010

Предположим, ваш ключ поиска начинается с A1, а ваши данные - с A3. Эта формула массива вернет номер строки, где все данные соответствуют поисковому ключу

=SUM(($A$3:$A$6=A1)*($B$3:$B$6=B1)*($C$3:$C$6=C1)*($D$3:$D$6=D1)*(ROW($A$3:$A$6)))

Ввод с помощью Control + Shift + Enter, а не просто Enter. Обратите внимание, что он возвращает строку листа, а не позицию в таблице. Если вам нужна позиция в таблице, вы можете вычесть на одну единицу меньше, чем начальная строка таблицы, из результата (в данном случае 2, поскольку таблица начинается в строке 3).

Если совпадают несколько строк, это вернет сумму всех строк (не очень полезно). Но я предположил, что была только одна подходящая строка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...