La même chose mais par onglet, car je pense que c'était plus ton sujet.
Option Explicit
Public critere%
Sub dispatcher()
Dim Tbl As Variant, data As Variant, i%, ws As Worksheet, entete
Dim dico1 As Object, cle1 As Variant, result1 As Variant
Dim colonne$
UserForm1.Show
If critere = 0 Then Exit Sub
Application.DisplayAlerts = False
For Each ws In Worksheets
If ws.Name <> ActiveSheet.Name Then ws.Delete
Next
Application.DisplayAlerts = True
data = Cells(Rows.Count, 1).End(xlUp).CurrentRegion
Set dico1 = CreateObject("Scripting.Dictionary")
For i = LBound(data) + 1 To UBound(data) ' hors en-tête
dico1(data(i, critere)) = ""
Next
Application.ScreenUpdating = False
For Each cle1 In dico1.Keys
result1 = filtreArray(data, critere, cle1)
With ThisWorkbook
Set ws = .Sheets.Add(After:=.Sheets(.Sheets.Count))
End With
ws.Name = cle1
ws.Cells(1, 1).Resize(1, UBound(data, 2)) = data
ws.Cells(2, 1).Resize(UBound(result1, 1), UBound(result1, 2)) = result1
Next
Application.ScreenUpdating = True
MsgBox "Terminé !"
End Sub