Дано
Ключ поиска
---------------------------
| | 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, который идет с кодом выше: