Option Explicit
Sub CopierVersCol_F()
Dim T0 As Single, derlig As Long, t, i As Long, N As Long, j As Long
T0 = Timer
Application.ScreenUpdating = False
With Sheets("Feuil1")
' Si un filtre est présent, on affiche toute les données
' ( sinon la commande end() ne fonctionne ne pas bien! )
If .FilterMode Then .ShowAllData
derlig = .Cells(.Rows.Count, "b").End(xlUp).Row ' numéro ableau des codes à copier
' (on a aussi pris la ligne des titres des colonnes)
t = Range("b2:d" & derlig).Value
' maintenant on va parcourir les lignes de t à partir de la ligne de 2
' jusqu'à la dernière ligne du tableau qui est Ubound(t)
' la première ligne qui vérifie la condition sera recopiée à la ligne 2 de t
' la seconde ligne qui vérifie la condition sera recopiée à la ligne 3 de t
' la troisième ligne qui vérifie la condition sera recopiée à la ligne 3 de t
' et ainsi de suite...
' à la fin de boucle, tous les lignes répondant au critère, seront "Tasséee"
' en haut du tableau.
' comme on aura pris soin de répérer le nombre de lignes tassées en haut, on
' pourra transférer le haut du tableau dans la zone résultat.
' le tableau a déjà une ligne à conserver en haut (celle des en-têtes donc N=1 au départ)
N = 1
For i = 2 To UBound(t) ' boucle sur t à partir de la ligne 2
If t(i, 1) <= 10 Then
' la condition est vérifiée, on remonte la ligne vers le haut du tableau t
' la ligne i (qui vérifie la condition) sera recopiée vers la ligne N+1
N = N + 1
' on recopie les trois colonnes de la ligne i vers la ligne N
For j = 1 To 3
t(N, j) = t(i, j)
Next j
End If
Next i
' A ce stade toutes les lignes répondant à la condition
' sont rassemblées sur les N premières lignes de t (y compris les en-têtes de colonnes)
' il ne nous reste plus qu'à transférer ces N lignes vers la zone résultat
' on va le faire 'en un seul coup'
' on commence par effacer la zone résultat
.Range(.Cells(2, "f"), .Cells(.Rows.Count, "h")).Clear
' on transfère les N premières ligne de t sur la zone résultat
' pour cela on définit la bonne zone à partie de F2
' et on y place les valeurs du tableau
' VBA n'y transfère que les valeurs de t correspondnat à la taille de la zone
.Range("f2").Resize(N, 3) = t ' zone à N lignes et 3 colonnes
'un peu de bordure et de couleur et mise en forme
.Range("f2").Resize(N, 3).Borders.LineStyle = xlContinuous
.Range("f2").Resize(1, 3).Interior.Color = vbYellow
.Range("f2").Resize(1, 3).HorizontalAlignment = xlCenter
.Range("f2").Resize(1, 3).Font.Bold = True
.Range("g1") = Format(Timer - T0, "0.000") & " sec."
End With
End Sub