Tento tutoriál ukáže, ako používať metódy Hľadať a nahradiť v programe Excel VBA.
Nájdenie VBA
Excel má vynikajúcu vstavanú funkciu Nájsť a Nájsť a nahradiť nástroje.
Dajú sa aktivovať pomocou skratiek CTRL + F (Nájsť) alebo CTRL + H (Nahradiť) alebo prostredníctvom pásky: Domov> Úpravy> Nájsť a vybrať.
Kliknutím možnosti, môžete vidieť rozšírené možnosti vyhľadávania:
Pomocou VBA môžete ľahko pristupovať k metódam Hľadať aj Nahradiť. Tieto vstavané metódy sú oveľa rýchlejšie ako čokoľvek, čo by ste mohli sami napísať vo VBA.
Nájdite príklad VBA
Aby sme demonštrovali funkciu Hľadať, vytvorili sme v hárku1 nasledujúcu množinu údajov.
Ak chcete pokračovať, zadajte údaje do vlastného zošita.
<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>
Hľadanie VBA bez voliteľných parametrov
Pri použití metódy VBA Find existuje mnoho voliteľných parametrov, ktoré môžete nastaviť.
Pri použití metódy Hľadať dôrazne odporúčame definovať všetky parametre!
Ak nedefinujete voliteľné parametre, VBA použije aktuálne vybrané parametre v okne Hľadať v Exceli. To znamená, že pri spustení kódu možno nebudete vedieť, aké parametre vyhľadávania sa používajú. Hľadanie je možné spustiť na celom zošite alebo na hárku. Mohlo by vyhľadávať vzorce alebo hodnoty. Neexistuje žiadny spôsob, ako to vedieť, pokiaľ ručne nekontrolujete, čo je aktuálne vybraté v okne Hľadať v programe Excel.
Pre jednoduchosť začneme príkladom, v ktorom nie sú definované žiadne voliteľné parametre.
Jednoduchý príklad hľadania
Pozrime sa na jednoduchý príklad Hľadať:
123456789 | Sub TestFind ()Dim MyRange As RangeNastaviť MyRange = Listy ("List1"). UsedRange.Find ("zamestnanec")MsgBox MyRange.AddressMsgBox MyRange.ColumnMsgBox MyRange.RowKoniec pod |
Tento kód hľadá „zamestnanca“ v použitom rozsahu hárku 1. Ak nájde „zamestnanca“, priradí prvý nájdený rozsah premennej rozsahu MyRange.
Ďalej sa zobrazia polia so správou s adresou, stĺpcom a riadkom nájdeného textu.
V tomto prípade sú použité predvolené nastavenia Hľadania (za predpokladu, že neboli zmenené v okne Hľadať v Exceli):
- Hľadaný text je čiastočne zhodný s hodnotou bunky (presná zhoda bunky sa nevyžaduje)
- Pri vyhľadávaní sa nerozlišujú malé a veľké písmená.
- Hľadať vyhľadáva iba jeden pracovný hárok
Tieto nastavenia je možné zmeniť pomocou rôznych voliteľných parametrov (popísané nižšie).
Nájdite poznámky k metóde
- Hľadať nevyberie bunku, kde sa nachádza text. Identifikuje iba nájdený rozsah, s ktorým môžete vo svojom kóde manipulovať.
- Metóda Find vyhľadá iba prvú nájdenú inštanciu.
- Zástupné znaky (*) môžete použiť napr. hľadať „E*“
nič nebolo nájdené
Ak hľadaný text neexistuje, objekt rozsahu zostane prázdny. To spôsobuje veľký problém, keď sa váš kód pokúša zobraziť hodnoty umiestnenia, pretože neexistujú. Výsledkom bude chybové hlásenie, ktoré nechcete.
Našťastie môžete v rámci VBA testovať objekt prázdneho rozsahu pomocou operátora Is:
1 | Ak nie je MyRange nič, potom |
Pridanie kódu do nášho predchádzajúceho príkladu:
12345678910111213 | Sub TestFind ()Dim MyRange As RangeNastaviť MyRange = Listy ("List1"). UsedRange.Find ("zamestnanec")Ak nie je MyRange nič, potomMsgBox MyRange.AddressMsgBox MyRange.ColumnMsgBox MyRange.RowInakMsgBox „Nenašlo sa“Koniec AkKoniec pod |
Nájdite parametre
Doposiaľ sme sa pozreli iba na základný príklad použitia metódy Nájsť. Existuje však množstvo voliteľných parametrov, ktoré vám pomôžu spresniť vyhľadávanie
Parameter | Napíšte | Popis | Hodnoty |
Čo | Požadovaný | Hodnota, ktorú treba hľadať | Akýkoľvek typ údajov, napríklad reťazec alebo číslica |
Po | Voliteľné | Odkaz na jednu bunku na spustenie vyhľadávania | Adresa bunky |
Pozrieť sa do | Voliteľné | Na vyhľadávanie používajte vzorce, hodnoty, komentáre | xlValues, xlFormulas, xlComments |
Pozri na | Voliteľné | Priraďte časť alebo celú bunku | xlCelá, xlČasť |
Objednávka vyhľadávania | Voliteľné | Poradie na vyhľadávanie - riadky alebo stĺpce | xlByRows, xlByColummns |
SearchDirection | Voliteľné | Smer hľadania, ktorým sa má ísť - dopredu alebo dozadu | xlĎalej, xlPredchádzajúce |
MatchCase | Voliteľné | Pri hľadaní sa rozlišujú malé a veľké písmena alebo nie | Pravda alebo lož |
MatchByte | Voliteľné | Používa sa iba vtedy, ak máte nainštalovanú podporu dvojbajtového jazyka, napr. Čínsky jazyk | Pravda alebo lož |
SearchFormat | Voliteľné | Povoliť vyhľadávanie podľa formátu bunky | Pravda alebo lož |
Po parametri a vyhľadajte viac hodnôt
Používate Po parametri na zadanie počiatočnej bunky pre vaše vyhľadávanie. Je to užitočné tam, kde existuje viac ako jedna inštancia hodnoty, ktorú hľadáte.
Ak vyhľadávanie už našlo jednu hodnotu a viete, že sa nájde viac hodnôt, použite metódu Find s parametrom „After“ na zaznamenanie prvej inštancie a potom túto bunku použite ako počiatočný bod pre ďalšie vyhľadávanie.
Toto môžete použiť na nájdenie viacerých inštancií hľadaného textu:
123456789101112131415161718192021222324252627282930313233343536 | Sub TestMultipleFinds ()Dim MyRange As Range, OldRange As Range, FindStr As String„Vyhľadajte prvý prípad položky„ Svetlo a teplo “Nastaviť MyRange = Listy („List1“). UsedRange.Find („Svetlo a teplo“)„Ak sa nenájde, odíďAk MyRange nie je nič, ukončite podponuku'Zobrazená prvá nájdená adresaMsgBox MyRange.Address„Vytvorte kópiu objektu rozsahuNastaviť OldRange = MyRange'Pridajte adresu do reťazca oddeľujúceho „|“ charakterFindStr = FindStr & "|" & MyRange.Address„Opakujte v rozsahu a hľadajte ďalšie inštancieUrob„Hľadajte„ Svetlo a teplo “pomocou predchádzajúcej nájdenej adresy ako parametra AfterNastavte MyRange = Sheets ("Sheet1"). UsedRange.Find ("Light & Heat", After: = Range (OldRange.Address))„Ak je adresa už nájdená, ukončite cyklus do - toto zastaví nepretržité opakovanieAk InStr (FindStr, MyRange.Address), potom Ukončiť Do'Zobraziť poslednú nájdenú adresuMsgBox MyRange.Address'Do reťazca adries pridajte najnovšiu adresuFindStr = FindStr & "|" & MyRange.Address'vytvorte kópiu aktuálneho rozsahuNastaviť OldRange = MyRangeSlučkaKoniec pod |
Tento kód bude iterovať použitý rozsah a adresu zobrazí vždy, keď nájde inštanciu „Light & Heat“
Všimnite si toho, že kód sa bude opakovať, kým sa v FindStr nenájde duplicitná adresa, v takom prípade opustí slučku Do.
Parameter LookIn
Môžete použiť Parameter LookIn Ak chcete určiť, v ktorej časti bunky chcete hľadať. V bunke môžete zadať hodnoty, vzorce alebo komentáre.
- xlHodnoty - Hľadá hodnoty buniek (konečná hodnota bunky po jej výpočte)
- xl Vzorce - Vyhľadáva sa v samotnom vzorci bunky (čokoľvek je do bunky zadané)
- xlKomentáre - Vyhľadávanie v poznámkach k bunke
- xlKomentkyVlákno - Vyhľadávanie v komentároch k bunke
Za predpokladu, že bol do pracovného hárka zadaný vzorec, môžete pomocou tohto ukážkového kódu nájsť prvé umiestnenie akéhokoľvek vzorca:
12345678910 | Sub TestLookIn ()Dim MyRange As RangeNastavte MyRange = Sheets ("Sheet1"). UsedRange.Find ("=", LookIn: = xlFormulas)Ak nie je MyRange nič, potomMsgBox MyRange.AddressInakMsgBox „Nenašlo sa“Koniec AkKoniec pod |
Ak by bol parameter „LookIn“ nastavený na xlValues, kód by zobrazil správu „Nenašlo sa“. V tomto prípade vráti B10.
Použitie parametra LookAt
The Parameter LookAt určuje, či funkcia find vyhľadá presnú zhodu buniek alebo vyhľadá ľubovoľnú bunku obsahujúcu hľadanú hodnotu.
- xlCelá - Vyžaduje, aby sa celá bunka zhodovala s hľadanou hodnotou
- xlČasť - Hľadá v bunke hľadaný reťazec
Tento príklad kódu vyhľadá prvú bunku obsahujúcu text „light“. S Lookat: = xlČasť, vráti zápas pre „Light & Heat“.
123456789 | Sub TestLookAt ()Dim MyRange As RangeNastavte MyRange = Sheets ("Sheet1"). UsedRange.Find ("light", Lookat: = xlPart)Ak nie je MyRange nič, potomMsgBox MyRange.AddressInakMsgBox „Nenašlo sa“Koniec AkKoniec pod |
Ak xlCelá bola nastavená, zhoda sa vráti iba vtedy, ak je hodnota bunky „svetlá“.
Parameter SearchOrder
The Parameter SearchOrder určuje, ako sa bude vyhľadávanie vykonávať v celom rozsahu.
- xlRows - Vyhľadávanie sa vykonáva po riadkoch
- xlXolóny - Vyhľadávanie sa vykonáva stĺpček po stĺpci
123456789 | Sub TestSearchOrder ()Dim MyRange As RangeNastavte MyRange = Sheets ("Sheet1"). UsedRange.Find ("employee", SearchOrder: = xlColumns)Ak nie je MyRange nič, potomMsgBox MyRange.AddressInakMsgBox „Nenašlo sa“Koniec AkKoniec pod |
To ovplyvňuje, ktorá zhoda sa nájde ako prvá.
Použitím testovacích údajov zadaných do pracovného hárka skôr, keď sú poradím vyhľadávania stĺpce, umiestnená bunka je A5. Keď sa parameter poradia vyhľadávania zmení na xlRows, umiestnená bunka je C4
Je to dôležité, ak máte v rozsahu vyhľadávania duplicitné hodnoty a chcete nájsť prvú inštanciu pod konkrétnym názvom stĺpca.
Parameter SearchDirection
The Parameter SearchDirection určuje, akým smerom sa bude vyhľadávanie uberať - efektívne dopredu alebo dozadu.
- xlĎalej - Vyhľadajte ďalšiu zodpovedajúcu hodnotu v rozsahu
- xlPredchádzajúce - Vyhľadajte predchádzajúcu zodpovedajúcu hodnotu v rozsahu
Opäť platí, že ak sa v rámci rozsahu vyhľadávania nachádzajú duplicitné hodnoty, môže to mať vplyv na to, ktorá sa najskôr nájde.
12345678910 | Sub TestSearchDirection ()Dim MyRange As RangeNastavte MyRange = Sheets ("Sheet1"). UsedRange.Find ("heat", SearchDirection: = xlPrevious)Ak nie je MyRange nič, potomMsgBox MyRange.AddressInakMsgBox „Nenašlo sa“Koniec AkKoniec pod |
Použitím tohto kódu na testovacie údaje smer vyhľadávania xlPrevious vráti polohu C9. Použitie parametra xlNext vráti umiestnenie A4.
Parameter Next znamená, že vyhľadávanie začne v ľavom hornom rohu rozsahu vyhľadávania a bude pracovať smerom nadol. Parameter Predchádzajúci znamená, že vyhľadávanie sa začne v pravom dolnom rohu rozsahu vyhľadávania a bude postupovať nahor.
Parameter MatchByte
The Parameter MatchBye sa používa iba v jazykoch, ktoré na zobrazenie každého znaku používajú dvojbajt, ako je čínština, ruština a japončina.
Ak je tento parameter nastavený na hodnotu „True“, funkcia Hľadať bude zhodovať iba dvojbajtové znaky s dvojbajtovými znakmi. Ak je parameter nastavený na hodnotu „False“, dvojbajtový znak sa bude zhodovať s jedno alebo dvojbajtovými znakmi.
Parameter SearchFormat
The Parameter SearchFormat umožňuje vyhľadávať zodpovedajúce formáty buniek. Môže to byť konkrétne používané písmo, tučné písmo alebo farba textu. Pred použitím tohto parametra musíte nastaviť požadovaný formát pre vyhľadávanie pomocou vlastnosti Application.FindFormat.
Tu je príklad použitia:
12345678910111213 | Sub TestSearchFormat ()Dim MyRange As RangeApplication.FindFormat.ClearApplication.FindFormat.Font.Bold = TrueNastavte MyRange = Sheets ("Sheet1"). UsedRange.Find ("heat", Searchformat: = True)Ak nie je MyRange nič, potomMsgBox MyRange.AddressInakMsgBox „Nenašlo sa“Koniec AkApplication.FindFormat.ClearKoniec pod |
V tomto prípade je FindFormat vlastnosť je nastavená tak, aby hľadala tučné písmo. Príkaz Find potom vyhľadá slovo „teplo“ a parameter SearchFormat nastaví na hodnotu True, aby vrátil inštanciu tohto textu iba vtedy, ak je písmo tučné.
V ukážkových údajoch pracovného hárka uvedených vyššie vráti A9, čo je jediná bunka obsahujúca slovo „teplo“ hrubým písmom.
Uistite sa, že vlastnosť FindFormat je na konci kódu vymazaná. Ak to neurobíte, vaše ďalšie hľadanie to bude brať do úvahy a vráti nesprávne výsledky.
Tam, kde použijete parameter SearchFormat, môžete ako hodnotu vyhľadávania použiť aj zástupný znak (*). V tomto prípade vyhľadá akúkoľvek hodnotu tučným písmom:
1 | Nastavte MyRange = Sheets ("Sheet1"). UsedRange.Find ("*", Searchformat: = True) |
Použitie viacerých parametrov
Všetky parametre vyhľadávania, o ktorých sa tu diskutuje, je možné v prípade potreby použiť navzájom.
Môžete napríklad skombinovať parameter „LookIn“ s parametrom „MatchCase“, aby ste sa pozreli na celý text bunky, ale rozlišujú sa v ňom veľké a malé písmená.
123456789 | Dielčí test Viacnásobné parametre ()Dim MyRange As RangeNastavte MyRange = Sheets ("Sheet1"). UsedRange.Find ("Light & Heat", LookAt: = xlWhole, MatchCase: = True)Ak nie je MyRange nič, potomMsgBox MyRange.AddressInakMsgBox „Nenašlo sa“Koniec AkKoniec pod |
V tomto prípade kód vráti A4, ale ak by sme použili iba časť textu napr. „Teplo“, nič by sa nenašlo, pretože sa zhodujeme v celej hodnote bunky. Tiež by zlyhalo, pretože prípad sa nezhoduje.
1 | Nastavte MyRange = Sheets ("Sheet1"). UsedRange.Find ("heat", LookAt: = xlWhole, MatchCase: = True) |
Nahradiť v programe Excel VBA
Ako môžete očakávať, v programe Excel VBA je funkcia Nahradiť, ktorá funguje veľmi podobným spôsobom ako „Hľadať“, ale hodnoty v umiestnení bunky nahradí novou hodnotou.
Toto sú parametre, ktoré môžete použiť v príkaze metódy Nahradiť. Fungujú úplne rovnako ako v prípade príkazu Find. Jediným rozdielom oproti funkcii „Nájsť“ je, že musíte zadať parameter nahradenia.
názov | Napíšte | Popis | Hodnoty |
Čo | Požadovaný | Hodnota, ktorú treba hľadať | Akýkoľvek typ údajov, napríklad reťazec alebo číslica |
Výmena | Požadovaný | Náhradný reťazec. | Akýkoľvek typ údajov, napríklad reťazec alebo číslica |
Pozri na | Voliteľné | Priraďte časť alebo celú bunku | xlČasť alebo xlWhole |
Objednávka vyhľadávania | Voliteľné | Poradie vyhľadávania v - riadkoch alebo stĺpcoch | xlByRows alebo xlByColumns |
MatchCase | Voliteľné | Pri hľadaní sa rozlišujú malé a veľké písmena alebo nie | Pravda alebo lož |
MatchByte | Voliteľné | Používa sa iba vtedy, ak máte nainštalovanú podporu dvojbajtového jazyka | Pravda alebo lož |
SearchFormat | Voliteľné | Povoliť vyhľadávanie podľa formátu bunky | Pravda alebo lož |
ReplaceFormat | Voliteľné | Formát nahradenia metódy. | Pravda alebo lož |
Parameter Nahradiť formát hľadá bunku s konkrétnym formátom, napr. tučným písmom rovnakým spôsobom, ako parameter SearchFormat funguje v metóde Hľadať. Najprv musíte nastaviť vlastnosť Application.FindFormat, ako je to uvedené v ukážkovom kóde Find vyššie
Nahradiť bez voliteľných parametrov
Najjednoduchšie je zadať iba to, čo hľadáte a čím ho chcete nahradiť.
123 | Náhradný test Nahradiť ()Listy („List1“). UsedRange.Replace What: = "Light & Heat", Replacement: = "L & H"Koniec pod |
Všimnite si toho, že metóda Hľadať vráti iba prvú inštanciu zodpovedajúcej hodnoty, zatiaľ čo metóda Nahradiť funguje v celom uvedenom rozsahu a nahradí všetko, v čom nájde zhodu.
Tu zobrazený náhradný kód nahradí každú inštanciu „Light & Heat“ za „L & H“ v celom rozsahu buniek definovaných objektom UsedRange
Použitie VBA na nájdenie alebo nahradenie textu v textovom reťazci VBA
Vyššie uvedené príklady fungujú skvele pri použití VBA na interakciu s údajmi programu Excel. Na interakciu so reťazcami VBA však môžete použiť vstavané funkcie VBA, ako sú INSTR a REPLACE.
Môžete použiť Funkcia INSTR na vyhľadanie reťazca textu v dlhšom reťazci.
123 | Sub TestInstr ()MsgBox InStr („Toto je reťazec MyText“, „MyText“)Koniec pod |
Tento ukážkový kód vráti hodnotu 9, čo je číselná pozícia, kde sa v hľadanom reťazci nachádza „MyText“.
Upozorňujeme, že rozlišujú sa malé a veľké písmená. Ak je „MyText“ malými písmenami, vráti sa hodnota 0, čo znamená, že hľadaný reťazec nebol nájdený. Ďalej budeme diskutovať o tom, ako zakázať rozlišovanie malých a veľkých písmen.
INSTR - Začnite
K dispozícii sú ďalšie dva voliteľné parametre. Môžete zadať počiatočný bod vyhľadávania:
1 | MsgBox InStr (9, „Toto je reťazec MyText“, „MyText“) |
Počiatočný bod je zadaný ako 9, takže sa stále vráti 9. Ak bol počiatočný bod 10, potom by sa vrátil 0 (žiadny zápas), pretože počiatočný bod by bol príliš ďaleko dopredu.
INSTR - Rozlišovanie malých a veľkých písmen
Môžete tiež nastaviť parameter Porovnať na vbBinaryCompare alebo vbTextCompare. Ak nastavíte tento parameter, príkaz musí mať hodnotu počiatočného parametra.
- vbBinaryCompare - Rozlišujú sa malé a veľké písmená (predvolené)
- vbTextCompare - Nerozlišuje malé a veľké písmená
1 | MsgBox InStr (1, „Toto je reťazec MyText“, „mytext“, vbTextCompare) |
Tento príkaz stále vráti 9, aj keď je hľadaný text malými písmenami.
Ak chcete zakázať rozlišovanie malých a veľkých písmen, môžete tiež deklarovať text na porovnanie možností v hornej časti modulu kódu.
Funkcia nahradenia VBA
Ak chcete vo svojom kóde nahradiť znaky v reťazci iným textom, je metóda Replace na to ideálna:
123 | Náhradný test Nahradiť ()MsgBox Nahradiť („Toto je reťazec MyText“, „MyText“, „Môj text“)Koniec pod |
Tento kód nahrádza text „MyText“ textom „My Text“. Všimnite si toho, že vo vyhľadávacom reťazci sa rozlišujú malé a veľké písmená, pretože binárne porovnanie je predvolené.
Môžete tiež pridať ďalšie voliteľné parametre:
- Začnite - definuje pozíciu v počiatočnom reťazci, od ktorého má náhrada začínať. Na rozdiel od metódy Find vracia skrátený reťazec začínajúci číslom znaku definovaným parametrom Start.
- Gróf - definuje počet výmen, ktoré sa majú vykonať. V predvolenom nastavení funkcia Nahradiť zmení každú inštanciu vyhľadaného textu, ale môžete to obmedziť na jednu náhradu tým, že nastavíte parameter Počet na 1.
- Porovnaj - ako v metóde Hľadať môžete zadať binárne vyhľadávanie alebo textové vyhľadávanie pomocou vbBinaryCompare alebo vbTextCompare. V binárnom formáte sa rozlišujú malé a veľké písmená a v texte sa nerozlišujú malé a veľké písmena
1 | MsgBox Replace ("This is MyText string (mytext)", "MyText", "My Text", 9, 1, vbTextCompare) |
Tento kód vráti „Môj textový reťazec (mytext)“. Dôvodom je, že počiatočný bod je 9, takže nový vrátený reťazec začína znakom 9. Bol zmenený iba prvý „MyText“, pretože parameter Count je nastavený na 1.
Metóda Nahradiť je ideálna na riešenie problémov, ako sú názvy ľudí obsahujúce apostrofy, napr. O'Flynn. Ak na definovanie hodnoty reťazca použijete jednoduché úvodzovky a existuje apostrof, spôsobí to chybu, pretože kód interpretuje apostrof ako koniec reťazca a zvyšok reťazca nerozpozná.
Metódu Nahradiť môžete použiť na nahradenie apostrofu ničím, jeho úplným odstránením.