VBA INDEX MATCH въз основа на множество критерии в Excel (3 метода)

  • Споделя Това
Hugh West

Когато разполагаме с голямо количество данни, понякога е трудно да извлечем конкретни данни от набора от данни. Заедно с функцията на Excel INDEX и MATCH могат да извличат всякакъв вид данни, дори в огромен набор от данни. VBA е най-ефективният, най-бързият и най-сигурният метод за изпълнение на всякакви операции в Excel. В тази статия ще ви покажем 3 различни метода за изпълнение на INDEX MATCH въз основа на множество критерии в Excel с Макрос VBA .

Изтегляне на работна тетрадка

Можете да изтеглите безплатната учебна тетрадка на Excel от тук.

VBA INDEX MATCH въз основа на множество критерии.xlsm

3 метода с VBA INDEX MATCH въз основа на множество критерии в Excel

В следващите раздели ще ви покажем как да извършите INDEX MATCH въз основа на множество критерии за диапазон , за конкретна селекция и за таблица в Excel с VBA .

По-горе имаме набора от данни, който ще бъде използван в тази статия. Име на ученика , Студентски номер, и Оценки от изпита Ще извлечем определен резултат, намиращ се в една колона, въз основа на условията от другите две колони.

Критерии - 1: Вграждане на VBA с INDEX MATCH за многократно (двуизмерно) търсене в Excel

Разгледайте следното изображение. Запазили сме името на определен ученик " Край" в Клетка G4 ; и колоната, в която ще търсим Резултат в, Оценки от изпита , се съхранява в Клетка G5 . Ще търсим в Оценки от изпита колона и съхранявайте Маркс че " Край" влязоха Клетка G6 .

Стъпките за търсене водят до двуизмерен масив с INDEX и MATCH в 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 Можете също така просто да щракнете върху малка икона Run в лентата с подменюта, за да стартирате макроса.

След изпълнението на кода вижте резултата в gif-а по-долу.

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

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

 Dim iSheet Като работен лист 

Определяне на променливата на работния лист.

 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)) 

Тази част от кода избира диапазона C5:D14 като диапазон за търсене. След това потърсете съответствието, което се съхранява в клетката G4 в обхвата B5:B14 и търсене на съвпадение, което се съхранява в клетката G5 в обхвата C4:D4 и предайте резултата на клетка G6 .

Прочетете още: Как да използвате INDEX MATCH с множество критерии за диапазон от дати

Критерий - 2: Прилагане на макрос за намиране на MATCH стойност по INDEX с помощта на функция, дефинирана от потребителя (UDF)

Можете да извлечете съвпадащи стойности от набор от данни с помощта на дефинирана от потребителя функция (UDF) От следното изображение това, което ще направим, е да предадем Идентификационен номер на ученика и Оценки от изпита на определен ученик и функцията ще ни хвърли Име на конкретния ученик.

Нека видим как да постигнем това за Име на ученика "Finn" с VBA .

Стъпки:

  • Както беше показано преди, отворете Редактор на Visual Basic от Разработчик таб и Вмъкване на a Модул в прозореца с кода.
  • След това в прозореца с кода, копие следния код и паста това.
 Функция 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 = "Data Not found" End Function 

  • Не бягайте този код, спаси това.
  • Сега, да се върнете към работния лист от интерес. Изберете произволна клетка в която искате да съхраните резултата. В нашия случай това е Клетка F5 .
  • В тази клетка, да напишете UDF които току-що сте създали в кода ( MatchByIndex ) и предайте идентификационния номер на студента и оценките от изпита на конкретния ученик в скобите на функцията.

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

=МатчБиИндекс(105,84)

  • След това натиснете Въведете .

Вижте следното изображение.

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

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

 Функция MatchByIndex(x като Double, y като Double) 

Създаване на нова функция и предаване на променливите в нея. Можете да зададете произволно име на функцията.

 Const StartRow = 4 

Нашият ред започва от ред номер 4. Трябва да посочите номера на реда, от който започва наборът ви от данни.

 Dim EndRow As Long Dim iRow As Long 

Определяне на променливите.

 С работни листове("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" и кодът ще напусне функцията.

Прочетете още: INDEX-MATCH с множество критерии за частичен текст в 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("Student ID").Index NameColumn = iTable.ListColumns("Student 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 и Име: Finn която предоставихме в кода.

Обяснение на кода 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("Student ID").Index NameColumn = iTable.ListColumns("Student 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 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 

Хвърля резултата в MsgBox.

Прочетете още: Търсене и връщане на няколко стойности, събрани в една клетка в Excel

Заключение

В заключение, тази статия ви показа 3 различни метода за извършване на INDEX MATCH въз основа на множество критерии в Excel с Макрос VBA . надявам се, че тази статия е била много полезна за вас. Не се колебайте да задавате всякакви въпроси по темата.

Хю Уест е опитен обучител и анализатор на Excel с над 10 години опит в индустрията. Има бакалавърска степен по счетоводство и финанси и магистърска степен по бизнес администрация. Хю има страст към преподаването и е разработил уникален подход на преподаване, който е лесен за следване и разбиране. Неговите експертни познания по Excel са помогнали на хиляди студенти и професионалисти по целия свят да подобрят уменията си и да постигнат отлични резултати в кариерата си. Чрез своя блог Хю споделя знанията си със света, като предлага безплатни уроци за Excel и онлайн обучение, за да помогне на хората и фирмите да достигнат пълния си потенциал.