Підбір індексів VBA на основі декількох критеріїв в Excel (3 способи)

  • Поділитися Цим
Hugh West

Коли у нас є велика кількість даних, іноді буває важко виділити якісь конкретні дані з набору даних. Разом з Excel's ІНДЕКС і МАТЧ функції можуть отримати будь-які дані навіть у величезному наборі даних. Реалізація VBA це найефективніший, найшвидший і найбезпечніший спосіб виконати будь-яку операцію в Excel. У цій статті ми покажемо вам 3 різні способи, як виконати ПІДБІР ІНДЕКСУ за кількома критеріями в Excel за допомогою Макрос VBA .

Завантажити Робочий зошит

Ви можете завантажити безкоштовну практичну книгу Excel тут.

VBA ПІДБІР ІНДЕКСУ на основі декількох критеріїв.xlsm

3 Методи з VBA INDEX MATCH на основі декількох критеріїв в Excel

У наступних розділах ми покажемо, як виконати ПІДБІР ІНДЕКСУ на основі декількох критеріїв для діапазону , для конкретного вибору і за стіл в Excel з VBA .

Вище ми маємо набір даних, який буде розглянуто в цій статті. Ми маємо Ім'я студента , Студентський квиток, і Екзаменаційні оцінки Ми будемо витягувати певний результат, що знаходиться в одному стовпчику, на основі умов з двох інших стовпчиків.

Критерій - 1: Вбудувати VBA з INDEX MATCH для багатовимірного (двомірного) пошуку в Excel

Розглянемо наступний образ. У нас збереглося ім'я конкретного студента " Edge" в Комірка G4 ; і стовпець, в якому ми будемо шукати Результат в, Екзаменаційні оцінки зберігається в Комірка G5 Ми будемо шукати в Екзаменаційні оцінки стовпчик і зберігати в пам'яті Знаки що " Edge" потрапив Комірка G6 .

В результаті виконання кроків пошуку буде отримано двовимірний масив з ІНДЕКС і МАТЧ в Excel з VBA наведені нижче.

Сходинки:

  • На початку натисніть Alt + F11 на клавіатурі або перейдіть на вкладку Розробник - Visual Basic відкрити Редактор Visual Basic .

  • Далі, у вікні коду, що з'явилося, з рядка меню, що з'явилося, натисніть Вставка -> Модуль .

  • Тоді, копія наступний код та паста його у вікно коду.
 Sub IndexMatchStudent() Dim iSheet As Worksheet Set iSheet = Worksheets("Двовимірний") 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 Sub/UserForm Ви також можете просто натиснути на кнопку маленька піктограма "Виконати в рядку підменю для запуску макросу.

Після виконання коду подивіться на gif-файл нижче, щоб побачити результат.

Як наслідок, на сьогоднішній день в Україні діє Знаки що " Edge" потрапив на іспит, 67 можна знайти в Осередок G7 .

Пояснення коду VBA

 Приглушити iSheet як робочий аркуш 

Визначення змінної робочого аркушу.

 Set iSheet = Worksheets("Two Dimension") 

Збережіть назву робочого аркуша. Наш аркуш називається "Two Dimension", ви повинні вказати назву відповідно до вашої електронної таблиці.

 iSheet.Range("G6").Value = ФункціяРобочогоАркуша.Індекс(iSheet.Range("C5:D14"), ФункціяРобочогоАркуша.Відповідність(iSheet.Range("G4"), iSheet.Range("B5:B14"), 0), ФункціяРобочогоАркуша.Відповідність(iSheet.Range("G5"), iSheet.Range("C4:D4"), 0)) 

Цей фрагмент коду вибирає діапазон C5:D14 в якості діапазону пошуку. Потім шукається збіг, який зберігається в комірці G4 в асортименті B5:B14 і шукаємо збіг, який зберігається в комірці G5 в асортименті C4:D4 і передаємо результат в комірку G6 .

Читати далі: Як використовувати ІНДЕКСНИЙ СПІВПАДАННЯ з декількома критеріями для діапазону дат

Критерій - 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 Вихід з функції End If Next iRow End With MatchByIndex = "Дані не знайдено" End Function 

  • Не тікай! цей код, заощаджувати це.
  • Негайно, повернутися до робочого аркуша що представляє інтерес. Виберіть будь-яку комірку що ви хочете зберегти результат. У нашому випадку це Комірка F5 .
  • У тій камері, напишіть UDF який ви тільки що створили в коді ( MatchByIndex ) та здати студентський квиток та екзаменаційні відомості конкретного студента в дужках функції.

Оскільки ми намагаємося витягти назву " "Фінн" з його ПОСВІДЧЕННЯ ОСОБИ (105) і Знаки (84) тому для нашого випадку формула набуває вигляду,

=MatchByIndex(105,84)

  • Потім натисніть Увійдіть .

Подивіться на наступне зображення.

В Комірка F5 ми успішно відновили ім'я " "Фінн" просто передавши свій ПОСВІДЧЕННЯ ОСОБИ і Знаки всередині функції, яку ми створили в VBA код.

Пояснення коду VBA

 Function MatchByIndex(x As Double, y As Double) 

Створення нової функції та передача змінних всередину неї. Функції можна задати будь-яке ім'я.

 Const StartRow = 4 

Наш ряд починається з рядка під номером 4. Ви повинні вказати номер рядка, з якого починається Ваш набір даних.

 Dim EndRow As Long Dim iRow As Long 

Визначення змінних.

 З 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 = "Дані не знайдено" End Function 

Якщо при виконанні попередня умова не виконується, то повертається повідомлення "Data Not Found" і код залишає функцію.

Читати далі: ІНДЕКС-ПІДБІР за кількома критеріями для частини тексту в Excel (2 способи)

Критерій - 3: Реалізація VBA для повернення значення збігу з таблиці з декількома даними в Excel

У цьому розділі ми дізнаємося, як повернути в MsgBox знайдене значення за індексами з таблиці в VBA Ексель.

Давайте подивимося, як витягти Знаки з таблиці, наведеної в нашому наборі даних ( T Назва: TableMatch ) певного студента шляхом надання Ім'я та прізвище та ПОСВІДЧЕННЯ ОСОБИ всередині коду. У нашому випадку Ім'я та прізвище та ПОСВІДЧЕННЯ ОСОБИ буде Фінн і 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("Повернути результат") Set iTable =iSheet.ListObjects("TableMatch") TargetID = 105 TargetName = "Finn" IdColumn = iTable.ListColumns("Student ID").Index NameColumn = iTable.ListColumns("Name").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("Повернути результат") Set iTable = iSheet.ListObjects("TableMatch") 

Встановлення імені аркуша та імені таблиці всередині змінних.

 TargetID = 105 TargetName = "Finn" IdColumn = iTable.ListColumns("ID студента").Index NameColumn = iTable.ListColumns("Name студента").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 

Цей фрагмент коду сканує від початку до кінця підзаголовка і якщо знаходить збіг визначеного 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 та онлайн-навчання, щоб допомогти окремим особам і компаніям повністю розкрити свій потенціал.