757 votes

Comment utiliser les expressions régulières (Regex) dans Microsoft Excel à la fois dans une cellule et dans des boucles

Comment puis-je utiliser des expressions régulières dans Excel et profiter de la structure en grille puissante d'Excel pour la manipulation des données?

  • Fonction dans une cellule pour retourner un motif correspondant ou une valeur remplacée dans une chaîne.
  • Procédure pour parcourir une colonne de données et extraire les correspondances dans des cellules adjacentes.
  • Quelle configuration est nécessaire?
  • Quels sont les caractères spéciaux d'Excel pour les expressions régulières?

Je comprends que Regex n'est pas idéal pour de nombreuses situations (Utiliser ou non des expressions régulières?) puisque Excel peut utiliser des commandes de type Left, Mid, Right, Instr pour des manipulations similaires.

18 votes

Je recommande vivement cet article sur les expressions régulières VB/VBA par Patrick Matthews

1 votes

Essayez ce complément gratuit : seotoolsforexcel.com/regexpfind

5 votes

N'oublions pas l'opérateur `Like`, qui fournit une sorte de version allégée de la fonctionnalité de style regex. C'est généralement beaucoup plus rapide que regex, même s'il est enveloppé dans une procédure sub ou function.

1149voto

Portland Runner Points 4941

Expressions régulières sont utilisés pour la correspondance de motifs. Pour les utiliser dans Excel, procédez comme suit.

Étape 1 : Ajouter une référence VBA à "Microsoft VBScript Regular Expressions 5.5".

  • Sélectionnez l'onglet "Développeur" ( Je n'ai pas cet onglet, que dois-je faire ? )
  • Sélectionnez l'icône "Visual Basic" dans la section du ruban "Code".
  • Dans la fenêtre "Microsoft Visual Basic for Applications", sélectionnez "Outils" dans le menu supérieur.
  • Sélectionnez "Références".
  • Cochez la case en regard de "Microsoft VBScript Regular Expressions 5.5" pour l'inclure dans votre classeur.
  • Cliquez sur "OK".

Étape 2 : Définissez votre modèle

Définitions de base :

- Gamme.

  • Par exemple a-z correspond à une lettre minuscule de a à z
  • Par exemple 0-5 correspond à n'importe quel nombre de 0 à 5

[] Faites correspondre exactement un des objets entre ces crochets.

  • Par exemple [a] correspond à la lettre a
  • Par exemple [abc] correspond à une seule lettre qui peut être a, b ou c
  • Par exemple [a-z] correspond à n'importe quelle lettre minuscule de l'alphabet.

() Regroupe les différentes correspondances à des fins de retour. Voir les exemples ci-dessous.

{} Multiplicateur pour les copies répétées du motif défini avant lui.

  • Par exemple [a]{2} correspond à deux lettres minuscules a consécutives : aa
  • Par exemple [a]{1,3} correspond à au moins une et jusqu'à trois lettres minuscules a , aa , aaa

+ Correspond à au moins un, ou plusieurs, des motifs définis avant lui.

  • Par exemple a+ correspondra à des a consécutifs a , aa , aaa et ainsi de suite

? Correspond à zéro ou un des motifs définis avant lui.

  • Par exemple, un motif peut être présent ou non, mais ne peut être apparié qu'une seule fois.
  • Par exemple [a-z]? correspond à une chaîne vide ou à une seule lettre minuscule.

* Correspond à zéro ou plus du motif défini avant lui. - Par exemple, un caractère générique pour un motif qui peut ou non être présent. - Par exemple [a-z]* correspond à une chaîne vide ou à une chaîne de lettres minuscules.

. Correspond à n'importe quel caractère sauf la nouvelle ligne \n

  • Par exemple a. Correspond à une chaîne de deux caractères commençant par a et se terminant par n'importe quoi sauf \n

| Opérateur OR

  • Par exemple a|b signifie soit a ou b peuvent être appariés.
  • Par exemple red|white|orange correspond exactement à l'une des couleurs.

^ opérateur NOT

  • Par exemple [^0-9] le caractère ne peut pas contenir un nombre
  • Par exemple [^aA] le caractère ne peut pas être minuscule a ou majuscule A

\ Échappe le caractère spécial qui suit (remplace le comportement ci-dessus).

  • Par exemple \. , \\ , \( , \? , \$ , \^

Modèles d'ancrage :

^ La correspondance doit se produire au début de la chaîne

  • Par exemple ^a Le premier caractère doit être une lettre minuscule a
  • Par exemple ^[0-9] Le premier caractère doit être un chiffre.

$ La correspondance doit se produire à la fin de la chaîne

  • Par exemple a$ Le dernier caractère doit être une lettre minuscule a

Tableau de priorité :

Order  Name                Representation
1      Parentheses         ( )
2      Multipliers         ? + * {m,n} {m, n}?
3      Sequence & Anchors  abc ^ $
4      Alternation         |

Abréviations de caractères prédéfinis :

abr    same as       meaning
\d     [0-9]         Any single digit
\D     [^0-9]        Any single character that's not a digit
\w     [a-zA-Z0-9_]  Any word character
\W     [^a-zA-Z0-9_] Any non-word character
\s     [ \r\t\n\f]   Any space character
\S     [^ \r\t\n\f]  Any non-space character
\n     [\n]          New line

Exemple 1 : Exécuter en tant que macro

L'exemple de macro suivant examine la valeur de la cellule A1 pour voir si les 1 ou 2 premiers caractères sont des chiffres. Si c'est le cas, ils sont supprimés et le reste de la chaîne est affiché. Si ce n'est pas le cas, une boîte apparaît pour vous dire qu'aucune correspondance n'a été trouvée. Cellule A1 valeurs de 12abc retournera abc , la valeur de 1abc retournera abc , la valeur de abc123 renverra "Not Matched" parce que les chiffres ne sont pas au début de la chaîne.

Private Sub simpleRegex()
    Dim strPattern As String: strPattern = "^[0-9]{1,2}"
    Dim strReplace As String: strReplace = ""
    Dim regEx As New RegExp
    Dim strInput As String
    Dim Myrange As Range

    Set Myrange = ActiveSheet.Range("A1")

    If strPattern <> "" Then
        strInput = Myrange.Value
        strReplace = ""

        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = strPattern
        End With

        If regEx.Test(strInput) Then
            MsgBox (regEx.Replace(strInput, strReplace))
        Else
            MsgBox ("Not matched")
        End If
    End If
End Sub

Exemple 2 : Exécuter comme une fonction dans la cellule

Cet exemple est le même que l'exemple 1, mais il est configuré pour être exécuté comme une fonction dans la cellule. Pour l'utiliser, changez le code en ceci :

Function simpleCellRegex(Myrange As Range) As String
    Dim regEx As New RegExp
    Dim strPattern As String
    Dim strInput As String
    Dim strReplace As String
    Dim strOutput As String

    strPattern = "^[0-9]{1,3}"

    If strPattern <> "" Then
        strInput = Myrange.Value
        strReplace = ""

        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = strPattern
        End With

        If regEx.test(strInput) Then
            simpleCellRegex = regEx.Replace(strInput, strReplace)
        Else
            simpleCellRegex = "Not matched"
        End If
    End If
End Function

Placez vos chaînes ("12abc") dans la cellule A1 . Entrez cette formule =simpleCellRegex(A1) en cellule B1 et le résultat sera "abc".

enter image description here


Exemple 3 : Gamme Loop Through

Cet exemple est identique à l'exemple 1, mais boucle sur une plage de cellules.

Private Sub simpleRegex()
    Dim strPattern As String: strPattern = "^[0-9]{1,2}"
    Dim strReplace As String: strReplace = ""
    Dim regEx As New RegExp
    Dim strInput As String
    Dim Myrange As Range

    Set Myrange = ActiveSheet.Range("A1:A5")

    For Each cell In Myrange
        If strPattern <> "" Then
            strInput = cell.Value
            strReplace = ""

            With regEx
                .Global = True
                .MultiLine = True
                .IgnoreCase = False
                .Pattern = strPattern
            End With

            If regEx.Test(strInput) Then
                MsgBox (regEx.Replace(strInput, strReplace))
            Else
                MsgBox ("Not matched")
            End If
        End If
    Next
End Sub

Exemple 4 : Séparation de différents motifs

Cet exemple parcourt en boucle une plage ( A1 , A2 & A3 ) et recherche une chaîne commençant par trois chiffres, suivie d'un seul caractère alphabétique, puis de quatre chiffres. La sortie sépare les correspondances de motifs dans des cellules adjacentes en utilisant l'attribut () . $1 représente le premier modèle correspondant dans le premier ensemble de () .

Private Sub splitUpRegexPattern()
    Dim regEx As New RegExp
    Dim strPattern As String
    Dim strInput As String
    Dim strReplace As String
    Dim Myrange As Range

    Set Myrange = ActiveSheet.Range("A1:A3")

    For Each C In Myrange
        strPattern = "(^[0-9]{3})([a-zA-Z])([0-9]{4})"

        If strPattern <> "" Then
            strInput = C.Value
            strReplace = "$1"

            With regEx
                .Global = True
                .MultiLine = True
                .IgnoreCase = False
                .Pattern = strPattern
            End With

            If regEx.test(strInput) Then
                C.Offset(0, 1) = regEx.Replace(strInput, "$1")
                C.Offset(0, 2) = regEx.Replace(strInput, "$2")
                C.Offset(0, 3) = regEx.Replace(strInput, "$3")
            Else
                C.Offset(0, 1) = "(Not matched)"
            End If
        End If
    Next
End Sub

Résultats :

enter image description here


Exemples de motifs supplémentaires

String   Regex Pattern                  Explanation
a1aaa    [a-zA-Z][0-9][a-zA-Z]{3}       Single alpha, single digit, three alpha characters
a1aaa    [a-zA-Z]?[0-9][a-zA-Z]{3}      May or may not have preceeding alpha character
a1aaa    [a-zA-Z][0-9][a-zA-Z]{0,3}     Single alpha, single digit, 0 to 3 alpha characters
a1aaa    [a-zA-Z][0-9][a-zA-Z]*         Single alpha, single digit, followed by any number of alpha characters

</i8>    \,\/[a-zA-Z][0-9]\>            Exact non-word character except any single alpha followed by any single digit

36 votes

Vous ne devriez pas oublier de Set regEx = Rien. Vous obtiendrez des exceptions de mémoire insuffisante, lorsque cette Sub est exécutée assez fréquemment.

1 votes

J'ai adapté l'exemple 4 avec SubMatches pour traiter des expressions régulières plus complexes, je n'utilise essentiellement pas de remplacement lors de la séparation, si quelqu'un est intéressé: stackoverflow.com/questions/30218413/…

18 votes

Ligne de liaison tardive : Définissez regEx = CreateObject("VBScript.RegExp")

243voto

Patrick Böker Points 2860

Pour utiliser les expressions régulières directement dans les formules Excel, la fonction définie par l'utilisateur suivante peut être utile. Elle expose plus ou moins directement la fonctionnalité des expressions régulières en tant que fonction Excel.

Comment ça marche

Elle prend 2-3 paramètres.

  1. Un texte sur lequel utiliser l'expression régulière.
  2. Une expression régulière.
  3. Une chaîne de format spécifiant l'apparence souhaitée du résultat. Elle peut contenir $0, $1, $2, et ainsi de suite. $0 est la correspondance entière, $1 et suivants correspondent aux groupes de correspondance respectifs dans l'expression régulière. Par défaut, $0.

Quelques exemples

Extraction d'une adresse e-mail:

=regex("Peter Gordon: some@email.com, 47", "\w+@\w+\.\w+")
=regex("Peter Gordon: some@email.com, 47", "\w+@\w+\.\w+", "$0")

Résultat: some@email.com

Extraction de plusieurs sous-chaînes:

=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "E-Mail: $2, Name: $1")

Résultat: E-Mail: some@email.com, Name: Peter Gordon

Pour décomposer une chaîne combinée dans une cellule en ses composants dans plusieurs cellules:

=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "$" & 1)
=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "$" & 2)

Résultat: Peter Gordon some@email.com ...

Comment l'utiliser

Pour utiliser cette fonction définie par l'utilisateur, suivez les étapes suivantes (basées approximativement sur cette page Microsoft. Ils ont quelques bonnes informations supplémentaires là-bas!) :

  1. Dans Excel dans un fichier activé pour les macros ('.xlsm'), appuyez sur ALT+F11 pour ouvrir l'Éditeur Visual Basic for Applications.

  2. Ajoutez une référence VBA à la bibliothèque Expressions Régulières (honteusement copiée depuis la réponse de Portland Runners++):

    1. Cliquez sur Outils -> Références (veuillez excuser la capture d'écran en allemand) Outils -> Références
    2. Repérez Expressions Régulières VBScript Microsoft 5.5 dans la liste et cochez la case à côté.
    3. Cliquez sur OK.
  3. Cliquez sur Insérer un Module. Si vous donnez un nom différent à votre module, assurez-vous que le Module n'a pas le même nom que la fonction ci-dessous (par exemple, si vous nommez le Module Regex et la fonction regex, cela provoque des erreurs #NOM!).

    Deuxième icône dans la rangée d'icônes -> Module

  4. Dans la grande fenêtre de texte au milieu, insérez ce qui suit:

    Function regex(strInput As String, matchPattern As String, Optional ByVal outputPattern As String = "$0") As Variant
        Dim inputRegexObj As New VBScript_RegExp_55.RegExp, outputRegexObj As New VBScript_RegExp_55.RegExp, outReplaceRegexObj As New VBScript_RegExp_55.RegExp
        Dim inputMatches As Object, replaceMatches As Object, replaceMatch As Object
        Dim replaceNumber As Integer
    
        With inputRegexObj
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = matchPattern
        End With
        With outputRegexObj
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = "\$(\d+)"
        End With
        With outReplaceRegexObj
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
        End With
    
        Set inputMatches = inputRegexObj.Execute(strInput)
        If inputMatches.Count = 0 Then
            regex = False
        Else
            Set replaceMatches = outputRegexObj.Execute(outputPattern)
            For Each replaceMatch In replaceMatches
                replaceNumber = replaceMatch.SubMatches(0)
                outReplaceRegexObj.Pattern = "\$" & replaceNumber
    
                If replaceNumber = 0 Then
                    outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).Value)
                Else
                    If replaceNumber > inputMatches(0).SubMatches.Count Then
                        'regex = "A to high $ tag found. Largest allowed is $" & inputMatches(0).SubMatches.Count & "."
                        regex = CVErr(xlErrValue)
                        Exit Function
                    Else
                        outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).SubMatches(replaceNumber - 1))
                    End If
                End If
            Next
            regex = outputPattern
        End If
    End Function
  5. Enregistrez et fermez la fenêtre de l'Éditeur Visual Basic for Applications.

7 votes

Cette réponse combinée avec les étapes ici pour créer un complément, a été très utile. Merci. Assurez-vous de ne pas donner le même nom à votre module et à votre fonction !

2 votes

Just reiterating the comment above from Chris Hunt. Don't call your Module 'Regex' as well. Thought I was going mad for a while as the function wouldn't work due to a #NAME error

0 votes

Eh bien, je suis devenu fou en essayant de tout (y compris en changeant de modules / noms) et en obtenant toujours l'erreur #NAME >_> i.imgur.com/UUQ6eCi.png

98voto

SAm Points 1846

En développant la réponse de patszim sur Stack Overflow pour ceux qui sont pressés.

  1. Ouvrez le classeur Excel.

  2. Alt+F11 pour ouvrir la fenêtre VBA/Macros.

  3. Ajoutez une référence à regex sous Outils puis Références
    [![Excel VBA Form add references](https://i.sstatic.net/sKCdA.png)

  4. en sélectionnant Microsoft VBScript Regular Expression 5.5
    [![Excel VBA add regex reference](https://i.sstatic.net/nmSgP.png)

  5. Insérez un nouveau module (le code doit résider dans le module sinon cela ne fonctionne pas).
    [![Excel VBA insert code module](https://i.sstatic.net/RaLQ0.png)

  6. Dans le module nouvellement inséré,
    [![Excel VBA insert code into module](https://i.sstatic.net/DFJ7F.png)

  7. ajoutez le code suivant:

    Function RegxFunc(strInput As String, regexPattern As String) As String
        Dim regEx As New RegExp
        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .pattern = regexPattern
        End With
    
        If regEx.Test(strInput) Then
            Set matches = regEx.Execute(strInput)
            RegxFunc = matches(0).Value
        Else
            RegxFunc = "non trouvé"
        End If
    End Function
  8. Le motif regex est placé dans l'une des cellules et l'adressage absolu est utilisé dessus. [![Excel regex function in-cell usage](https://i.sstatic.net/XnS6t.png) La fonction sera liée au classeur dans lequel elle est créée.
    Si elle doit être utilisée dans différents classeurs, stockez la fonction dans Personal.XLSB

4 votes

Merci d'avoir mentionné qu'il doit être dans Personal.xlsb pour être disponible dans tous les documents Excel sur lesquels vous travaillez. La plupart des autres réponses ne précisent pas cela. Personal.XLSB irait dans le dossier (peut-être besoin de créer le dossier) C:\Utilisateurs\nom d'utilisateur\AppData\Local\Microsoft\Excel\XLStart.

0 votes

J'ai choisi cette approche. Cependant, j'ai un problème avec Office 365. J'ai remarqué que, si j'ouvre le fichier xlsm un autre jour, les formules avec RegxFunc affichent #NOM. En fait, pour contourner ce problème, je dois recréer le fichier. Des suggestions?

0 votes

@HoRn #Name? Vous voudrez peut-être essayer cette réponse, stackoverflow.com/a/18841575/1699071. Il indique que le nom de la fonction et le nom du module étaient les mêmes. La solution était de renommer soit le nom du module, soit le nom de la fonction. D'autres publications sur la même page pourraient également aider.

33voto

Vikas Gautam Points 876

Voici ma tentative :

Function RegParse(ByVal pattern As String, ByVal html As String)
    Dim regex   As RegExp
    Set regex = New RegExp

    With regex
        .IgnoreCase = True  'ignorer les cas pendant que le moteur regex effectue la recherche.
        .pattern = pattern  'déclaration du modèle regex.
        .Global = False     'restreindre regex à trouver uniquement la première correspondance.

        If .Test(html) Then         'Tester si le motif correspond ou non
            mStr = .Execute(html)(0)        '.Execute(html)(0) fournira la chaîne qui correspond à Regex
            RegParse = .Replace(mStr, "$1") '.La fonction Replace remplacera la chaîne par ce qui se trouve entre les premières accolades - $1.
        Else
            RegParse = "#N/A"
        End If 
    End With
End Function

33voto

Alex Roseland Points 31

Ceci n'est pas une réponse directe mais peut offrir une alternative plus efficace à considérer. En effet, Google Sheets dispose de plusieurs fonctions Regex intégrées qui peuvent être très pratiques et aider à contourner certaines des procédures techniques dans Excel. Bien sûr, il y a des avantages à utiliser Excel sur votre PC, mais pour la grande majorité des utilisateurs, Google Sheets offrira une expérience identique et pourrait offrir des avantages en termes de portabilité et de partage de documents.

Elles offrent :

REGEXEXTRACT: Extrait des sous-chaînes correspondantes selon une expression régulière.

REGEXREPLACE: Remplace une partie d'une chaîne de texte par une autre chaîne de texte en utilisant des expressions régulières.

SUBSTITUTE: Remplace du texte existant par un nouveau texte dans une chaîne.

REPLACE: Remplace une partie d'une chaîne de texte par une autre chaîne de texte.

Vous pouvez les saisir directement dans une cellule comme ceci et elles produiront ce que vous souhaitez :

=REGEXMATCH(A2, "[0-9]+")

Elles fonctionnent également très bien en combinaison avec d'autres fonctions telles que les instructions SI comme ceci :

=SI(REGEXMATCH(E8,"MiB"),REGEXEXTRACT(E8,"\d*\.\d*|\d*")/1000,SI(REGEXMATCH(E8,"GiB"),REGEXEXTRACT(E8,"\d*\.\d*|\d*"),"")

description de l'image

En espérant que cela offre une solution de contournement simple pour les utilisateurs qui se sentent intimidés par la composante VBS d'Excel.

7 votes

Merci de partager Alex. Ceci est utile pour ceux qui recherchent la version Google. Vous pourriez envisager d'écrire et de répondre à une autre question spécifique à Google Sheets Regex car elle a sa propre terminologie et serait très utile pour les autres. Quoi qu'il en soit, vous avez mon vote positif!

0 votes

Pouvez-vous créer un module qui prend en charge la syntaxe google exactement dans Excel?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X