Comment puis-je obtenir le support de regex dans excel via une fonction, ou une fonction personnalisée?
il apparaît que regex (comme dans les expressions régulières) n'est pas supporté dans excel, sauf via VBA. Est-ce que c'est le cas, et si c'est le cas, y a-t-il des fonctions VBA personnalisées "open source" qui prennent en charge regex? Dans ce cas, je cherche à extraire un motif complexe au sein d'une chaîne, mais toute implémentation d'une fonction VBA personnalisée qui exposerait le support de regex au sein de la fonction elle-même serait utile. Si vous connaissez des fonctions semi-liées telles que fonction, de sentir de sentir à commenter, même si je suis je suis vraiment à la recherche d'une implémentation complète d'expression régulière qui soit exposée via des fonctions. Peut-être même ouvert à une rémunération pour l'utilisation de compléments si la mise en œuvre est bonne.
aussi, juste un avertissement que J'utilise Office 2010 sur Windows 7; ajouté cette information après une réponse qui semble être une grande suggestion s'est avéré ne pas fonctionner sur Office 2010.
si vous avez des questions, veuillez les commenter.
6 réponses
rien n'est intégré dans Excel. VBScript a un support intégré et peut être appelé depuis VBA. Plus d'infos disponible ici. Vous pouvez appeler l'objet en utilisant late binding dans VBA. J'ai inclus quelques fonctions que j'ai créé récemment. Veuillez noter qu'elles ne sont pas bien testé et peut avoir quelques bugs, mais ils sont assez simple.
Cela devrait au moins vous aider à démarrer:
'---------------------------------------------------------------------------------------vv
' Procedure : RegEx
' Author : Mike
' Date : 9/1/2010
' Purpose : Perform a regular expression search on a string and return the first match
' or the null string if no matches are found.
' Usage : If Len(RegEx("\d{1,2}[/-]\d{1,2}[/-]\d{2,4}", txt)) = 0 Then MsgBox "No date in " & txt
' : TheDate = RegEx("\d{1,2}[/-]\d{1,2}[/-]\d{2,4}", txt)
' : CUSIP = Regex("[A-Za-z0-9]{8}[0-9]",txt)
'---------------------------------------------------------------------------------------
'^^
Function RegEx(Pattern As String, TextToSearch As String) As String 'vv
Dim RE As Object, REMatches As Object
Set RE = CreateObject("vbscript.regexp")
With RE
.MultiLine = False
.Global = False
.IgnoreCase = False
.Pattern = Pattern
End With
Set REMatches = RE.Execute(TextToSearch)
If REMatches.Count > 0 Then
RegEx = REMatches(0)
Else
RegEx = vbNullString
End If
End Function '^^
'---------------------------------------------------------------------------------------
' Procedure : RegExReplace
' Author : Mike
' Date : 11/4/2010
' Purpose : Attempts to replace text in the TextToSearch with text and back references
' from the ReplacePattern for any matches found using SearchPattern.
' Notes - If no matches are found, TextToSearch is returned unaltered. To get
' specific info from a string, use RegExExtract instead.
' Usage : ?RegExReplace("(.*)(\d{3})[\)\s.-](\d{3})[\s.-](\d{4})(.*)", "My phone # is 570.555.1234.", "()-")
' My phone # is (570)555-1234.
'---------------------------------------------------------------------------------------
'
Function RegExReplace(SearchPattern As String, TextToSearch As String, ReplacePattern As String, _
Optional GlobalReplace As Boolean = True, _
Optional IgnoreCase As Boolean = False, _
Optional MultiLine As Boolean = False) As String
Dim RE As Object
Set RE = CreateObject("vbscript.regexp")
With RE
.MultiLine = MultiLine
.Global = GlobalReplace
.IgnoreCase = IgnoreCase
.Pattern = SearchPattern
End With
RegExReplace = RE.Replace(TextToSearch, ReplacePattern)
End Function
'---------------------------------------------------------------------------------------
' Procedure : RegExExtract
' Author : Mike
' Date : 11/4/2010
' Purpose : Extracts specific information from a string. Returns empty string if not found.
' Usage : ?RegExExtract("(.*)(\d{3})[\)\s.-](\d{3})[\s.-](\d{4})(.*)", "My phone # is 570.555.1234.", "")
' 5705551234
' ?RegExExtract("(.*)(\d{3})[\)\s.-](\d{3})[\s.-](\d{4})(.*)", "My name is Mike.", "")
'
' ?RegExReplace("(.*)(\d{3})[\)\s.-](\d{3})[\s.-](\d{4})(.*)", "My name is Mike.", "")
' My name is Mike.
'---------------------------------------------------------------------------------------
'
Function RegExExtract(SearchPattern As String, TextToSearch As String, PatternToExtract As String, _
Optional GlobalReplace As Boolean = True, _
Optional IgnoreCase As Boolean = False, _
Optional MultiLine As Boolean = False) As String
Dim MatchFound As Boolean
MatchFound = Len(RegEx(SearchPattern, TextToSearch)) > 0
If MatchFound Then
RegExExtract = RegExReplace(SearchPattern, TextToSearch, PatternToExtract, _
GlobalReplace, IgnoreCase, MultiLine)
Else
RegExExtract = vbNullString
End If
End Function
Voici un post concernant l'utilisation de Regex dans Excel:
http://mathfest.blogspot.com/2010/03/regular-expressions-in-excel.html
j'Espère que ça aide.
et un autre qui utilise Python et IronSpread
http://mathfest.blogspot.ca/2012/06/using-ironspread-and-regular.html
l'utilisation regexp dans les fonctions est incluse dans OpenOffice / LibreOffice Calc. Pour l'activer, cliquez sur Outils > Options > Calc > Calculez: Y = Activer les Expressions Régulières dans les Formules. J'ai utilisé à de nombreuses reprises.
j'ai essayé quelques solutions et compte tenu de mon manque d'expertise sur la VBA, j'ai trouvé la plupart d'entre elles trop encombrantes pour moi. Le plus facile que j'ai trouvé était SeoTools pour Excel (http://nielsbosma.se/projects/seotools/). Ça a marché comme un charme pour moi.
- - - fév 2014 - - -
Juste pour donner une alternative, à la fois Open Office et Libre Office Calc logiciel (tableur nom) permettent d'expressions régulières dans leur fonctionnalité de recherche.
j'ai récemment eu la même question exacte et après avoir lutté avec la création de mes propres outils et de les faire fonctionner correctement, j'ai trouvé un grand ADDIN en ligne qui est très facile à utiliser.
ceci est l'extrait du créateur
Pour mon stage au cours des derniers mois, j'ai travaillé dans le Département des sciences du Marketing et une partie de mon travail a été d'obtenir données dans MS Access et générer des rapports. Cela implique d'obtenir listes de prospects de divers sources de données. Il était généralement un assez simple exploit, impliquant une base de requêtes SQL. Cependant, parfois, on me donnait des données comme des adresses qui ne correspondaient à aucune format standard utilisé par elle. Dans le pire des cas, les données ont été fournies dans un pdf qui signifiait que je ne pouvais l'exporter qu'à un fichier texte non délimité. J'ai trouvé que j'avais vraiment besoin d'un couple générique de l'expression régulière fonctions pour analyser les champs à importer dans MS Access. J'ai trouvé quelques .xla exemples en ligne, mais je voulais vraiment un plus facile à utiliser, plus bibliothèque complète et portable. J'ai également voulu inclure quelques notions de base les modèles de sorte qu'il n'était pas nécessaire de ré-inventer la roue à chaque fois.
ainsi, j'ai créé un simple Excel Add-In Des Expressions régulières.xla qui ajoute plusieurs fonctions personnalisées pour mettre en œuvre le standard VBScript régulier expression.
Ici site web
Je l'ai utilisé avec succès pour extraire du texte utile en utilisant regex.
voici le code dans l'addin
' Regular Expressions.xla
'
' ? 2010 Malcolm Poindexter
' This is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License
' as published by the Free Software Foundation, version 3.
' This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
' without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
' See the GNU General Public License for more details. http://www.gnu.org/licenses/gpl.html
'
' I would appreciate if you would notify me of any modifications or re-distributions of this code at contact@malcolmp.com
' and appropriately attribute me as the original author in the header.
' ------------------------------------------------------------------------------------------------------------------------
'
' This file provides an Excel Add-In containing regular expression processing functions and several pre-defined regular expressions.
' The regular expressions provided are not necessarially exhaustive, but are intended to cover the most common cases.
'
' Regular Expressions Syntax: http://msdn.microsoft.com/en-us/library/1400241x%28VS.85%29.aspx
' -----------------------------
' NAME: xREPLACE
' DESCRIPTION: Replace all portions of the search text matching the pattern with the replacement text.
' -----------------------------
Function xREPLACE(pattern As String, searchText As String, replacementText As String, Optional ignoreCase As Boolean = True) As String
On Error Resume Next
Dim RegEx As New RegExp
RegEx.Global = True
RegEx.MultiLine = True
RegEx.pattern = pattern
RegEx.ignoreCase = ignoreCase
xREPLACE = RegEx.Replace(searchText, replacementText)
End Function
' -----------------------------
' NAME: xMATCHES
' DESCRIPTION: Find and return the number of matches to a pattern in the search text.
' -----------------------------
Function xMATCHES(pattern As String, searchText As String, Optional ignoreCase As Boolean = True) As String
On Error Resume Next
Dim RegEx As New RegExp
RegEx.Global = True
RegEx.MultiLine = True
RegEx.pattern = pattern
RegEx.ignoreCase = ignoreCase
Dim matches As MatchCollection
Set matches = RegEx.Execute(searchText)
xMATCHES = matches.Count
End Function
' -----------------------------
' NAME: xMATCH
' DESCRIPTION: Find and return an instance of a match to the pattern in the search text. MatchIndex may be used in the case of multiple matches.
' -----------------------------
Function xMATCH(pattern As String, searchText As String, Optional matchIndex As Integer = 1, _
Optional ignoreCase As Boolean = True) As String
On Error Resume Next
Dim RegEx As New RegExp
RegEx.Global = True
RegEx.MultiLine = True
RegEx.pattern = pattern
RegEx.ignoreCase = ignoreCase
Dim matches As MatchCollection
Set matches = RegEx.Execute(searchText)
Dim i As Integer
i = 1
For Each Match In matches
If i = matchIndex Then
xMATCH = Match.Value
End If
i = i + 1
Next
End Function
' -----------------------------
' NAME: xMATCHALL
' DESCRIPTION: Find and return a comma-separated list of all matches to the pattern in the search text.
' -----------------------------
Function xMATCHALL(pattern As String, searchText As String, Optional ignoreCase As Boolean = True) As String
On Error Resume Next
Dim RegEx As New RegExp
RegEx.Global = True
RegEx.MultiLine = True
RegEx.pattern = pattern
RegEx.ignoreCase = ignoreCase
Dim matches As MatchCollection
Set matches = RegEx.Execute(searchText)
Dim i As Integer
i = 1
Dim returnMatches As String
returnMatches = ""
For Each Match In matches
If i = 1 Then
returnMatches = Match.Value
Else
returnMatches = returnMatches + "," + Match.Value
End If
i = i + 1
Next
xMATCHALL = returnMatches
End Function
' -----------------------------
' NAME: xGROUP
' DESCRIPTION: Find and return a group from within a matched pattern.
' -----------------------------
Function xGROUP(pattern As String, searchText As String, group As Integer, Optional matchIndex As Integer = 1, _
Optional ignoreCase As Boolean = True) As String
On Error Resume Next
If group <> 0 Then
group = group - 1
End If
Dim RegEx As New RegExp
RegEx.Global = True
RegEx.MultiLine = True
RegEx.pattern = pattern
RegEx.ignoreCase = ignoreCase
Dim matches As MatchCollection
Set matches = RegEx.Execute(searchText)
Dim i As Integer
i = 1
For Each Match In matches
If i = matchIndex Then
xGROUP = Match.SubMatches(group)
End If
i = i + 1
Next
End Function
' -----------------------------
' NAME: xSTARTSWITH
' DESCRIPTION: Returns true or false if the search text starts with the pattern.
' -----------------------------
Function xSTARTSWITH(pattern As String, searchText As String, Optional ignoreCase As Boolean = True) As String
On Error Resume Next
Dim RegEx As New RegExp
RegEx.Global = True
RegEx.MultiLine = True
RegEx.pattern = "^" + pattern
RegEx.ignoreCase = ignoreCase
Dim matches As MatchCollection
Set matches = RegEx.Execute(searchText)
xSTARTSWITH = matches.Count > 0
End Function
' -----------------------------
' NAME: xENDSWITH
' DESCRIPTION: Returns true or false if the search text ends with the pattern.
' -----------------------------
Function xENDSWITH(pattern As String, searchText As String, Optional ignoreCase As Boolean = True) As String
On Error Resume Next
Dim RegEx As New RegExp
RegEx.Global = True
RegEx.MultiLine = True
RegEx.pattern = pattern + "$"
RegEx.ignoreCase = ignoreCase
Dim matches As MatchCollection
Set matches = RegEx.Execute(searchText)
xENDSWITH = matches.Count > 0
End Function
' ************************************
' Regular Expression Definitions
' ************************************
' -----------------------------
' NAME: xxEMAIL
' DESCRIPTION: Pattern to match an email address.
' -----------------------------
Function xxEMAIL() As String
xxEMAIL = "\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b"
End Function
' -----------------------------
' NAME: xxUSZIP
' DESCRIPTION: Pattern to match an US Zip code.
' -----------------------------
Function xxUSZIP() As String
xxUSZIP = "\b(?!0{5})(\d{5})(?!-0{4})(-\d{4})?\b"
End Function
' -----------------------------
' NAME: xxPHONE
' DESCRIPTION: Pattern to match a phone number.
' -----------------------------
Function xxPHONE() As String
xxPHONE = "\b[01]?[- .]?\(?[2-9]\d{2}\)?\s?[- .]?\s?\d{3}\s?[- .]?\s?\d{4}(\s*(x|(ext))[\.]?\s*\d{1,6})?\b"
End Function
' -----------------------------
' NAME: xxURL
' DESCRIPTION: Pattern to match a url.
' -----------------------------
Function xxURL() As String
xxURL = "\b((ftp)|(https?))\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}\b"
End Function
' ************************************
' Insert Function Dialog Category Setup
' ************************************
Sub AddCategoryDescription()
Application.MacroOptions Macro:="xREPLACE", _
Description:="Replace all portions of the search text matching the pattern with the replacement text.", _
Category:="Regular Expressions"
Application.MacroOptions Macro:="xMATCHES", _
Description:="Find and return the number of matches to a pattern in the search text.", _
Category:="Regular Expressions"
Application.MacroOptions Macro:="xMATCH", _
Description:="Find and return an instance of a match to the pattern in the search text. MatchIndex may be used in the case of multiple matches.", _
Category:="Regular Expressions"
Application.MacroOptions Macro:="xMATCHALL", _
Description:="Find and return a comma-separated list of all matches to the pattern in the search text.", _
Category:="Regular Expressions"
Application.MacroOptions Macro:="xGROUP", _
Description:="Find and return a group from within a matched pattern.", _
Category:="Regular Expressions"
Application.MacroOptions Macro:="xSTARTSWITH", _
Description:="Returns true or false if the search text starts with the pattern.", _
Category:="Regular Expressions"
Application.MacroOptions Macro:="xENDSWITH", _
Description:="Returns true or false if the search text ends with the pattern.", _
Category:="Regular Expressions"
'**** Regular Expressions ****
Application.MacroOptions Macro:="xxEMAIL", _
Description:="Pattern to match an email address.", _
Category:="Regular Expressions"
Application.MacroOptions Macro:="xxUSZIP", _
Description:="Pattern to match an US Zip code.", _
Category:="Regular Expressions"
Application.MacroOptions Macro:="xxPHONE", _
Description:="Pattern to match a phone number.", _
Category:="Regular Expressions"
Application.MacroOptions Macro:="xxURL", _
Description:="Pattern to match a url.", _
Category:="Regular Expressions"
End Sub