Sub es()
' ExtractPatternsOptimized
  Dim BD As Worksheet, ws As Worksheet
  Dim rng As Range, cell As Range
  Dim regex As Object, matches As Object, match As Object
  Dim arrData As Variant
  Dim outputRow As Long
  Dim startPos As Long
  Dim i As Long, j As Long
  Dim flag As Boolean
  
  Application.ScreenUpdating = False
    On Error GoTo ErrorHandler
  
' Initialisation des feuilles de travail
    Set BD = Worksheets("Base de données")
    Set ws = Worksheets("Recherche")
  
' Plage à analyser
    Set rng = BD.Range(BD.Cells(4, 2), BD.Cells(BD.Rows.Count, 5).End(xlUp))
  
' Initialisation de l'expression régulière
    Set regex = CreateObject("VBScript.RegExp")
    regex.Global = True
    regex.IgnoreCase = True
    regex.Pattern = ws.Cells(2, 3).Value2 ' Modèle à rechercher
  
' Nettoyage des résultats précédents
    ws.Range("B8:E" & ws.Rows.Count).Clear
    outputRow = 8
  
' Charger les données de la plage dans un tableau pour améliorer la performance
    arrData = rng.Value
  
' Parcours des lignes et des colonnes dans le tableau
    For i = 1 To UBound(arrData, 1) ' Parcours des lignes
        For j = 1 To UBound(arrData, 2) ' Parcours des colonnes
        ' Vérifier si une correspondance est trouvée
            If regex.Test(arrData(i, j)) Then
                ' Ajouter la valeur à la feuille de résultats
                    ws.Cells(outputRow, j + 1).Value = arrData(i, j)
                ' Appliquer le formatage si une correspondance est trouvée
                    startPos = InStr(1, arrData(i, j), regex.Pattern, vbTextCompare)
                    If startPos > 0 Then FormatText ws.Cells(outputRow, j + 1), startPos, Len(regex.Pattern)
                ' Test (Si le patrene a était trouvé au moin une fois)
                    flag = True
            Else
                ' Ajouter la valeur à la feuille de résultats
                    ws.Cells(outputRow, j + 1).Value = arrData(i, j)
            End If
        Next j
'
'       Mise en forme et recopie des lignes dont le paterne a était trouvé.
            If flag = False Then: ws.Cells(outputRow, 2).Resize(, 4).Clear: Else: outputRow = outputRow + 1: flag = False
    Next i
'
Cleanup:
    ' Libération des objets
    Set ws = Nothing
    Set BD = Nothing
    Set rng = Nothing
    Set regex = Nothing
    Application.ScreenUpdating = True
    Exit Sub
'
ErrorHandler:
    ' Gestion des erreurs
    MsgBox "Erreur : " & Err.Description, vbExclamation
    Resume Cleanup
End Sub
'
Private Sub FormatText(ByVal cell As Range, ByVal startPos As Long, ByVal length As Long)
    ' Appliquer le formatage à la portion de texte correspondante
    With cell.Characters(startPos, length).Font
        .Color = RGB(255, 0, 0) ' Rouge
        .Bold = True
    End With
End Sub