VBA ИНДЕКСНОЕ СРАВНЕНИЕ на основе нескольких критериев в Excel (3 метода)

  • Поделись Этим
Hugh West

Когда у нас есть большой объем данных, иногда бывает трудно извлечь из них какие-либо конкретные данные. Вместе с функцией Excel ИНДЕКС и МАТЧ функции могут извлекать любые данные даже в огромном наборе данных. Реализация VBA это самый эффективный, быстрый и безопасный метод выполнения любых операций в Excel. В этой статье мы покажем вам 3 различных метода, как выполнить следующие операции ИНДЕКСНОЕ СРАВНЕНИЕ на основе нескольких критериев в Excel с помощью макрос VBA .

Скачать рабочую тетрадь

Вы можете скачать бесплатную практическую рабочую тетрадь Excel отсюда.

VBA INDEX MATCH на основе нескольких критериев.xlsm

3 метода с помощью VBA INDEX MATCH на основе нескольких критериев в Excel

В следующих разделах мы покажем вам, как выполнить INDEX MATCH на основе нескольких критериев для диапазона , для конкретного выбора и для стола в Excel с VBA .

Выше представлен набор данных, о котором пойдет речь в этой статье. У нас есть файл Имя студента , Студенческий билет, и Экзаменационные оценки Мы будем извлекать определенный результат, находящийся в одном столбце, на основе условий из двух других столбцов.

Критерии - 1: Встраивание VBA с INDEX MATCH для многомерного (двухмерного) поиска в Excel

Рассмотрим следующее изображение. Мы сохранили имя конкретного студента " Край" в Ячейка G4 ; и столбец, в котором мы будем искать Результат в, Экзаменационные оценки хранится в Ячейка G5 Мы будем искать в Экзаменационные оценки столбец и хранить Маркс что " Край" вошёл Ячейка G6 .

Шаги по поиску приводят к двумерный массив с ИНДЕКС и МАТЧ в Excel с VBA приведены ниже.

Шаги:

  • В начале нажмите Alt + F11 на клавиатуре или перейдите на вкладку Разработчик -> Visual Basic открыть Редактор Visual Basic .

  • Далее, во всплывающем окне кода, в строке меню нажмите Вставка -> Модуль .

  • Тогда, копия следующий код и паста его в окно кода.
 Sub IndexMatchStudent() Dim iSheet As Worksheet Set iSheet = Worksheets("Two Dimension") iSheet.Range("G6").Value = Application.WorksheetFunction.Index(iSheet.Range("C5:D14"), Application.WorksheetFunction.Match(iSheet.Range("G4"), iSheet.Range("B5:B14"), 0), Application.WorksheetFunction.Match(iSheet.Range("G5"), iSheet.Range("C4:D4"), 0)) End Sub 

Теперь ваш код готов к выполнению.

  • Теперь нажмите F5 на клавиатуре или в строке меню выберите Run -> Run Sub/UserForm Вы также можете просто нажать на маленький значок "Выполнить в строке подменю, чтобы запустить макрос.

После выполнения кода посмотрите на рисунок ниже, чтобы увидеть результат.

В результате Маркс что " Край" получил на экзамене, 67 извлекается в Ячейка G7 .

Объяснение кода VBA

 Dim iSheet As Worksheet 

Определение переменной рабочего листа.

 Set iSheet = Worksheets("Two Dimension") 

Сохраните имя рабочего листа. Имя нашего листа - "Two Dimension", вы должны дать имя в соответствии с вашей электронной таблицей.

 iSheet.Range("G6").Value = Application.WorksheetFunction.Index(iSheet.Range("C5:D14"), Application.WorksheetFunction.Match(iSheet.Range("G4"), iSheet.Range("B5:B14"), 0), Application.WorksheetFunction.Match(iSheet.Range("G5"), iSheet.Range("C4:D4"), 0)) 

Этот фрагмент кода выбирает диапазон C5:D14 в качестве диапазона поиска. Затем выполните поиск совпадения, которое хранится в ячейке G4 в диапазоне B5:B14 и искать совпадение, которое хранится в ячейке G5 в диапазоне C4:D4 и передать результат в ячейку G6 .

Читать далее: Как использовать INDEX MATCH с несколькими критериями для диапазона дат

Критерий - 2: Применение макроса для поиска значения совпадения по ИНДЕКСУ с помощью функции, определяемой пользователем (UDF)

Вы можете извлечь совпадающие значения из набора данных с помощью функции функция, определяемая пользователем (UDF) Из следующего изображения следует, что мы собираемся передать файл Студенческий билет и Экзаменационные оценки определенного студента, и функция выдаст нам Имя конкретного студента.

Давайте посмотрим, как этого добиться для Имя студента "Финн" с VBA .

Шаги:

  • Как было показано ранее, открытые Редактор Visual Basic из Разработчик вкладка и Вставка a Модуль в окне кода.
  • Затем, в окне кода, копия следующий код и паста это.
 Function MatchByIndex(x As Double, y As Double) Const StartRow = 4 Dim EndRow As Long Dim iRow As Long With Worksheets("UDF") EndRow = .Range("C:D").Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row For iRow = StartRow To EndRow If .Range("C" & iRow).Value = x And .Range("D" & iRow).Value = y ThenMatchByIndex = .Range("B" & iRow).Value Exit Function End If Next iRow End With MatchByIndex = "Данные не найдены" End Function 

  • Не беги этот код, сохранить это.
  • Сейчас, вернуться к рабочему листу интерес. Выберите любую ячейку в котором вы хотите сохранить результат. В нашем случае это Ячейка F5 .
  • В этой камере, написать UDF который вы только что создали в коде ( MatchByIndex ) и передать студенческий билет и экзаменационные оценки конкретного студента внутри круглых скобок функции.

Поскольку мы пытаемся извлечь имя " Финн" из его ID (105) и Маркс (84) , поэтому для нашего случая формула становится,

=MatchByIndex(105,84)

  • Затем нажмите Войти .

Посмотрите на следующее изображение.

В Ячейка F5 мы успешно извлекли имя " Финн" просто проходя мимо его ID и Маркс внутри функции, которую мы создали в VBA код.

Объяснение кода VBA

 Function MatchByIndex(x As Double, y As Double) 

Создание новой функции и передача в нее переменных. Вы можете задать любое имя функции.

 Const StartRow = 4 

Наш ряд начинается с ряда номер 4. Вы должны указать номер ряда, с которого начинается ваш набор данных.

 Dim EndRow As Long Dim iRow As Long 

Определение переменных.

 With Worksheets("UDF") EndRow = .Range("C:D").Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 

Сначала определите рабочий лист для работы. Имя нашего листа - "UDF", вы должны задать имя в соответствии с вашей электронной таблицей. Затем начните поиск в диапазоне C:D от первого ряда, который мы определили, до последнего ряда.

 For iRow = StartRow To EndRow If .Range("C" & iRow).Value = x And .Range("D" & iRow).Value = y Then MatchByIndex = .Range("B" & iRow).Value Exit Function End If Next iRow End With 

Начните итерацию от первой строки к последней. Если первое значение, которое мы передадим в функцию, попадает в область C и если второе значение, которое мы передадим в функцию, попадает в столбец D столбца, то он вернет совпадение из столбца B столбец. В противном случае выйдите из функции, завершите все утверждения и перейдите к следующей строке.

 MatchByIndex = "Данные не найдены" Конец функции 

Если при выполнении предыдущее условие не выполняется, то будет возвращено сообщение "Data Not Found" и код выйдет из функции.

Читать далее: ИНДЕКС-МАТЧ с несколькими критериями для частичного текста в Excel (2 способа)

Критерии - 3: Реализация VBA для возврата значения MATCH из таблицы с несколькими данными в Excel

В этом разделе мы узнаем, как возвращает совпадающее значение по индексам из таблицы в MsgBox в VBA Excel.

Давайте посмотрим, как извлечь Маркс из таблицы, представленной в нашем наборе данных ( T способное имя: TableMatch ) определенного студента путем предоставления Имя и ID внутри кода. В нашем случае Имя и ID будет Финн и 105 соответственно.

Шаги:

  • Во-первых, откройте Редактор Visual Basic из Разработчик вкладка и Вставка a Модуль в окне кода.
  • Тогда, копия следующий код и паста его в окно кода.
 Sub ReturnMatchedResultByIndex() Dim iBook As Workbook Dim iSheet As Worksheet Dim iTable As Object Dim iValue As Variant Dim TargetName As String Dim TargetID As Long Dim IdColumn As Long Dim NameColumn As Long Dim MarksColumn As Long Dim iCount As Long Dim iResult As Boolean Set iBook = Application.ThisWorkbook Set iSheet = iBook.Sheets("Return Result") Set iTable =iSheet.ListObjects("TableMatch") TargetID = 105 TargetName = "Finn" IdColumn = iTable.ListColumns("ID студента").Index NameColumn = iTable.ListColumns("Имя студента").Index MarksColumn = iTable.ListColumns("Exam Marks").Index iValue = iTable.DataBodyRange.Value For iCount = 1 To UBound(iValue) If iValue(iCount, IdColumn) = TargetID Then If iValue(iCount, NameColumn) =TargetName Then iResult = True End If End If If iResult Then Exit For Next iCount If iResult Then MsgBox "ID: " & TargetID & vbLf & "Name: " & TargetName & vbLf & "Marks: " & iValue(iCount, MarksColumn) Else MsgBox "ID: " & TargetID & vbLf & "Name: " & TargetName & vbLf & "Marks Not found" End If End Sub 

Теперь ваш код готов к выполнению.

  • Позже, Запускайте этот код и посмотрите на следующее изображение, чтобы увидеть, что произошло в результате.

Как видно из приведенного выше изображения, есть Microsoft Excel всплывающее окно с сообщением, показывающее Марки: 84 из ID: 105 и Имя: Финн который мы предоставили внутри кода.

Объяснение кода VBA

 Dim iBook As Workbook Dim iSheet As Worksheet Dim iTable As Object Dim iValue As Variant Dim TargetName As String Dim TargetID As Long Dim IdColumn As Long Dim NameColumn As Long Dim MarksColumn As Long Dim iCount As Long Dim iResult As Boolean 

Определение переменных.

 Set iBook = Application.ThisWorkbook Set iSheet = iBook.Sheets("Return Result") Set iTable = iSheet.ListObjects("TableMatch") 

Установка имени листа и имени таблицы внутри переменных.

 TargetID = 105 TargetName = "Finn" IdColumn = iTable.ListColumns("ID студента").Index NameColumn = iTable.ListColumns("Имя студента").Index MarksColumn = iTable.ListColumns("Экзаменационные оценки").Index 

Хранение значений поиска и столбцов поиска для поиска.

 iValue = iTable.DataBodyRange.Value For iCount = 1 To UBound(iValue) If iValue(iCount, IdColumn) = TargetID Then If iValue(iCount, NameColumn) = TargetName Then iResult = True End If End If If iResult Then Exit For Next iCount 

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

 If iResult Then MsgBox "ID: " & TargetID & vbLf & "Name: " & TargetName & vbLf & "Marks: " & iValue(iCount, MarksColumn) Else MsgBox "ID: " & TargetID & vbLf & "Name: " & TargetName & vbLf & "Marks Not found" End If 

Выбрасывает результат в MsgBox.

Читать далее: Поиск и возврат нескольких значений, объединенных в одну ячейку в Excel

Заключение

В заключение, эта статья показала вам 3 различных метода, как выполнить ИНДЕКСНОЕ СРАВНЕНИЕ на основе нескольких критериев в Excel с помощью макрос VBA Я надеюсь, что эта статья была очень полезна для вас. Не стесняйтесь задавать любые вопросы по теме.

Хью Уэст — опытный тренер и аналитик Excel с более чем 10-летним опытом работы в отрасли. Он имеет степень бакалавра в области бухгалтерского учета и финансов и степень магистра делового администрирования. Хью страстно любит преподавать и разработал уникальный подход к обучению, которому легко следовать и который легко понять. Его экспертные знания Excel помогли тысячам студентов и специалистов по всему миру улучшить свои навыки и преуспеть в своей карьере. В своем блоге Хью делится своими знаниями со всем миром, предлагая бесплатные учебные пособия по Excel и онлайн-обучение, чтобы помочь отдельным лицам и компаниям полностью раскрыть свой потенциал.