Cuprins
Atunci când avem o cantitate mare de date, uneori este dificil să extragem date specifice din setul de date. Împreună cu Excel's INDEX și MATCH pot prelua orice tip de date, chiar și dintr-un set de date uriaș. Implementarea funcțiilor VBA este cea mai eficientă, mai rapidă și mai sigură metodă de a executa orice operație în Excel. În acest articol, vă vom prezenta 3 metode diferite de a efectua INDEX MATCH bazat pe criterii multiple în Excel, cu ajutorul funcției Macro VBA .
Descărcați caietul de lucru
Puteți descărca gratuit caietul de lucru Excel de practică de aici.
VBA INDEX MATCH bazat pe criterii multiple.xlsm3 Metode cu VBA INDEX MATCH bazate pe criterii multiple în Excel
În secțiunile următoare, vă vom arăta cum să efectuați INDEX MATCH bazat pe criterii multiple pentru un interval , pentru o anumită selecție și pentru un tabel în Excel cu VBA .
Mai sus avem setul de date pe care îl va urmări acest articol. Avem Numele elevului , ID-ul studentului, și Note de examen pentru fiecare elev din setul de date. Vom extrage un anumit rezultat care se află într-o coloană pe baza condițiilor din celelalte două coloane.
Criterii - 1: Încorporați VBA cu INDEX MATCH pentru căutare multiplă (două dimensiuni) în Excel
Luați în considerare următoarea imagine. Am stocat numele unui anumit elev " Edge" în Celula G4 ; și coloana pe care vom căuta în Rezultat în, Note de examen , este stocată în Celula G5 Vom căuta în Note de examen și stochează coloana Marks că " Edge" a intrat Celula G6 .
Pașii de căutare au ca rezultat un matrice bidimensională cu INDEX și MATCH în Excel cu VBA sunt prezentate mai jos.
Pași:
- La început, apăsați Alt + F11 de pe tastatură sau mergeți la fila Dezvoltator -> Visual Basic pentru a deschide Editor Visual Basic .
- Apoi, în fereastra de cod pop-up, din bara de meniu, faceți clic pe Inserare -> Modul .
- Apoi, copie următorul cod și pastă în fereastra de cod.
Sub IndexMatchStudent() Dim iSheet As Worksheet Set iSheet = Foi de lucru("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
Codul dumneavoastră este acum gata de a fi executat.
- Acum, apăsați F5 de pe tastatură sau, din bara de meniu, selectați Run -> Run Sub/UserForm Puteți, de asemenea, să faceți clic pe pictograma mică Run din bara de submeni pentru a rula macrocomenzul.
După executarea codului, priviți imaginea gif de mai jos pentru a vedea rezultatul.
Ca urmare, se va Marks că " Edge" a obținut la examen, 67 , este recuperat în Celula G7 .
Explicația codului VBA
Dim iSheet ca foaie de lucru
Definirea variabilei din foaia de lucru.
Set iSheet = Foi de lucru("Two Dimension")
Stocați numele foii de calcul. Numele foii noastre este "Two Dimension", dar trebuie să furnizați numele în funcție de foaia dvs. de calcul.
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)))
Această bucată de cod selectează intervalul C5:D14 ca interval de căutare. Apoi, căutați corespondența stocată în celula G4 în gamă B5:B14 și se caută corespondența stocată în celula G5 în gamă C4:D4 și trece rezultatul în celula G6 .
Citește mai mult: Cum se utilizează INDEX MATCH cu criterii multiple pentru intervalul de date
Criteriul - 2: Aplicați un macro pentru a găsi valoarea MATCH prin INDEX cu ajutorul funcției definite de utilizator (UDF)
Puteți extrage valorile potrivite dintr-un set de date cu ajutorul unui funcție definită de utilizator (UDF) . din imaginea următoare, ceea ce vom face este să trecem fișierul ID-ul studentului și Note de examen a unui anumit student și funcția ne va arunca Nume de acel elev.
Să vedem cum se poate realiza acest lucru pentru Numele elevului "Finn" cu VBA .
Pași:
- După cum s-a arătat mai înainte, deschideți Editor Visual Basic de la Dezvoltator fila și Introduceți a Modul în fereastra de cod.
- Apoi, în fereastra de cod, copie următorul cod și pasta ea.
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 = "Data Not found" End Function
- Nu fugi. acest cod, salvați ea.
- Acum, reveniți la foaia de lucru de interes. Alegeți orice celulă în care doriți să stocați rezultatul. În cazul nostru, este Celula F5 .
- În acea celulă, scrieți UDF pe care tocmai l-ați creat în cod ( MatchByIndex ) și treceți ID-ul studentului și notele de examen al elevului respectiv în interiorul parantezelor funcției.
Deoarece încercăm să extragem numele " Finn" de la ID (105) și Mărci (84) , deci pentru cazul nostru formula devine,
=MatchByIndex(105,84)
- Apoi, apăsați Introduceți .
Priviți următoarea imagine.
În Celula F5 , am recuperat cu succes numele " Finn" prin simpla trecere a lui ID și Marks în interiorul funcției pe care am creat-o în VBA cod.
Explicația codului VBA
Funcția MatchByIndex(x As Double, y As Double)
Crearea unei noi funcții și trecerea variabilelor în interiorul acesteia. Puteți defini orice nume pentru funcție.
Const StartRow = 4
Rândul nostru începe de la rândul numărul 4. Trebuie să furnizați numărul rândului de la care începe setul de date.
Dim EndRow As Long Dim iRow As Long
Definirea variabilelor.
With Worksheets("UDF") EndRow = .Range("C:D").Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
În primul rând, definiți foaia de lucru cu care să lucrați. Numele foii noastre este "UDF", ar trebui să furnizați numele în funcție de foaia dvs. de calcul. Apoi începeți căutarea în intervalul C:D de la primul rând pe care l-am definit până la ultimul rând.
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
Începeți iterația de la primul rând la ultimul rând. Dacă prima valoare pe care o vom trece în interiorul funcției se încadrează în C și dacă cea de-a doua valoare pe care o vom trece în interiorul funcției se încadrează în coloana D atunci se va returna corespondența din coloana B În caz contrar, ieșiți din funcție, încheiați toate declarațiile și treceți la linia următoare.
MatchByIndex = "Data Not found" End Function
În cazul în care condiția anterioară nu este îndeplinită în timpul execuției, atunci se va primi mesajul "Data Not Found" și codul va părăsi funcția.
Citește mai mult: INDEX-MATCH cu criterii multiple pentru text parțial în Excel (2 moduri)
Criterii - 3: Implementați VBA pentru a returna valoarea MATCH dintr-un tabel cu date multiple în Excel
În această secțiune, vom învăța cum să returnează o valoare corespunzătoare cu indicii dintr-un tabel în MsgBox în VBA Excel.
Să vedem cum să extragem Marks din tabelul prezentat în setul nostru de date ( T nume capabil: TableMatch ) a unui anumit elev prin furnizarea de Nume și ID în interiorul codului. Pentru cazul nostru, se va folosi Nume și ID va fi Finn și 105 respectiv.
Pași:
- În primul rând, deschideți Editor Visual Basic de la Dezvoltator fila și Introduceți a Modul în fereastra de cod.
- Apoi, copie următorul cod și pastă în fereastra de cod.
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 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 If End Sub
Codul dumneavoastră este acum gata de a fi executat.
- Mai târziu, Rulați acest cod și priviți imaginea următoare pentru a vedea ce s-a întâmplat ca rezultat.
După cum puteți vedea în imaginea de mai sus, există un Microsoft Excel caseta de mesaje pop-up care vă arată Marks: 84 de ID: 105 și Nume: Finn pe care l-am furnizat în interiorul codului.
Explicația codului 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
Definirea variabilelor.
Set iBook = Application.ThisWorkbook Set iSheet = iBook.Sheets("Return Result") Set iTable = iSheet.ListObjects("TableMatch")
Setarea numelui foii și a numelui tabelului în variabile.
TargetID = 105 TargetName = "Finn" IdColumn = iTable.ListColumns("Student ID").Index NameColumn = iTable.ListColumns("Student Name").Index MarksColumn = iTable.ListColumns("Exam Marks").Index
Stocarea valorilor de căutare și a coloanelor de căutare.
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
Această bucată de cod scanează de la începutul până la sfârșitul subscriptului și, dacă găsește corespondența dintre ID-ul definit și numele din coloanele de căutare, stochează rezultatul și închide toate instrucțiunile. De asemenea, iese din iterație și trece la următoarea parte a codului.
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
Aruncă rezultatul în MsgBox.
Citește mai mult: Căutarea și returnarea mai multor valori concatenate într-o singură celulă în Excel
Concluzie
În concluzie, acest articol v-a arătat 3 metode diferite pentru a realiza INDEX MATCH bazat pe criterii multiple în Excel, cu ajutorul funcției Macro VBA . sper că acest articol v-a fost de mare folos. Nu ezitați să îmi adresați orice întrebare referitoare la acest subiect.