Si tu changes les paramètres dans lesquels le code doit opérer à chaque fois, si tu ne respectes pas des règles minimales de disposition des données, tu passeras ton temps à réadapter le code.
Sur Recape, la région courante à partir de A15 débutera ligne 12 ! Tant que tu ne vas pas flanquer d'autres mentions ici ou là qui la modifieront. Il faut donc maintenant décaler de 3 pour effacer les données antérieures.
Tu mets en plus des bordures au-delà des données, alors qu'on les supprime pour les réintroduire de façon que la mise en forme suive l'extension des données, mais celles mises en dessous des données ne pourront être effacées, du coup.
Et est-il vraiment nécessaire de flanquer un tableau n'importe où sur la feuille en laissant des lignes vides au-dessus ?
Sur les autres feuilles, la région courante à partir de A1 va s'arrêter colonne G, car H est vide. On va donc devoir considérer la région courante à partir de I1 qui va s'étendre de I à O. Mais dans le tableau résultant, les données de I seront en 1 et celles de O en 7...
Voilà un code adapté à ton fichier... tant que tu ne vas flanquer des machins ici ou là !
Sub Recherche()
Dim Txt$, TxTest$, ws As Worksheet, i%, j%, n%, Lg%, aa, Tbl()
Txt = "*SFP KO*"
For Each ws In Worksheets
Select Case ws.Name
Case "Recape"
Case Else
aa = ws.Range("I1").CurrentRegion
For i = 2 To UBound(aa)
For j = 4 To 7
TxTest = TxTest & aa(i, j)
Next j
If TxTest Like Txt Then
ReDim Preserve Tbl(n)
Tbl(n) = WorksheetFunction.Index(aa, i, Array(1, 2, 3))
n = n + 1
End If
TxTest = ""
Next i
End Select
Next ws
With Worksheets("Recape")
.Range("A15").CurrentRegion.Offset(3).Clear
If n > 0 Then
With .Range("A15").Resize(n, 3)
.Value = WorksheetFunction.Transpose(WorksheetFunction.Transpose(Tbl))
.Resize(, 4).Borders.Weight = xlThin
End With
End If
End With
End Sub