Bonjour à tous
Grâce à l'aide de Laetitia et Qwazerty j'ai pu batir cette macro qui fonctionne parfaitement avec Excel 2000 (c'est une liste de 36000 lignes avec des cellules qui ont parfois jusqu'à 3000 caractères) Quelqu'un aurait-il une explication au fait que sur Excel 2003, la macro sort de la boucle avant de terminer la réinjection des lignes filtrées (sur la ligne Resize) . Si je commente On error, le plantage produit le message "erreur définie par l'application".

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Sub FiltrerTab()
Dim Montab As Variant
Dim x As Long, I As Long, k As Long
Dim varFiltre() As variant
On Error Resume Next
Application.ScreenUpdating = False
Montab = Range("a1:e" & Range("a65536").End(xlUp).Row)
 x = 1
For I = 1 To UBound(Montab)
If InStr(Montab(I, 5), critere) <> 0 Then   ' critere = sous-chaine à repérer
ReDim Preserve varFiltre(1 To 5, 1 To x)
For k = 1 To 5
varFiltre(k, x) = Montab(I, k)
Next k: x = x + 1: End If: Next I
varFiltre = InverseTab(varFiltre, 1)
Sheets(sheets.count).Range("A1").Resize(UBound(varFiltre, 1), UBound(varFiltre, 2)) = varFiltre  
Erase Montab, varFiltre
Application.ScreenUpdating = True
End Sub
 
Function InverseTab(T, Optional Base As Byte = 0) 'Zon
'Base par défaut est à 0 mais si on est en base 1 lui donnner la valeur 1
Dim Temp() , I As Long, J As Long
ReDim Temp(Base To UBound(T, 2), Base To UBound(T))
For I = LBound(T, 2) To UBound(T, 2)
For J = LBound(T) To UBound(T)
Temp(I, J) = T(J, I)
Next J
Next I
InverseTab = Temp
End Function
Olivier