Obsah
Tento kurz ukazuje, jak používat funkci VLOOKUP ke kopírování dat z jiného listu nebo sešitu, Vlookup ve více listech a dynamické vyhledávání pro návrat hodnot z různých listů do různých buněk.
Při vyhledávání nějakých informací v aplikaci Excel se jen výjimečně stává, že se všechna data nacházejí na jednom listu. Častěji budete muset vyhledávat na více listech nebo dokonce v různých sešitech. Dobrou zprávou je, že aplikace Microsoft Excel nabízí více způsobů, jak to provést, a špatnou zprávou je, že všechny způsoby jsou o něco složitější než standardní vzorec VLOOKUP. Stačí však trocha trpělivosti a můžemepřijde na ně :)
Jak provést VLOOKUP mezi dvěma listy
Pro začátek prozkoumejme nejjednodušší případ - použití vzorce VLOOKUP ke kopírování dat z jiného listu. Je to velmi podobné běžnému vzorci VLOOKUP, který vyhledává na stejném listu. Rozdíl je v tom, že do vzorce VLOOKUP uvedete název listu. table_array argumentu, který vašemu vzorci říká, ve kterém pracovním listu se nachází rozsah vyhledávání.
Obecný vzorec pro VLOOKUP z jiného listu je následující:
VLOOKUP(lookup_value, List!rozsah , col_index_num, [range_lookup])Jako příklad uveďme údaje o prodeji ze stránek Jan hlášení do Souhrn Za tímto účelem definujeme následující argumenty:
- Lookup_values jsou ve sloupci A na Souhrn a odkazujeme na první datovou buňku, kterou je A2.
- Table_array je rozsah A2:B6 na listu Jan. Chcete-li se na něj odkázat, předepište odkaz na rozsah názvem listu následovaným vykřičníkem: Jan!$A$2:$B$6.
Věnujte prosím pozornost tomu, že rozsah uzamkneme pomocí absolutních odkazů na buňky, abychom zabránili jeho změně při kopírování vzorce do jiných buněk.
Col_index_num je 2, protože chceme zkopírovat hodnotu ze sloupce B, což je 2. sloupec v poli tabulky.
- Range_lookup je nastavena na hodnotu FALSE, aby se vyhledala přesná shoda.
Když si argumenty spojíme, získáme tento vzorec:
=VLOOKUP(A2, Jan!$A$2:$B$6, 2, FALSE)
Přetáhněte vzorec dolů do sloupce a získáte tento výsledek:
Podobným způsobem můžete vyhledávat data z okna Únor a Mar listů:
=VLOOKUP(A2, Feb!$A$2:$B$6, 2, FALSE)
=VLOOKUP(A2, Mar!$A$2:$B$6, 2, FALSE)
Tipy a poznámky:
- Pokud název listu obsahuje prostory nebo nealfabetické znaky , musí být uzavřen v jednoduchých uvozovkách, jako např. 'Jan Sales'!$A$2:$B$6 . Další informace naleznete v části Jak odkazovat na jiný list v aplikaci Excel.
- Místo zadávání názvu listu přímo do vzorce můžete přepnout na list pro vyhledávání a vybrat rozsah tam. Excel automaticky vloží odkaz se správnou syntaxí, čímž vás ušetří kontroly názvu a řešení problémů.
Vlookup z jiného sešitu
Chcete-li provést VLOOKUP mezi dvěma sešity, uveďte název souboru v hranatých závorkách, za ním název listu a vykřičník.
Chcete-li například vyhledat hodnotu A2 v rozsahu A2:B6 na adrese Jan list v Sales_reports.xlsx sešitu použijte tento vzorec:
=VLOOKUP(A2, [Sales_reports.xlsx]Jan!$A$2:$B$6, 2, FALSE)
Podrobné informace naleznete v části VLOOKUP z jiného sešitu v aplikaci Excel.
Vlookup přes více listů s IFERROR
Pokud potřebujete vyhledávat mezi více než dvěma listy, je nejjednodušším řešením použití funkce VLOOKUP v kombinaci s funkcí IFERROR. Jde o to, že se vnoří několik funkcí IFERROR, které postupně zkontrolují více listů: pokud první funkce VLOOKUP nenajde shodu na prvním listu, hledá se v dalším listu atd.
IFERROR(VLOOKUP(...), IFERROR(VLOOKUP(...), ..., " Nenalezeno "))Abychom viděli, jak tento přístup funguje na reálných datech, podívejme se na následující příklad. Níže je uvedeno Souhrn tabulku, kterou chceme naplnit názvy položek a částkami, a to tak, že vyhledáme číslo objednávky v West a Východní listů:
Nejprve vytáhneme položky. Za tímto účelem dáme vzorci VLOOKUP pokyn, aby vyhledal číslo objednávky v A2 na Východní a vrátit hodnotu ze sloupce B (2. sloupec v položce table_array A2:C6). Pokud není nalezena přesná shoda, hledejte v poli West list. Pokud oba Vlookupy selžou, vrátí se zpráva "Nenalezeno".
=IFERROR(VLOOKUP(A2, East!$A$2:$C$6, 2, FALSE), IFERROR(VLOOKUP(A2, West!$A$2:$C$6, 2, FALSE), "Not found"))
Chcete-li vrátit částku, stačí změnit číslo indexu sloupce na 3:
=IFERROR(VLOOKUP(A2, East!$A$2:$C$6, 3, FALSE), IFERROR(VLOOKUP(A2, West!$A$2:$C$6, 3, FALSE), "Not found"))
Tip: V případě potřeby můžete pro různé funkce VLOOKUP zadat různá pole tabulek. V tomto příkladu mají oba vyhledávací listy stejný počet řádků (A2:C6), ale vaše pracovní listy mohou mít různou velikost.
Vlookup ve více sešitech
Chcete-li provést Vlookup mezi dvěma nebo více sešity, uzavřete název sešitu do hranatých závorek a vložte jej před název listu. Například takto můžete provést Vlookup v. dva různé soubory ( Kniha1 a Kniha2 ) s jediným vzorcem:
=IFERROR(VLOOKUP(A2, [Book1.xlsx]East!$A$2:$C$6, 2, FALSE), IFERROR(VLOOKUP(A2, [Book2.xlsx]West!$A$2:$C$6, 2, FALSE), "Not found"))
Vytvoření dynamického čísla indexu sloupce pro Vlookup více sloupců
V situaci, kdy potřebujete vrátit data z několika sloupců, je nutné provést col_index_num Dynamic by vám mohl ušetřit čas. Je třeba provést několik úprav:
- Pro col_index_num použijte funkci COLUMNS, která vrací počet sloupců v zadaném poli: COLUMNS($A$1:B$1). (Na souřadnici řádku nezáleží, může to být libovolný řádek.)
- V lookup_value uzamkněte odkaz na sloupec pomocí znaménka $ ($A2), aby zůstal při kopírování vzorce do jiných sloupců neměnný.
Výsledkem je jakýsi dynamický vzorec, který vybírá odpovídající hodnoty z různých sloupců v závislosti na tom, do kterého sloupce je vzorec zkopírován:
=IFERROR(VLOOKUP($A2, East!$A$2:$C$6, COLUMNS($A$1:B$1), FALSE), IFERROR(VLOOKUP($A2, West!$A$2:$C$6, COLUMNS($A$1:B$1), FALSE), "Not found"))
Při zadání do sloupce B se COLUMNS($A$1:B$1) vyhodnotí jako 2, což znamená, že VLOOKUP vrátí hodnotu z 2. sloupce v poli tabulky.
Při kopírování do sloupce C (tj. vzorec jste přetáhli z B2 do C2) se B$1 změní na C$1, protože odkaz na sloupec je relativní. Proto se COLUMNS($A$1:C$1) vyhodnotí jako 3 a VLOOKUP vrátí hodnotu ze třetího sloupce.
Tento vzorec funguje skvěle pro 2 - 3 vyhledávací listy. Pokud jich máte více, opakované IFERRORy se stanou příliš těžkopádnými. Další příklad ukazuje trochu složitější, ale mnohem elegantnější přístup.
Vlookup více listů pomocí INDIRECT
Dalším způsobem, jak v Excelu provádět Vlookup mezi více listy, je použít kombinaci funkcí VLOOKUP a INDIRECT. Tento způsob vyžaduje trochu přípravy, ale nakonec získáte kompaktnější vzorec pro Vlookup v libovolném počtu tabulek.
Obecný vzorec pro Vlookup napříč listy je následující:
VLOOKUP( lookup_value , INDIRECT("'"&INDEX( Lookup_sheets , MATCH(1, --(COUNTIF(INDIRECT("'" & Lookup_sheets & "! lookup_range "), lookup_value )>0), 0)) & "'! table_array "), col_index_num , FALSE)Kde:
- Lookup_sheets - pojmenovaný rozsah složený z názvů vyhledávacích archů.
- Lookup_value - hodnotu, kterou chcete vyhledat.
- Lookup_range - rozsah sloupců v listech vyhledávání, ve kterých se má hledat hodnota vyhledávání.
- Table_array - rozsah dat ve vyhledávacích listech.
- Col_index_num - číslo sloupce v poli tabulky, ze kterého se má vrátit hodnota.
Aby vzorec fungoval správně, mějte na paměti následující upozornění:
- Jedná se o vzorec pole, který je třeba doplnit stisknutím kláves Ctrl + Shift + Enter najednou.
- Všechny listy musí mít stejné pořadí sloupců .
- Protože používáme jedno pole tabulek pro všechny vyhledávací listy, zadejte pole největší rozsah pokud mají vaše listy různý počet řádků.
Jak použít vzorec pro Vlookup napříč listy
Chcete-li vyhledat více listů najednou, proveďte tyto kroky:
- Zapište si někam do sešitu názvy všech listů pro vyhledávání a pojmenujte tento rozsah ( Lookup_sheets v našem případě).
- hledání hodnoty A2 ( lookup_value )
- v rozsahu A2:A6 ( lookup_range ) ve čtyřech pracovních listech ( Východní , Severní , Jižní a West ) a
- vytáhnout odpovídající hodnoty ze sloupce B, což je sloupec 2 ( col_index_num ) v datovém rozsahu A2:C6 ( table_array ).
S výše uvedenými argumenty má vzorec tento tvar:
=VLOOKUP($A2, INDIRECT("'"&INDEX(Lookup_sheets, MATCH(1, --(COUNTIF(INDIRECT("'"& Lookup_sheets&"'!$A$2:$A$6"), $A2)>0), 0)) &"'!$A$2:$C$6"), 2, FALSE)
Všimněte si, že oba rozsahy ($A$2:$A$6 a $A$2:$C$6) zamykáme pomocí absolutních odkazů na buňky.
Výsledkem je vzorec, který vyhledá číslo objednávky ve 4 listech a načte odpovídající položku. Pokud není nalezeno konkrétní číslo objednávky, zobrazí se chyba #N/A jako v řádku 14:
Chcete-li vrátit částku, jednoduše nahraďte 2 číslem 3 v poli col_index_num argument jako částky ve 3. sloupci pole tabulky:
=VLOOKUP($A2, INDIRECT("'"&INDEX(Lookup_sheets, MATCH(1, --(COUNTIF(INDIRECT("'" & Lookup_sheets & "'!$A$2:$A$6"), $A2)>0), 0)) & "'!$A$2:$C$6"), 3, FALSE)
Pokud chcete nahradit standardní zápis chyby #N/A vlastním textem, zabalte vzorec do funkce IFNA:
=IFNA(VLOOKUP($A2, INDIRECT("'"&INDEX(Lookup_sheets, MATCH(1, --(COUNTIF(INDIRECT("'" & Lookup_sheets & "'!$A$2:$A$6"), $A2)>0), 0)) & "'!$A$2:$C$6"), 3, FALSE), "Not found")
Vlookup více listů mezi sešity
Tento obecný vzorec (nebo jeho libovolnou obměnu) lze použít také k vyhledávání více listů v jednom jiný sešit . Za tímto účelem spojte název sešitu uvnitř INDIRECT, jak je uvedeno v následujícím vzorci:
=IFNA(VLOOKUP($A2, INDIRECT("'[Book1.xlsx]" & INDEX(Lookup_sheets, MATCH(1, --(COUNTIF(INDIRECT("'[Book1.xlsx]" & Lookup_sheets & "'!$A$2:$A$6"), $A2)>0), 0)) & "'!$A$2:$C$6"), 2, FALSE), "Not found")
Vlookup mezi listy a vrácení více sloupců
Pokud chcete vytáhnout data z několika sloupců, můžete použít funkci vzorec pro vícebuněčné pole To lze provést najednou. Chcete-li vytvořit takový vzorec, zadejte konstantu pole pro vzorec col_index_num argument.
V tomto příkladu chceme vrátit názvy položek (sloupec B) a částky (sloupec C), což jsou 2. a 3. sloupec pole tabulky. Požadované pole je tedy {2,3}.
=VLOOKUP($A2, INDIRECT("'"&INDEX(Lookup_sheets, MATCH(1, --(COUNTIF(INDIRECT("'"& Lookup_sheets &"'!$A$2:$C$6"), $A2)>0), 0)) &"'!$A$2:$C$6"), {2,3}, FALSE)
Chcete-li správně zadat vzorec do více buněk, musíte postupovat takto:
- V prvním řádku vyberte všechny buňky, které mají být vyplněny (v našem příkladu B2:C2).
- Zadejte vzorec a stiskněte klávesy Ctrl + Shift + Enter . Tím se do vybraných buněk zadá stejný vzorec, který v každém sloupci vrátí jinou hodnotu.
- Přetáhněte vzorec dolů na zbývající řádky.
Jak tento vzorec funguje
Pro lepší pochopení logiky si tento základní vzorec rozebereme na jednotlivé funkce:
=VLOOKUP($A2, INDIRECT("'"&INDEX(Lookup_sheets, MATCH(1, --(COUNTIF(INDIRECT("'"& Lookup_sheets&"'!$A$2:$A$6"), $A2)>0), 0)) &"'!$A$2:$C$6"), 2, FALSE)
Tento vzorec funguje zevnitř ven:
COUNTIF a INDIRECT
Stručně řečeno, INDIRECT vytváří odkazy pro všechny listy vyhledávání a COUNTIF počítá výskyty hodnoty vyhledávání (A2) v každém listu:
--(COUNTIF( INDIRECT("'"&Lookup_sheets&"'!$A$2:$A$6"), $A2)>0)
Podrobněji:
Nejprve spojíte název rozsahu (Lookup_sheets) a odkaz na rozsah ($A$2:$A$6), přidáte apostrofy a vykřičník na správná místa, abyste vytvořili externí odkaz, a výsledný textový řetězec předáte funkci INDIRECT, aby dynamicky odkazovala na vyhledávací listy:
INDIRECT({"'Východ'!$A$2:$A$6"; "'Jih'!$A$2:$A$6"; "'Sever'!$A$2:$A$6"; "'Západ'!$A$2:$A$6"})
COUNTIF zkontroluje každou buňku v rozsahu A2:A6 na každém listu vyhledávání s hodnotou v A2 na hlavním listu a vrátí počet shod pro každý list. V našem souboru dat se číslo zakázky v A2 (101) nachází v položce West list, který je 4. v uvedeném rozsahu, takže COUNTIF vrací toto pole:
{0;0;0;1}
Poté porovnáte každý prvek výše uvedeného pole s hodnotou 0:
--({0; 0; 0; 1}>0)
Tím získáte pole hodnot TRUE (větší než 0) a FALSE (rovná se 0), které pomocí dvojitého unárního znaku (--) převedete na 1 a 0 a jako výsledek získáte následující pole:
{0; 0; 0; 1}
Tato operace je dodatečným opatřením pro případ, kdy list vyhledávání obsahuje několik výskytů hodnoty vyhledávání, v takovém případě by COUNTIF vrátil počet větší než 1, zatímco my chceme mít ve výsledném poli pouze jedničky a nuly (za chvíli pochopíte proč).
Po všech těchto transformacích vypadá náš vzorec takto:
VLOOKUP($A2, INDIRECT("'"&INDEX(Lookup_sheets, MATCH(1, {0;0;0;1} , 0)) &"'!$A$2:$C$6"), 2, FALSE)
INDEX a MATCH
V tomto okamžiku nastoupí klasická kombinace INDEX MATCH:
INDEX(Lookup_sheets, MATCH(1, {0;0;0;1}, 0))
Funkce MATCH nastavená na přesnou shodu (0 v posledním argumentu) hledá hodnotu 1 v poli {0;0;0;1} a vrací její pozici, která je 4:
INDEX(Lookup_sheets, 4)
Funkce INDEX použije číslo vrácené funkcí MATCH jako argument čísla řádku (row_num) a vrátí 4. hodnotu ve jmenovaném rozsahu. Lookup_sheets , což je West .
Vzorec se tedy dále redukuje na:
VLOOKUP($A2, INDIRECT("'"&" West "&"'!$A$2:$C$6"), 2, FALSE)
VLOOKUP a INDIRECT
Funkce INDIRECT zpracovává textový řetězec uvnitř:
INDIRECT("'"& "West"&"'!$A$2:$C$6")
a převede ji na odkaz, který přejde do položky table_array argument VLOOKUP:
VLOOKUP($A2, 'West'!$A$2:$C$6 , 2, FALSE)
Nakonec tento velmi standardní vzorec VLOOKUP hledá hodnotu A2 v prvním sloupci rozsahu A2:C6 na stránce West a vrátí shodu z 2. sloupce. To je vše!
Dynamický VLOOKUP pro vrácení dat z více listů do různých buněk
Nejprve si definujme, co přesně v tomto kontextu znamená slovo "dynamický" a jak se bude tento vzorec lišit od předchozích.
V případě, že máte velké kusy dat ve stejném formátu, které jsou rozděleny do více tabulek, můžete chtít extrahovat informace z různých listů do různých buněk. Obrázek níže ilustruje tento koncept:
Na rozdíl od předchozích vzorců, které získávaly hodnotu z konkrétního listu na základě jedinečného identifikátoru, tentokrát chceme získat hodnoty z několika listů najednou.
Pro tento úkol existují dvě různá řešení. V obou případech je třeba provést malou přípravnou práci a vytvořit pojmenované rozsahy pro datové buňky v každém listu vyhledávání. Pro tento příklad jsme definovali následující rozsahy:
- East_Sales - A2:B6 na východním listu
- North_Sales - A2:B6 na severním listu
- South_Sales - A2:B6 na jižním listu
- West_Sales - A2:B6 na západním listu
VLOOKUP a vnořené IF
Pokud máte k dispozici přiměřený počet listů, které chcete vyhledat, můžete použít vnořené funkce IF k výběru listu na základě klíčových slov v předdefinovaných buňkách (v našem případě buňky B1 až D1).
S vyhledávací hodnotou v A2 je vzorec následující:
=VLOOKUP($A2, IF(B$1="východ", East_Sales, IF(B$1="sever", North_Sales, IF(B$1="jih", South_Sales, IF(B$1="západ", West_Sales)))), 2, FALSE)
Přeloženo do češtiny, část IF zní:
Pokud je B1 Východní , podívejte se do rozsahu s názvem East_Sales ; pokud B1 je Severní , podívejte se do rozsahu s názvem North_Sales ; pokud B1 je Jižní , podívejte se do rozsahu s názvem South_Sales ; a pokud B1 je West , podívejte se do rozsahu s názvem West_Sales .
Rozsah vrácený pomocí IF sahá až do table_array VLOOKUP, který vytáhne odpovídající hodnotu z 2. sloupce příslušného listu.
Chytré použití smíšených odkazů pro vyhledávací hodnotu ($A2 - absolutní sloupec a relativní řádek) a logický test IF (B$1 - relativní sloupec a absolutní řádek) umožňuje kopírovat vzorec do dalších buněk beze změny - Excel automaticky upraví odkazy na základě relativní pozice řádku a sloupce.
Zadáme tedy vzorec v B2, zkopírujeme jej doprava a dolů do tolika sloupců a řádků, kolik potřebujeme, a dostaneme následující výsledek:
NEPŘÍMÉ VYHLEDÁVÁNÍ
Při práci s mnoha listy by více vnořených úrovní mohlo způsobit, že vzorec bude příliš dlouhý a nepřehledný. Mnohem lepší je vytvořit vzorec dynamický rozsah vyhledávání s pomocí INDIRECT:
=VLOOKUP($A2, INDIRECT(B$1&"_Sales"), 2, FALSE)
Zde spojíme odkaz na buňku, která obsahuje jedinečnou část pojmenovaného rozsahu (B1), a společnou část (_Sales). Vznikne tak textový řetězec typu "East_Sales", který INDIRECT převede na název rozsahu srozumitelný aplikaci Excel.
Výsledkem je kompaktní vzorec, který skvěle funguje na libovolném počtu listů:
To je návod, jak v Excelu provádět Vlookup mezi listy a soubory. Děkuji vám za přečtení a doufám, že se příští týden uvidíme na našem blogu!
Cvičebnice ke stažení
Příklady více listů Vlookup (.xlsx soubor)