VBA : Replace VBA boosté au RegEx

La fonction Replace() de VBA est largement employée par les développeurs. Mais lorsqu’ils souhaitent faire une recherche moins statique, ils regardent avec envie l’opérateur Like sans pouvoir faire un mix des 2.

Etant confronté à des traitements de chaines de caractères, je me suis créé une petite fonction dérivée du Replace, avec une touche de VBScript.RegEx.

Voici ce que cela donne :

Function ReplaceReg(ByVal expression As String, ByVal findPattern As String, ByVal replace As String, _
                    Optional ByVal caseSensitive As Boolean = False) As String
'---------------------------------------------------------------------------------------
' Procedure : ReplaceReg
' Author    : Fabrice CONSTANS (C²ED - c2ed.software@gmail.com)
' Date      : 24/09/2024
' Purpose   : Un Replace() VBA avec du RegEx
' Parameters: expression à analyser, findPattern pattern regex, replace ce qui doit être
'             mis à la place du pattern, caseSensitive tenir compte de la casse. 
' Copyright : © L'intégralité du code ci-dessous est la propriété de son auteur (Author)
'             Son utilisation est strictement limitée au présent logiciel.
' Pattern regex : https://documentation.help/MS-VBScript-fr/vsproPattern.htm
' Exemple de patterns :
'LIKE      RegEx
'chaton*   ^chaton.
'chat*n    chat.n
'chat[A,E] chat[AE]
'chat=,    chat=.,
'chat      chat$
'---------------------------------------------------------------------------------------

    On Error GoTo Errsub
    Dim regEx As Object
    Set regEx = CreateObject(VBScript.RegExp)
    
    With regEx
        .pattern = pattern
        .Global = True
        .IgnoreCase = Not caseSensitive
    End With
    
    ReplaceReg = regEx.replace(expression, replace)
    Exit Function

Errsub
    ReplaceReg = inputText ' retourne le texte original en cas d’erreur
    
End Function

Le contrat d’utilisation

  • expression : texte à modifier.
  • findPattern : pattern RegEx conforme au standard VBScript.Regex
  • replace : texte de remplacement
  • caseSensitive indique si la casse doit être prise en compte.

Les patterns

Les expressions régulières RegEx sont bien plus puissant que le l’opérateur Like, mais plus complexe à maitriser.
En revanche, l’opérateur Like est disponible à la fois SQL et en VBA, où il fonctionne de la même manière.

Remplacement global

Comme le Replace dans son utilisation le plus basique, notre fonction remplace toutes les occurrences rencontrées. C’est la propriété Globle=True qui garantie se comportement. Si on utilise False, seule la première occurrence sera traitée.

Perfectible ? Toujours !

La fonction est perfectible : on pourrait y ajouter des options comme start ou count pour limiter les remplacements. Mais dans la majorité des cas, elle fait le job.

  • start qui exclue les X premiers caractère de l’expression
  • count qui opère X remplacement

Je n’utilise jamais le Start, par contre le Count peut s’avérer utile dans certains cas.

Exemple d’utilisation

? replaceReg("ODBC;DRIVER={MySQL ODBC 8.0 UNICODE Driver};SERVER=192.168.10.1;DATABASE=baseLocale;Option=43;charset=UTF8;",";SERVER=.*?;",";SERVER=azure.microsoft.com;")
ODBC;DRIVER={MySQL ODBC 8.0 UNICODE Driver};SERVER=azure.microsoft.com;DATABASE=baseLocale;Option=43;charset=UTF8;

On a remplacé n’importe quelle adresse du server par ;SERVER=azure.microsoft.com;

Conclusion

Si vous traitez des chaînes complexes en VBA, pensez RegEx. Et si vous aimez cette fonction, n’hésitez pas à l’utiliser — en conservant l’en-tête bien sûr.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *