Spis treści
Kiedy mamy dużą ilość danych, to czasami trudno jest wyodrębnić ze zbioru danych jakieś konkretne dane.Wraz z funkcją Excela INDEX oraz MATCH funkcje mogą pobrać dowolny rodzaj danych nawet w ogromnym zbiorze danych. Implementacja VBA jest najbardziej efektywną, najszybszą i najbezpieczniejszą metodą wykonywania dowolnych operacji w Excelu. W tym artykule pokażemy 3 różne metody, jak wykonać INDEX MATCH na podstawie wielu kryteriów w programie Excel z Makro VBA .
Pobierz Workbook
Darmowy ćwiczeniowy zeszyt Excela można pobrać stąd.
VBA INDEX MATCH Based on Multiple Criteria.xlsm3 Metody z VBA INDEX MATCH oparte na wielu kryteriach w Excelu
W kolejnych częściach pokażemy, jak wykonać INDEX MATCH na podstawie wielu kryteriów dla zakresu , dla konkretnego wyboru oraz do tabeli w Excelu z VBA .
Powyżej mamy zbiór danych, który będzie śledzony w tym artykule.Mamy Imię i nazwisko ucznia , Legitymacja studencka, oraz Oceny z egzaminu Wyodrębnimy pewien wynik znajdujący się w jednej kolumnie na podstawie warunków z pozostałych dwóch kolumn.
Kryteria - 1: Osadzić VBA z INDEX MATCH dla Multiple (Two) Dimensional Lookup w Excelu
Rozważmy następujący obrazek. Mamy zapisane konkretne nazwisko ucznia " Edge" w Komórka G4 i kolumnę, w której będziemy szukać Wynik w, Oceny z egzaminu , jest przechowywany w Komórka G5 . We will search in the Oceny z egzaminu i zapisać Marks że " Edge" wszedł Komórka G6 .
Kroki, które należy wykonać, aby uzyskać wynik tablica dwuwymiarowa z INDEX oraz MATCH w Excelu z VBA podano poniżej.
Kroki:
- Na początku naciśnij Alt + F11 na klawiaturze lub przejdź do zakładki Programista -> Visual Basic otworzyć Edytor Visual Basic .
- Następnie w wyskakującym oknie kodu, z paska menu, kliknij Insert -> Moduł .
- Następnie, kopia następujący kod i pasta w oknie kodu.
Sub IndexMatchStudent() Dim iSheet As Worksheet Set iSheet = Worksheets("Dwa wymiary") 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
Twój kod jest teraz gotowy do uruchomienia.
- Teraz naciśnij F5 na klawiaturze lub z paska menu wybrać Run -> Run Sub/UserForm. Możesz też po prostu kliknąć na mała ikona Uruchom na pasku podmenu, aby uruchomić makro.
Po wykonaniu kodu spójrz na poniższy gif, aby zobaczyć wynik.
W związku z tym Marks że " Edge" dostał na egzaminie, 67 , jest pobierany w Komórka G7 .
Objaśnienie kodu VBA
Dim iSheet As Worksheet
Określenie zmiennej Worksheet.
Set iSheet = Worksheets("Dwa wymiary")
Zapisz nazwę arkusza. Nazwa naszego arkusza to "Dwa wymiary", powinieneś podać nazwę zgodną z Twoim arkuszem.
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))
Ten fragment kodu wybiera zakres C5:D14 Następnie należy wyszukać dopasowanie, które jest zapisane w komórce G4 w zasięgu B5:B14 i szukają dopasowania, które jest zapisane w komórce G5 w zasięgu C4:D4 i przekazać wynik do komórki G6 .
Read More: Jak użyć INDEX MATCH z wieloma kryteriami dla zakresu dat?
Kryteria - 2: Zastosuj Makro aby znaleźć wartość dopasowania przez INDEKS z funkcją zdefiniowaną przez użytkownika (UDF)
Możesz wyodrębnić dopasowane wartości z zestawu danych za pomocą funkcja zdefiniowana przez użytkownika (UDF) Na poniższym obrazku, to co zrobimy to, przekażemy Legitymacja studencka oraz Oceny z egzaminu pewnego studenta, a funkcja rzuci nam Nazwa tego konkretnego ucznia.
Zobaczmy, jak to osiągnąć dla Imię ucznia "Finn" z VBA .
Kroki:
- Jak pokazano wcześniej, otwarte Edytor Visual Basic od Deweloper zakładka i Wkładka a Moduł w oknie kodu.
- Następnie w oknie kodu, kopia następujący kod i pasta to.
Function MatchByIndex(x As Double, y As Double) Const StartRow = 4 Dim EndRow As Long Dim iRow As Long With Worksheets("FROM") 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
- Nie uciekaj. ten kod, uratować to.
- Teraz, wróć do arkusza zainteresowania. Wybierz dowolną komórkę że chcesz przechowywać wynik. W naszym przypadku jest to Komórka F5 .
- W tej celi, napisać UDF które właśnie stworzyłeś w kodzie ( MatchByIndex ) oraz przekazać legitymację studencką i oceny z egzaminu konkretnego ucznia wewnątrz nawiasów funkcji.
Ponieważ próbujemy wyodrębnić nazwę " Finn" od jego ID (105) oraz Marki (84) , więc dla naszego przypadku wzór staje się,
=MatchByIndex(105,84)
- Następnie naciśnij Wejdź na stronę .
Spójrz na poniższy obrazek.
W Komórka F5 , udało nam się pobrać nazwę " Finn" po prostu przechodząc przez jego ID oraz Marks wewnątrz funkcji, którą utworzyliśmy w VBA kod.
Objaśnienie kodu VBA
Function MatchByIndex(x As Double, y As Double)
Tworzenie nowej funkcji i przekazywanie zmiennych wewnątrz niej. Można zdefiniować dowolną nazwę do funkcji.
Const StartRow = 4
Nasz wiersz zaczyna się od wiersza nr 4. Musisz podać numer wiersza, od którego zaczyna się twój zbiór danych.
Dim KoniecRow As Long Dim iRow As Long
Definiowanie zmiennych.
With Worksheets("FROM") EndRow = .Range("C:D").Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
Najpierw należy zdefiniować arkusz, z którym będziemy pracować. Nazwa naszego arkusza to "UDF", należy podać nazwę zgodną z posiadanym arkuszem. Następnie należy rozpocząć wyszukiwanie w zakresie C:D od pierwszego zdefiniowanego przez nas rzędu do ostatniego.
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
Rozpocznij iterację od pierwszego do ostatniego wiersza. Jeśli pierwsza wartość, którą przekażemy wewnątrz funkcji, mieści się w przedziale C i jeśli druga wartość, którą przekażemy wewnątrz funkcji mieści się w kolumnie D to zwróci dopasowanie z kolumny B W przeciwnym razie zamknij funkcję, zakończ wszystkie instrukcje i przejdź do następnego wiersza.
MatchByIndex = "Dane nie zostały znalezione" End Function
Jeżeli podczas wykonywania nie zostanie spełniony poprzedni warunek, to zostanie zwrócony komunikat "Data Not Found" i kod opuści funkcję.
Read More: INDEX-MATCH z wieloma kryteriami dla częściowego tekstu w Excelu (2 sposoby)
Kryteria - 3: Implementacja VBA do zwracania wartości MATCH z tabeli z wieloma danymi w Excelu
W tym rozdziale dowiemy się, jak zwrócić wartość dopasowaną według indeksów z tabeli w MsgBox w VBA Excel.
Zobaczmy, jak wyodrębnić Marks z tabeli przedstawionej w naszym zbiorze danych ( T Nazwa: TableMatch ) określonego ucznia poprzez podanie Nazwa i ID w kodzie. W naszym przypadku Nazwa i ID będzie Finn oraz 105 odpowiednio.
Kroki:
- Po pierwsze, otwórz Edytor Visual Basic od Deweloper zakładka i Wkładka a Moduł w oknie kodu.
- Następnie, kopia następujący kod i pasta w oknie kodu.
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 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
Twój kod jest teraz gotowy do uruchomienia.
- Później, Uruchom ten kod i spójrz na następujący obraz, aby zobaczyć, co się stało w wyniku.
Jak widać na powyższym obrazku, istnieje m.in. Microsoft Excel wyskakujące okienko z komunikatem pokazujące Znaki: 84 z ID: 105 oraz Imię: Finn które podaliśmy wewnątrz kodu.
Objaśnienie kodu 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
Definiowanie zmiennych.
Set iBook = Application.ThisWorkbook Set iSheet = iBook.Sheets("Return Result") Set iTable = iSheet.ListObjects("TableMatch")
Ustawienie nazwy arkusza i nazwy tabeli wewnątrz zmiennych.
TargetID = 105 TargetName = "Finn" IdColumn = iTable.ListColumns("Student ID").Index NameColumn = iTable.ListColumns("Student Name").Index MarksColumn = iTable.ListColumns("Exam Marks").Index
Przechowywanie wartości lookup i kolumn lookup do przeszukiwania.
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 If iResult Then Exit For Next iCount
Ten fragment kodu skanuje od początku do końca skryptu i jeśli znajdzie dopasowanie zdefiniowanego identyfikatora i nazwy w kolumnach wyszukiwania, a następnie przechowuje wynik i zamyka wszystkie oświadczenia. Również opuścić iterację i przejść do następnej części kodu.
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
Wyrzuca wynik w MsgBox.
Read More: Wyszukaj i zwróć wiele wartości połączonych w jednej komórce w Excelu
Wniosek
Podsumowując, ten artykuł pokazał Ci 3 różne metody jak wykonać INDEX MATCH na podstawie wielu kryteriów w programie Excel z Makro VBA Mam nadzieję, że ten artykuł był dla Ciebie bardzo korzystny. Zapraszam do zadawania wszelkich pytań związanych z tematem.