Tento tutoriál předvede, jak odebrat duplikáty pomocí metody RemoveDuplicates ve VBA.
Metoda RemoveDuplicates
Když jsou data importována nebo vložena do listu aplikace Excel, často mohou obsahovat duplicitní hodnoty. Možná budete muset příchozí data vyčistit a odstranit duplikáty.
Naštěstí v objektu Range VBA existuje snadná metoda, která vám to umožňuje.
1 | Rozsah („A1: C8“). Odstranit duplikáty Sloupce: = 1, Záhlaví: = xlAno |
Syntaxe je:
RemoveDuplicates ([Sloupce], [Záhlaví]
- [Sloupce] - Určete, ve kterých sloupcích se kontrolují duplicitní hodnoty. Všechny sloupce se hodně shodují, aby byly považovány za duplikáty.
- [Záhlaví] - Mají data záhlaví? xlNo (výchozí), xlYes, xlYesNoGuess
Technicky jsou oba parametry volitelné. Pokud však nezadáte argument Sloupce, nebudou odstraněny žádné duplikáty.
Výchozí hodnota pro záhlaví je xlNo. Tento argument je samozřejmě lepší specifikovat, ale pokud máte řádek záhlaví, je nepravděpodobné, že se řádek záhlaví bude shodovat jako duplikát.
RemoveDuplicates Usage Notes
- Před použitím metody RemoveDuplicates musíte určit rozsah, který se má použít.
- Metoda RemoveDuplicates odstraní všechny řádky s nalezenými duplikáty, ale zachová původní řádek se všemi hodnotami.
- Metoda RemoveDuplicates funguje pouze na sloupcích a ne na řádcích, ale k nápravě této situace lze napsat kód VBA (viz později).
Ukázková data pro příklady VBA
Aby bylo možné ukázat, jak funguje ukázkový kód, používají se následující ukázková data:
Odstraňte duplicitní řádky
Tento kód odstraní všechny duplicitní řádky pouze na základě hodnot ve sloupci A:
123 | Dílčí RemoveDupsEx1 ()Rozsah („A1: C8“). Odstranit duplikáty Sloupce: = 1, Záhlaví: = xlAnoEnd Sub |
Všimněte si, že jsme výslovně definovali rozsah „A1: C8“. Místo toho můžete použít UsedRange. UsedRange určí poslední použitý řádek a sloupec vašich dat a použije RemoveDuplicates na celý tento rozsah:
123 | Dílčí RemoveDups_UsedRange ()ActiveSheet.UsedRange.RemoveDuplicates Sloupce: = 1, Záhlaví: = xlAnoEnd Sub |
UsedRange je neuvěřitelně užitečný a odstraňuje potřebu explicitně definovat rozsah.
Po spuštění těchto kódů bude váš list nyní vypadat takto:
Všimněte si, že protože byl zadán pouze sloupec A (sloupec 1), duplikát „Jablka“ dříve v řádku 5 byl odstraněn. Množství (sloupec 2) je však jiné.
Chcete -li odstranit duplikáty a porovnat více sloupců, můžeme tyto sloupce určit pomocí metody Array.
Odeberte duplikáty porovnáním více sloupců
123 | Sub RemoveDups_MultColumns ()ActiveSheet.UsedRange.RemoveDuplicates Sloupce: = Array (1, 2), Header: = xlYesEnd Sub |
Pole řekne VBA, aby porovnala data pomocí obou sloupců 1 a 2 (A a B).
Sloupce v poli nemusí být v po sobě jdoucím pořadí.
123 | Dílčí jednoduchý příklad ()ActiveSheet.UsedRange.RemoveDuplicates Sloupce: = Array (3, 1), Header: = xlYesEnd Sub |
V tomto případě se pro duplicitní srovnání používají sloupce 1 a 3.
Tento příklad kódu používá ke kontrole duplicit všechny tři sloupce:
123 | Dílčí jednoduchý příklad ()ActiveSheet.UsedRange.RemoveDuplicates Sloupce: = Array (1, 2, 3), Header: = xlYesEnd Sub |
Odebrání duplicitních řádků z tabulky
Odebrat duplikáty lze také použít na tabulku aplikace Excel přesně stejným způsobem. Syntaxe se však mírně liší.
1234 | Dílčí jednoduchý příklad ()ActiveSheet.ListObjects ("Tabulka1"). DataBodyRange.RemoveDuplicates Sloupce: = Array (1, 3), _Záhlaví: = xlAnoEnd Sub |
Tím odstraníte duplikáty v tabulce na základě sloupců 1 a 3 (A a C). Nedojde však k uklizení barevného formátování tabulky a ve spodní části tabulky uvidíte barevné prázdné řádky.
Odeberte duplikáty z polí
Pokud potřebujete odebrat duplicitní hodnoty z pole, samozřejmě můžete pole odeslat do aplikace Excel, použít metodu RemoveDuplicates a pole znovu importovat.
Napsali jsme však také proceduru VBA k odstranění duplikátů z pole.
Odebírání duplicit z řádků dat pomocí VBA
Metoda RemoveDuplicates funguje pouze na sloupcích dat, ale s určitým myšlením „po vybalení z krabice“ můžete vytvořit proceduru VBA, která se bude zabývat řadami dat.
Předpokládejme, že vaše data vypadají na listu takto:
Ve sloupcích B a E máte stejné duplikáty jako dříve, ale nemůžete je odebrat pomocí metody RemoveDuplicates.
Odpovědí je použít VBA k vytvoření dalšího listu, zkopírovat do něj data, transponovat je do sloupců, odstranit duplikáty a poté je zkopírovat zpět a transponovat zpět do řádků.
12345678910111213141516171819202122232425262728293031323334353637 | Sub DuplicatesInRows ()'Vypněte aktualizaci obrazovky a upozornění - chceme, aby kód běžel hladce, aniž by to uživatel viděl.''co se dějeApplication.ScreenUpdating = FalseApplication.DisplayAlerts = False"Přidejte nový list."Sheets.Add After: = ActiveSheet'Zavolejte nový list' CopySheet 'ActiveSheet.Name = "CopySheet"'Zkopírujte data z původního listuListy („DataInRows“). UsedRange.Copy'Aktivujte nový list, který byl vytvořenListy („CopySheet“). Aktivujte'Vložit transponujte data tak, aby byla nyní ve sloupcíchActiveSheet.Range ("A1"). PasteSpecial Paste: = xlPasteAll, operace: = xlNone, SkipBlanks: = _False, Transpose: = True`` Odstraňte duplikáty sloupců 1 a 3ActiveSheet.UsedRange.RemoveDuplicates Sloupce: = Array (1, 3), Header _: = xlAno„Vymažte data v původním listuListy („DataInRows“). UsedRange.ClearContents'Zkopírujte sloupce dat z nového vytvořeného listuListy („Copysheet“). UsedRange.Copy„Aktivujte původní listListy („DataInRows“). Aktivujte'Vložit transponujte neduplicitní dataActiveSheet.Range ("A1"). PasteSpecial Paste: = xlPasteAll, operace: = xlNone, SkipBlanks: = _False, Transpose: = True'Smažte kopírovací list - již není potřebaListy („Copysheet“). Smazat„Aktivujte původní listListy („DataInRows“). Aktivujte'Znovu zapněte aktualizaci obrazovky a upozorněníApplication.ScreenUpdating = TrueApplication.DisplayAlerts = TrueEnd Sub |
Tento kód předpokládá, že původní data v řádcích jsou uložena na listu s názvem „DataInRows“
Po spuštění kódu bude váš list vypadat takto:
Duplikát „Jablka“ ve sloupci E byl nyní odstraněn. Uživatel je zpět v čisté poloze, bez jakýchkoli cizích pracovních listů a celý proces byl proveden hladce bez blikání obrazovky nebo varovných zpráv.