Comment puis-je utiliser des expressions régulières dans Excel et profiter de la puissante configuration de type grille d'Excel pour la manipulation des données?
- Fonction dans la cellule pour renvoyer un modèle correspondant ou une valeur remplacée dans une chaîne.
- Sub pour parcourir une colonne de données et extraire les correspondances avec les cellules adjacentes.
- Quelle configuration est nécessaire?
- Quels sont les caractères spéciaux d'Excel pour les expressions régulières?
Je comprends Regex n'est pas idéal pour de nombreuses situations ( à utiliser ou ne pas utiliser des expressions régulières? ) Car Excel peut utiliser Left
, Mid
, Right
, Instr
commandes de type pour des manipulations similaires.
Like
opérateur , qui fournit une sorte de version allégée des fonctionnalités de style regex. Il est généralement beaucoup plus rapide que l'expression régulière, même s'il est encapsulé dans une procédure de sous-fonction ou de fonction.Réponses:
Les expressions régulières sont utilisées pour la correspondance de motifs.
Pour utiliser dans Excel, procédez comme suit:
Étape 1 : ajouter une référence VBA à «Microsoft VBScript Regular Expressions 5.5»
Étape 2 : définissez votre modèle
Définitions basiques:
-
Intervalle.a-z
correspond à des lettres minuscules de a à z0-5
correspond à n'importe quel nombre de 0 à 5[]
Faites correspondre exactement l'un des objets à l'intérieur de ces crochets.[a]
correspond à la lettre a[abc]
correspond à une seule lettre qui peut être a, b ou c[a-z]
correspond à n'importe quelle lettre minuscule de l'alphabet.()
Regroupe différents matchs à des fins de retour. Voir les exemples ci-dessous.{}
Multiplicateur pour les copies répétées du motif défini avant lui.[a]{2}
correspond à deux lettres minuscules consécutives a:aa
[a]{1,3}
correspond à au moins un et jusqu'à trois lettres minusculesa
,aa
,aaa
+
Faites correspondre au moins un ou plusieurs des motifs définis avant lui.a+
correspondra à un consécutive dea
,aa
,aaa
, etc.?
Faites correspondre zéro ou l'un des motifs définis avant lui.[a-z]?
correspond à une chaîne vide ou à n'importe quelle lettre minuscule.*
Faites correspondre zéro ou plus du motif défini avant lui. - Par exemple, Wildcard 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
a.
correspond à une chaîne de deux caractères commençant par un et se terminant par tout sauf\n
|
Opérateur OUa|b
signifie soita
oub
peut être apparié.red|white|orange
correspond exactement à l'une des couleurs.^
PAS opérateur[^0-9]
caractère ne peut pas contenir de nombre[^aA]
caractère ne peut pas être en minusculea
ou en majusculeA
\
Échappe le caractère spécial qui suit (remplace le comportement ci-dessus)\.
,\\
,\(
,\?
,\$
,\^
Modèles d'ancrage:
^
La correspondance doit se produire au début de la chaîne^a
premier caractère doit être une lettre minusculea
^[0-9]
premier caractère doit être un nombre.$
La correspondance doit se produire à la fin de la chaînea$
dernier caractère doit être une lettre minusculea
Tableau de priorité:
Abréviations de caractères prédéfinies:
Exemple 1 : exécuter en tant que macro
L'exemple de macro suivant examine la valeur dans la cellule
A1
pour voir si les 1 ou 2 premiers caractères sont des chiffres. Si tel est le cas, ils sont supprimés et le reste de la chaîne s'affiche. Sinon, une boîte apparaît vous indiquant qu'aucune correspondance n'est trouvée. LesA1
valeurs de cellule de12abc
renverrontabc
, la valeur de1abc
renverraabc
, la valeur deabc123
renverra "Non apparié" car les chiffres n'étaient pas au début de la chaîne.Exemple 2 : exécuter en tant que fonction dans la cellule
Cet exemple est le même que l'exemple 1 mais est configuré pour s'exécuter en tant que fonction dans la cellule. Pour l'utiliser, changez le code en ceci:
Placez vos cordes ("12abc") dans la cellule
A1
. Entrez cette formule=simpleCellRegex(A1)
dans la celluleB1
et le résultat sera "abc".Exemple 3 : boucle à travers la plage
Cet exemple est le même que l'exemple 1, mais il parcourt une plage de cellules.
Exemple 4 : séparation de différents motifs
Cet exemple parcourt une plage (
A1
,A2
&A3
) et recherche une chaîne commençant par trois chiffres suivis d'un seul caractère alpha, puis de 4 chiffres. La sortie sépare la correspondance des motifs en cellules adjacentes à l'aide de la()
.$1
représente le premier motif correspondant dans le premier ensemble de()
.Résultats:
Exemples de modèles supplémentaires
la source
Set regEx = Nothing
. Vous obtiendrez des exceptions de mémoire insuffisante lorsque ce sous-programme sera exécuté fréquemment.Set regEx = CreateObject("VBScript.RegExp")
ThisWorkbook
. Essayez de déplacer le code dans un autreModule
.Pour utiliser des expressions régulières directement dans des formules Excel, l'UDF (fonction définie par l'utilisateur) suivante peut être utile. Il expose plus ou moins directement la fonctionnalité d'expression régulière en tant que fonction Excel.
Comment ça fonctionne
Cela prend 2-3 paramètres.
$0
,$1
,$2
et ainsi de suite.$0
correspond à l'intégralité de la correspondance$1
et correspond aux groupes de correspondance respectifs dans l'expression régulière. Par défaut à$0
.Quelques exemples
Extraire une adresse e-mail:
Résulte en:
[email protected]
Extraire plusieurs sous-chaînes:
Résulte en:
E-Mail: [email protected], Name: Peter Gordon
Pour démonter une chaîne combinée dans une seule cellule en ses composants dans plusieurs cellules:
Résultats en:
Peter Gordon
[email protected]
...Comment utiliser
Pour utiliser cet UDF, procédez comme suit (basé sur cette page Microsoft . Ils contiennent de bonnes informations supplémentaires!):
ALT+F11
pour ouvrir l' éditeur Microsoft Visual Basic pour Applications .Cliquez sur Insérer un module . Si vous donnez à votre module un nom différent, assurez-vous que le module n'a pas le même nom que l'UDF ci-dessous (par exemple, nommer le module
Regex
et la fonctionregex
provoque des erreurs #NAME! ).Dans la grande fenêtre de texte au milieu, insérez ce qui suit:
Enregistrez et fermez la fenêtre Microsoft Visual Basic pour Applications Editor.
la source
Function foo() As Variant \n foo="Hello World" \n End Function
UDF minimal pour voir si cela fonctionne. Si oui, progressez jusqu'à la chose ci-dessus, si rien de basique n'est cassé (macros désactivées?).Élargir la réponse de Patszim pour ceux qui sont pressés.
ajoutez le code suivant:
Le motif d'expression régulière est placé dans l'une des cellules et un référencement absolu est utilisé dessus. La fonction sera liée au classeur dans lequel elle a été créée.
S'il est nécessaire de l'utiliser dans différents classeurs, stockez la fonction dans Personal.XLSB
la source
Voici ma tentative:
la source
J'avais besoin de l'utiliser comme fonction de cellule (comme
SUM
ouVLOOKUP
) et j'ai trouvé qu'il était facile de:Créez la fonction suivante dans le classeur ou dans son propre module:
Ensuite, vous pouvez utiliser dans la cellule avec
=REGPLACE(B1, "(\w) (\d+)", "$1$2")
(ex: "A 243" à "A243")la source
Ce n'est pas une réponse directe mais peut fournir une alternative plus efficace pour votre considération. Ce qui est que Google Sheets a plusieurs fonctions Regex intégrées, celles-ci peuvent être très pratiques et aider à contourner certaines des procédures techniques dans Excel. Évidemment, l'utilisation d'Excel sur votre PC présente certains avantages, mais pour la grande majorité des utilisateurs, Google Sheets offrira une expérience identique et peut offrir certains avantages en termes de portabilité et de partage de documents.
Ils offrent
REGEXEXTRACT: extrait les sous-chaînes correspondantes selon une expression régulière.
REGEXREPLACE: remplace une partie d'une chaîne de texte par une chaîne de texte différente à l'aide d'expressions régulières.
SUBSTITUTE: remplace le texte existant par un nouveau texte dans une chaîne.
REMPLACER: remplace une partie d'une chaîne de texte par une chaîne de texte différente.
Vous pouvez les taper directement dans une cellule comme ça et produire ce que vous voulez
Ils fonctionnent également très bien en combinaison avec d'autres fonctions telles que les instructions IF comme ceci:
Espérons que cela fournira une solution de contournement simple aux utilisateurs qui se sentent raillés par le composant VBS d'Excel.
la source
Voici une
regex_subst()
fonction. Exemples:Voici le code simplifié (plus simple pour moi, en tout cas). Je ne pouvais pas comprendre comment créer un modèle de sortie approprié en utilisant ce qui précède pour fonctionner comme mes exemples:
la source
Je ne veux pas avoir à activer une bibliothèque de référence car j'ai besoin que mes scripts soient portables. La
Dim foo As New VBScript_RegExp_55.RegExp
ligne a causé desUser Defined Type Not Defined
erreurs, mais j'ai trouvé une solution qui fonctionnait pour moi.Ce que vous voudrez faire est de mettre un exemple de chaîne dans une cellule
A1
, puis de tester votrestrPattern
. Une fois que cela fonctionne, ajustez-lerng
comme vous le souhaitez.la source
VBScript_RegExp_55
bibliothèque est à peu près omniprésente et comporte donc un très faible risque de ne pas être sur une machine cible particulière. Et de toute façon, le passage de Early Bound à Late Bound ne résout pas le problème de portabilité (le code sera toujours en erreur, uniquement au moment de l'exécution plutôt qu'au moment de la compilation)Pour ajouter au contenu précieux, je voudrais créer ce rappel sur pourquoi parfois RegEx dans VBA n'est pas idéal. Toutes les expressions ne sont pas prises en charge, mais peuvent au lieu de cela jeter un
Error 5017
et laisser l'auteur deviner (dont je suis moi-même victime).Bien que nous puissions trouver des sources sur ce qui est pris en charge, il serait utile de savoir quels métacaractères, etc. ne sont pas pris en charge. Une explication plus approfondie peut être trouvée ici . Mentionné dans cette source:
Donc, non pris en charge:
\A
, utilisez également le^
curseur pour faire correspondre la position avant le 1er caractère de la chaîne\Z
, utilisez alternativement le$
signe dollar pour faire correspondre la position après le dernier caractère de la chaîne(?<=a)b
(tandis que LookAhead positif est pris en charge)(?<!a)b
(tandis que LookAhead négatif est pris en charge)\{uFFFF}
/i
(respect de la casse) ou/g
(global) etc. Définissez-les via lesRegExp
propriétés de l' objet>RegExp.Global = True
etRegExp.IgnoreCase = True
si disponibles.'
commentaires réguliers dans le scriptJ'ai déjà frappé un mur plus d'une fois en utilisant des expressions régulières dans VBA. Habituellement avec
LookBehind
mais parfois j'oublie même les modificateurs. Je n'ai pas moi-même expérimenté tous ces décors mentionnés ci-dessus, mais j'ai pensé que j'essaierais d'être détaillé en me référant à des informations plus approfondies. N'hésitez pas à commenter / corriger / ajouter. Grand merci à regular-expressions.info pour une mine d'informations.PS Vous avez mentionné les méthodes et fonctions VBA habituelles, et je peux confirmer qu'elles (au moins pour moi) ont été utiles à leur manière là où RegEx échouerait.
la source