Jak používat RegEx v Microsoft Word - Excel Tipy

Lissa se ptá:

Existuje způsob, jak změnit číslo (vždy náhodné číslo) za slovem liška? Příklad: liška 23, medvěd 1, liška 398, žába 12, liška 15. Chci změnit číslo na stejnou barvu slova liška.

Můžeme najít a nahradit formátem v aplikaci Microsoft Word. To je skvělá funkce pro rychlé vyhledání formátovaného textu a dokonce i nahrazení celého textového formátu v dokumentu.

Na pásu karet vyberte Rozšířené hledání.

Dialog Najít a nahradit

Zadejte text, který chcete vyhledat, kliknutím na tlačítko Více zobrazíte pokročilé možnosti a klikněte na tlačítko Formát.

Pokročilé možnosti hledání

V nastavení vyberte možnost Písmo, poté můžete nastavit barvu textu, kterou chcete v dokumentu najít. Kliknutím na OK zavřete dialogové okno Najít písmo.

Vyberte barvu textu v dialogovém okně Najít písmo.

Klikněte na Najít další a uvidíte, že bude vybrán první výskyt hledaného textu v určité barvě.

Najít další k vyhledání první události.

Můžeme také provádět složitější vyhledávání pomocí zástupných znaků. Nativní vyhledávací modul Wordu nám však nedovolí hledat, jak se Lissa zeptala.

To je místo, kde můžeme do hry zavolat RegEx!

Knihovna regulárních výrazů VBSCript

VBA se nedodává s podporou žádného regulárního výrazu. Knihovna Microsoft VBScript však obsahuje výkonné funkce regulárního výrazu. Tato knihovna je součástí aplikace Internet Explorer 5.5 a novější, takže je k dispozici na všech počítačích se systémem Windows XP, Vista, 7, 8, 8.1 nebo 10.

Uživatelé počítačů Mac

Protože Internet Explorer není aplikace pro Mac, tato knihovna v Macu neexistuje. Níže uvedené ukázky VBA proto v systému Mac nefungují.

Chcete-li tuto knihovnu používat ve VBA, přepněte na VBE, v nabídce VBE vyberte Project and References, poté přejděte dolů v seznamu a vyhledejte položku „Microsoft VBScript Regular Expressions 5.5“ a zaškrtnutím ji zahrňte do aplikace.

Knihovna regulárních výrazů VBScript

Vložte nový modul a do tohoto modulu zkopírujte a vložte následující kód.

Sub doRegexFind() Dim strSample As String Dim objRegex As RegExp Dim matches As MatchCollection Dim fnd As Match strSample = "First product code is fox 12, second one is fox 22, and third product is fox 45." Set objRegex = New RegExp With objRegex .Pattern = "fox d+" .Global = True .IgnoreCase = True Set matches = .Execute(strSample) For Each fnd In matches Debug.Print fnd Next fnd End With End Sub

Tento postup vezme ukázkový text, vyhledá kódy produktu podle daného vzoru - který začíná „liškou“, jednou mezerou a číslem a vytiskne odpovídající kódy v okně Okamžité (pokud není již viditelné).

Kódy shodných produktů vytištěné v okně Okamžité.

d+ třída znaků ve vzoru definuje jeden nebo více numerických znaků a vzor je v podstatě předpona „liška“ následovaná mezerou následovanou čísly.

Více informací

Navštivte Jazyk regulárních výrazů - Stručný průvodce, kde najdete další informace o útěcích znaků, třídách znaků a kotvách.

Zkopírujte a vložte následující kód, abyste viděli RegEx v akci a odstranili mezery z kódů produktů.

Sub doRegexFindReplace() Dim objRegex As RegExp Dim matches As MatchCollection Dim fnd As Match Dim strSample As String strSample = "First product code is fox 12, second one is fox 22, and third product is fox 45." Set objRegex = New RegExp With objRegex .Pattern = "(fox) (d+)" .Global = True .IgnoreCase = True strSample = .Replace(strSample, "$1$2") End With Debug.Print strSample End Sub

Tento postup nahradí ukázkový textový obsah odstraněním mezer z kódů produktů odpovídajících danému vzoru a vytiskne výsledný text v okně Okamžité.

Nahrazený text vytištěný v okně Immediate.

Pamatujte, že vzor se mírně liší od prvního kódu. Termíny v tomto vzoru jsou uzavřeny v závorkách a odpovídající termíny jsou použity v metodě Replace jako $ 1 a $ 2 v pořadí. Tento postup jednoduše spojí dva termíny bez mezer.

Zpět k otázce

Vraťme se k ukázkovému textu, který jsme použili na začátku tohoto článku.

Ukázkový text

Musíme najít „lišku“ následovanou číselnými znaky a změnit shodu pomocí barvy sekce „liška“ v odpovídajícím textu.

Ačkoli RegEx velmi dobře odpovídá danému vzoru, nemůže nahradit barvu textu v dokumentu Word. V následujícím postupu tedy zkombinujeme metody RegEx a Word VBA.

Tady jsou kroky:

  1. Najděte shody s RegEx.
  2. Prohledávejte každý odpovídající text pomocí metody Word Find.
  3. Najděte barvu prvního slova v nalezeném rozsahu.
  4. Změňte barvu nalezeného rozsahu pomocí barvy v předchozím kroku.

Přepněte na VBE a vložte nový modul. Ujistěte se, že je do projektu přidána knihovna regulárních výrazů VBScript a zkopírujte a vložte následující kód do tohoto nového modulu.

Sub doRegexMagic() Dim str As String Dim objRegex As RegExp Dim matches As MatchCollection Dim fnd As Match Set objRegex = New RegExp str = "fox" With Selection .HomeKey wdStory .WholeStory End With With objRegex .Pattern = str & " d+" .Global = True .IgnoreCase = True Set matches = .Execute(Selection.Text) End With With Selection .HomeKey wdStory With .Find .ClearFormatting .Forward = True .Format = False .MatchCase = True For Each fnd In matches .Text = fnd .Execute With Selection .Font.Fill.ForeColor = .Range.Words(1).Font.TextColor .MoveRight wdCharacter End With Next fnd End With .HomeKey wdStory End With End Sub 

Spusťte kód a zde je výsledek.

Výsledek

Stáhnout soubor Word

Stažení souboru Word: how-to-use-regex-in-microsoft-word.docm

RegEx v aplikaci Excel?

Regex v aplikaci Excel zcela chybí. Stále však můžeme používat regulární výrazy VBScript v aplikaci Excel VBA.

Launch Excel, open a new workbook, and create the content as shown below.

Sample data in Excel

Reference

This article has been inspired by Learn Excel 2010 - "Find & Replace Color of A Certain Word": Podcast #1714 published by Bill Jelen on May 21, 2013! So we wanted to use similar sample text as he used in the video. We just added numbers after the "fox".

Switch to VBE, and insert a new module. Make sure VBScript Regular Expressions library is added to the project just like you did in Word, and copy and paste the following code into this new module.

Sub doRegexMagicInExcel() Dim str As String Dim objRegex As RegExp Dim matches As MatchCollection Dim fnd As Match Dim rng As Range Dim cll As Range Set objRegex = New RegExp Set rng = Selection str = "fox" With objRegex .Pattern = "(" & str & ") (d+)" .Global = True .IgnoreCase = True For Each cll In rng.Cells Set matches = .Execute(cll.Value) For Each fnd In matches cll.Value = .Replace(cll.Value, "$1$2") Next fnd Next cll End With End Sub

Return to worksheet, and select the range with sample text. Run the macro, and see the result.

Result in Excel

This procedure loops through the cells in the selected range, replaces the text in the cells by removing the spaces from the product codes matched with the given RegEx pattern.

Download Excel File

To download the Excel file: how-to-use-regex-in-microsoft-excel.xlsm

Zajímavé články...