Lissa vraagt:
Is er een manier om een nummer (altijd een willekeurig nummer) na het woord vos te veranderen? Voorbeeld: vos 23, beer 1, vos 398, kikker 12, vos 15. Ik wil het nummer veranderen in dezelfde kleur als het woord vos.
We kunnen zoeken en vervangen op formaat in Microsoft Word. Dit is een geweldige functie om snel de opgemaakte tekst te vinden en zelfs het volledige tekstformaat in het document te vervangen.
Selecteer Geavanceerd zoeken op het lint.
Voer de tekst in die u wilt zoeken en klik vervolgens op de knop Meer om geavanceerde opties te zien, en klik op de knop Formaat.
Selecteer de optie Lettertype in de instellingen, dan kunt u de tekstkleur instellen die u in het document wilt vinden. Klik op OK om het dialoogvenster Lettertype zoeken te sluiten.
Klik op Volgende zoeken en u zult zien dat de eerste keer dat de gezochte tekst in een bepaalde kleur wordt geselecteerd.
We kunnen ook ingewikkelder zoekopdrachten uitvoeren door jokertekens te gebruiken. Met de native zoekmodule van Word kunnen we echter niet zoeken hoe Lissa het vroeg.
Dat is waar we RegEx in het spel kunnen bellen!
VBSCript reguliere expressies bibliotheek
VBA wordt niet geleverd met ondersteuning voor reguliere expressies. De Microsoft VBScript-bibliotheek bevat echter krachtige mogelijkheden voor reguliere expressies. Deze bibliotheek maakt deel uit van Internet Explorer 5.5 en hoger en is dus beschikbaar op alle computers met Windows XP, Vista, 7, 8, 8.1 of 10.
Mac-gebruikers
Omdat Internet Explorer geen Mac-applicatie is, bestaat deze bibliotheek niet op Mac. Daarom werken onderstaande VBA-voorbeelden niet op Mac.
Om deze bibliotheek in VBA te gebruiken, schakelt u over naar VBE, selecteert u Project en verwijzingen in het VBE-menu, scrolt u naar beneden in de lijst om het item "Microsoft VBScript Regular Expressions 5.5" te vinden en vinkt u dit aan om in de toepassing op te nemen.
Voeg een nieuwe module in en kopieer en plak de volgende code in deze module.
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
Deze procedure neemt de voorbeeldtekst, vindt de productcodes volgens het gegeven patroon - dat begint met "fox", enkele spatie en een cijfer, en drukt de overeenkomende codes af in het onmiddellijke venster (druk op Ctrl + G in VBE als dit niet het geval is) al zichtbaar).
d+
karakterklasse in het patroon definieert een of meer numerieke karakters, en patroon is in feite "vos" voorvoegsel gevolgd door een spatie gevolgd door getallen.
Meer informatie
Bezoek Regular Expression Language - Quick Reference voor meer informatie over character escapes, character classes en anchors.
Kopieer en plak de volgende code om RegEx in actie te zien om de spaties uit productcodes te verwijderen.
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
Deze procedure vervangt de voorbeeldtekstinhoud door de spaties te verwijderen uit de productcodes die overeenkomen met het gegeven patroon, en drukt de resultaattekst af in het venster Onmiddellijk.
Houd er rekening mee dat het patroon iets anders is dan de eerste code. Termen in dit patroon zijn tussen haakjes geplaatst, en overeenkomstige termen worden in de vervangmethode gebruikt als $ 1 en $ 2 in volgorde. Deze procedure voegt de twee termen eenvoudig zonder spaties samen.
Terug naar de vraag
Laten we teruggaan naar de voorbeeldtekst die we aan het begin van dit artikel hebben gebruikt.
We moeten "fox" vinden, gevolgd door numerieke tekens, en de overeenkomst wijzigen door de kleur van de "fox" -sectie in de overeenkomende tekst te gebruiken.
Hoewel RegEx zeer goed overeenkomt met het gegeven patroon, kan het de kleur van tekst in Word-documenten niet vervangen. Dus we zullen RegEx- en Word VBA-methoden combineren in de volgende procedure.
Hier zijn de stappen:
- Zoek de overeenkomsten met RegEx.
- Zoek elke overeenkomende tekst met de methode Woord zoeken.
- Zoek de kleur van het eerste woord in het gevonden bereik.
- Verander de kleur van het gevonden bereik met de kleur in de vorige stap.
Schakel over naar VBE en plaats een nieuwe module. Zorg ervoor dat de VBScript Regular Expressions-bibliotheek aan het project is toegevoegd en kopieer en plak de volgende code in deze nieuwe module.
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
Voer de code uit, en hier is het resultaat.
Download Word-bestand
Om het Word-bestand te downloaden: how-to-use-regex-in-microsoft-word.docm
RegEx in Excel?
Regex ontbreekt volledig in Excel. We kunnen VBScript Regular Expressions echter nog steeds gebruiken in Excel VBA.
Launch Excel, open a new workbook, and create the content as shown below.
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.
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