VBA INDEX MATCH baserat på flera kriterier i Excel (3 metoder)

  • Dela Detta
Hugh West

När vi har en stor mängd data är det ibland svårt att extrahera specifika data från datasetet. Tillsammans med Excels INDEX och MATCH funktioner kan hämta alla typer av data, även i stora datamängder. Genom att implementera VBA är den mest effektiva, snabbaste och säkraste metoden för att utföra alla operationer i Excel. I den här artikeln kommer vi att visa dig 3 olika metoder för att utföra INDEX MATCH baserat på flera kriterier i Excel med VBA-makro .

Ladda ner arbetsboken

Du kan ladda ner den kostnadsfria Excel-arbetsboken för övningar här.

VBA INDEX MATCH baserat på flera kriterier.xlsm

3 metoder med VBA INDEX MATCH baserat på flera kriterier i Excel

I följande avsnitt kommer vi att visa hur du utför följande INDEX MATCH baserat på flera kriterier för ett intervall , för ett visst urval och för ett bord i Excel med VBA .

Ovan har vi det dataset som den här artikeln kommer att följa. Elevens namn , Student-ID, och Betyg i examen Vi kommer att extrahera ett visst resultat som finns i en kolumn baserat på villkor från de andra två kolumnerna.

Kriterier - 1: Integrera VBA med INDEX MATCH för flera (två) dimensionella sökningar i Excel

Se följande bild: Vi har lagrat en viss elevs namn " Edge" Cell G4 ; och den kolumn som vi kommer att söka i Resultat i, Betyg i tentamen , lagras i Cell G5 Vi kommer att söka i Betyg i tentamen kolumnen och lagra den Marker att " Edge" kom in Cell G6 .

Stegen för sökning resulterar i en tvådimensionell matris med INDEX och MATCH i Excel med VBA anges nedan.

Steg:

  • I början trycker du på Alt + F11 på tangentbordet eller gå till fliken Utvecklare -> Visual Basic för att öppna Redigerare för Visual Basic .

  • I popup-kodfönstret klickar du sedan i menyraden på Infoga -> Modul .

  • Då, kopiera följande kod och pasta den i kodfönstret.
 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 

Din kod är nu redo att köras.

  • Tryck nu på F5 på tangentbordet eller välj i menyraden Kör -> Kör Sub/UserForm Du kan också bara klicka på en liten ikon för körning i undermenyfältet för att köra makrot.

Efter att koden har utförts kan du se resultatet i gif-filen nedan.

Som ett resultat av detta har Marker att " Edge" fick i provet, 67 , hämtas i Cell G7 .

VBA-kodförklaring

 Dim iSheet som arbetsblad 

Definiera variabeln i arbetsbladet.

 Set iSheet = Arbetsblad("Two Dimension") 

Lagra arbetsbladets namn. Namnet på vårt blad är "Two Dimension", men du bör ange ett namn som motsvarar ditt kalkylblad.

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

Denna kod väljer intervallet C5:D14 som uppslagsintervall. Sök sedan efter den matchning som finns lagrad i cell G4 i intervallet B5:B14 och söker efter den matchning som finns lagrad i cellen G5 i intervallet C4:D4 och överföra resultatet till cell G6 .

Läs mer: Hur man använder INDEX MATCH med flera kriterier för datumintervall

Kriterier - 2: Tillämpa makro för att hitta MATCH-värde genom INDEX med användardefinierad funktion (UDF)

Du kan extrahera matchade värden från en datamängd med en Användardefinierad funktion (UDF). Från följande bild kommer vi att göra så här: vi skickar över Student-ID och Betyg i examen av en viss elev och funktionen kommer att ge oss Namn för den specifika eleven.

Låt oss se hur vi kan uppnå detta för Elevernas namn "Finn" med VBA .

Steg:

  • Som tidigare visats kan öppna Redigerare för Visual Basic från Utvecklare och Infoga a Modul i kodfönstret.
  • I kodfönstret, kopiera följande kod och pasta den.
 Funktion 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 

  • Spring inte denna kod, rädda den.
  • Nu, gå tillbaka till arbetsbladet av intresse. Välj en valfri cell där du vill lagra resultatet. I vårt fall är det Cell F5 .
  • I den cellen, skriva ut den UDF som du just har skapat i koden ( MatchByIndex ) och skicka student-ID och betygsindex för den specifika eleven inom parentesen i funktionen.

Eftersom vi försöker extrahera namnet " Finn" från hans ID (105) och Marker (84) , så för vårt fall blir formeln,

=MatchByIndex(105,84)

  • Tryck sedan på Gå in på .

Titta på följande bild.

Cell F5 , vi har lyckats hämta namnet " Finn" genom att helt enkelt passera sin ID och Marker i den funktion som vi skapade i VBA kod.

VBA-kodförklaring

 Funktion MatchByIndex(x som dubbel, y som dubbel) 

Skapa en ny funktion och skicka variablerna i den. Du kan definiera vilket namn som helst för funktionen.

 Const StartRow = 4 

Vår rad börjar från rad nummer 4. Du måste ange det radnummer som ditt dataset börjar från.

 Dim EndRow As Long Dim iRow As Long 

Definiera variablerna.

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

Först definierar du arbetsbladet som du ska arbeta med. Vårt ark heter "UDF", men du bör ange namnet enligt ditt kalkylblad. Börja sedan söka i intervallet C:D från den första raden som vi definierade till den sista raden.

 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 

Börja iterera från den första raden till den sista raden. Om det första värdet som vi kommer att skicka in i funktionen faller inom C kolumnen och om det andra värdet som vi kommer att skicka in i funktionen hamnar i kolumnen D kolumnen, kommer den att återge matchningen från kolumnen B Annars avslutar du funktionen, avslutar alla uttalanden och går till nästa rad.

 MatchByIndex = "Data inte funna" Slutfunktion 

Om det föregående villkoret inte uppfylls under utförandet returneras meddelandet "Data Not Found" och koden lämnar funktionen.

Läs mer: INDEX-MATCH med flera kriterier för partiell text i Excel (2 sätt)

Kriterier - 3: Implementera VBA för att returnera MATCH-värdet från en tabell med flera data i Excel

I det här avsnittet lär vi oss hur man returnera ett matchat värde med indexen från en tabell i MsgBoxen VBA Excel.

Låt oss se hur du tar ut Marker från den tabell som visas i vårt dataset ( T kan namn: TableMatch ) för en viss elev genom att ange Namn och ID i koden. I vårt fall är det Namn och ID kommer att vara Finn och 105 respektive.

Steg:

  • För det första, öppna Redigerare för Visual Basic från Utvecklare och Infoga a Modul i kodfönstret.
  • Då, kopiera följande kod och pasta den i kodfönstret.
 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 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 Då 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 

Din kod är nu redo att köras.

  • Senare, Kör den här koden och titta på följande bild för att se vad som hände.

Som du kan se på bilden ovan finns det en Microsoft Excel popup-rutan som visar dig den Märken: 84 ID: 105 och Namn: Finn som vi har angett i koden.

VBA-kodförklaring

 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 

Definiera variablerna.

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

Ange arknamn och tabellnamn i variabler.

 TargetID = 105 TargetName = "Finn" IdColumn = iTable.ListColumns("Student ID").Index NameColumn = iTable.ListColumns("Student Name").Index MarksColumn = iTable.ListColumns("Exam Marks").Index 

Lagring av sökvärdena och de kolumner som ska sökas.

 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 

Den här delen av koden skannar igenom från början till slutet av subscriptet och om den hittar en matchning mellan det definierade ID:t och namnet i sökkolumnerna, lagrar den resultatet och stänger alla uttalanden.

 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 

Slänger resultatet i MsgBox.

Läs mer: Sök upp och återge flera värden som sammanfogats i en cell i Excel

Slutsats

Sammanfattningsvis har den här artikeln visat dig 3 olika metoder för att utföra INDEX MATCH baserat på flera kriterier i Excel med VBA-makro Jag hoppas att den här artikeln har varit till stor nytta för dig. Du får gärna ställa frågor om ämnet.

Hugh West är en mycket erfaren Excel-tränare och analytiker med över 10 års erfarenhet i branschen. Han har en kandidatexamen i redovisning och ekonomi och en magisterexamen i företagsekonomi. Hugh har en passion för undervisning och har utvecklat ett unikt undervisningssätt som är lätt att följa och förstå. Hans expertkunskap om Excel har hjälpt tusentals studenter och yrkesverksamma över hela världen att förbättra sina färdigheter och utmärka sig i sina karriärer. Genom sin blogg delar Hugh med sig av sin kunskap med världen, och erbjuder gratis Excel-handledning och onlineutbildning för att hjälpa individer och företag att nå sin fulla potential.