Obsah
Pokud máme velké množství dat, je někdy obtížné z datového souboru vyjmout konkrétní data. Spolu s funkcí Excelu INDEX a MATCH funkce mohou získat jakýkoli druh dat i v obrovské datové sadě. VBA je nejefektivnější, nejrychlejší a nejbezpečnější metodou pro provádění jakýchkoli operací v aplikaci Excel. V tomto článku vám ukážeme 3 různé metody, jak provést libovolnou operaci. INDEX MATCH na základě více kritérií v aplikaci Excel pomocí Makro VBA .
Stáhnout pracovní sešit
Bezplatný cvičný sešit aplikace Excel si můžete stáhnout zde.
VBA INDEX MATCH na základě více kritérií.xlsm3 metody s VBA INDEX MATCH na základě více kritérií v aplikaci Excel
V následujících kapitolách vám ukážeme, jak provádět INDEX MATCH na základě více kritérií pro rozsah , pro konkrétní výběr a pro tabulku v aplikaci Excel pomocí VBA .
Výše jsme uvedli soubor dat, podle kterého se bude tento článek řídit. Jméno studenta , ID studenta, a Známky ze zkoušky každého studenta v souboru dat. Na základě podmínek z ostatních dvou sloupců získáme určitý výsledek, který se nachází v jednom sloupci.
Kritérium - 1: Vložení VBA s INDEX MATCH pro vícenásobné (dvourozměrné) vyhledávání v aplikaci Excel
Vezměme si následující obrázek. Uložili jsme jméno konkrétního studenta " Hrana" na adrese Buňka G4 ; a sloupec, který budeme prohledávat. Výsledek v, Známky ze zkoušky , je uložen v Buňka G5 . Budeme hledat v Známky ze zkoušky a uložte sloupec Marks že " Hrana" se dostal dovnitř Buňka G6 .
Výsledkem kroků pro vyhledávání je dvourozměrné pole s INDEX a MATCH v aplikaci Excel pomocí VBA jsou uvedeny níže.
Kroky:
- Na začátku stiskněte Alt + F11 na klávesnici nebo přejděte na kartu Vývojář -> Visual Basic otevřít Editor jazyka Visual Basic .
- Poté ve vyskakovacím okně kódu klikněte na panelu nabídek na možnost Insert -> Modul .
- Pak, kopírovat následující kód a vložit do okna kódu.
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
Váš kód je nyní připraven ke spuštění.
- Nyní stiskněte F5 na klávesnici nebo na panelu nabídek vyberte možnost Run -> Run Sub/UserForm . Můžete také kliknout na malá ikona Spustit na panelu podnabídek spustíte makro.
Po provedení kódu se podívejte na níže uvedený gif a uvidíte výsledek.
V důsledku toho se Marks že " Hrana" dostal při zkoušce, 67 , se vyhledává v Buňka G7 .
Vysvětlení kódu VBA
Dim iSheet As Pracovní list
Definování proměnné pracovního listu.
Set iSheet = Worksheets("Two Dimension")
Uložte název pracovního listu. Název našeho listu je "Two Dimension", měli byste uvést název podle vaší tabulky.
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))
Tato část kódu vybere rozsah C5:D14 jako rozsah vyhledávání. Pak vyhledejte shodu, která je uložena v buňce G4 v dosahu B5:B14 a vyhledat shodu, která je uložena v buňce G5 v dosahu C4:D4 a předat výsledek buňce G6 .
Přečtěte si více: Jak použít INDEX MATCH s více kritérii pro rozsah dat
Kritérium - 2: Použití makra pro vyhledání hodnoty MATCH pomocí INDEXU s funkcí definovanou uživatelem (UDF)
Shodné hodnoty můžete z datové sady extrahovat pomocí příkazu uživatelsky definovaná funkce (UDF) . Z následujícího obrázku vyplývá, že předáme příkaz ID studenta a Známky ze zkoušky určitého žáka a funkce nám vyhodí Název konkrétního studenta.
Podívejme se, jak toho dosáhnout pro Jméno studenta "Finn" s VBA .
Kroky:
- Jak bylo ukázáno dříve, otevřete Editor jazyka Visual Basic z Vývojář karta a Vložte a Modul v okně kódu.
- Poté v okně kódu, kopírovat následující kód a vložit to.
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 nenalezena" End Function
- Neutíkejte tento kód, uložit to.
- Nyní, vrátit se na pracovní list zájmu. Vyberte libovolnou buňku do kterého chcete výsledek uložit. V našem případě je to Buňka F5 .
- V této cele, napsat UDF který jste právě vytvořili v kódu ( MatchByIndex ) a předat ID studenta a známky ze zkoušky konkrétního studenta v závorce funkce.
Protože se snažíme extrahovat název " Finn" z jeho ID (105) a Známky (84) , takže pro náš případ je vzorec následující,
=MatchByIndex(105,84)
- Pak stiskněte tlačítko Vstupte na .
Podívejte se na následující obrázek.
Na adrese Buňka F5 , úspěšně jsme získali název " Finn" pouhým předáním jeho ID a Marks uvnitř funkce, kterou jsme vytvořili v VBA kód.
Vysvětlení kódu VBA
Funkce MatchByIndex(x As Double, y As Double)
Vytvoření nové funkce a předání proměnných uvnitř funkce. Funkci můžete definovat libovolný název.
Const StartRow = 4
Náš řádek začíná od řádku číslo 4. Musíte zadat číslo řádku, od kterého začíná váš soubor dat.
Dim EndRow As Long Dim iRow As Long
Definování proměnných.
With Worksheets("UDF") EndRow = .Range("C:D").Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
Nejprve definujte pracovní list, se kterým budete pracovat. Název našeho listu je "UDF", měli byste zadat název podle vaší tabulky. Poté začněte hledat v rozsahu C:D od prvního řádku, který jsme definovali, až po poslední řádek.
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
Začněte iterovat od prvního řádku k poslednímu. Pokud první hodnota, kterou předáme uvnitř funkce, spadá do oblasti C a pokud druhá hodnota, kterou předáme uvnitř funkce, spadá do sloupce D pak vrátí shodu ze sloupce B V opačném případě ukončete funkci, ukončete všechny příkazy a přejděte na další řádek.
MatchByIndex = "Data nebyla nalezena" Konec funkce
Pokud se předchozí podmínka při provádění nesplní, bude vrácena zpráva "Data nenalezena" a kód opustí funkci.
Přečtěte si více: INDEX-MATCH s více kritérii pro částečný text v aplikaci Excel (2 způsoby)
Kritérium - 3: Implementace VBA pro vrácení hodnoty MATCH z tabulky s více daty v aplikaci Excel
V této části se dozvíme, jak vrátit odpovídající hodnotu podle indexů z tabulky v MsgBoxu na adrese VBA Excel.
Podívejme se, jak extrahovat Marks z tabulky uvedené v našem souboru dat ( T able Name: TableMatch ) určitého studenta tím, že poskytne Název a ID uvnitř kódu. V našem případě Název a ID bude Finn a 105 resp.
Kroky:
- Za prvé, otevřete Editor jazyka Visual Basic z Vývojář karta a Vložte a Modul v okně kódu.
- Pak, kopírovat následující kód a vložit do okna kódu.
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
Váš kód je nyní připraven ke spuštění.
- Později, Spustit tento kód a podívejte se na následující obrázek, abyste viděli, co se v důsledku toho stalo.
Jak vidíte na obrázku výše, je zde Microsoft Excel vyskakovací okno se zprávou zobrazující Známky: 84 z ID: 105 a Jméno: Finn který jsme zadali uvnitř kódu.
Vysvětlení kódu 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
Definování proměnných.
Set iBook = Application.ThisWorkbook Set iSheet = iBook.Sheets("Return Result") Set iTable = iSheet.ListObjects("TableMatch")
Nastavení názvu listu a názvu tabulky uvnitř proměnných.
TargetID = 105 TargetName = "Finn" IdColumn = iTable.ListColumns("Student ID").Index NameColumn = iTable.ListColumns("Student Name").Index MarksColumn = iTable.ListColumns("Exam Marks").Index
Uložení hodnot vyhledávání a sloupců vyhledávání k vyhledávání.
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
Tato část kódu prochází od začátku do konce indexu a pokud najde shodu zadaného ID a Name ve vyhledávaných sloupcích, uloží výsledek a uzavře všechny příkazy. Také ukončí iteraci a přejde k další části kódu.
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
Vyhodí výsledek do pole MsgBox.
Přečtěte si více: Vyhledávání a vracení více hodnot spojených do jedné buňky v aplikaci Excel
Závěr
Na závěr vám tento článek ukázal 3 různé metody, jak provést INDEX MATCH na základě více kritérií v aplikaci Excel pomocí Makro VBA . doufám, že pro vás byl tento článek velmi přínosný. Neváhejte se zeptat na jakékoli otázky týkající se tohoto tématu.