Option Explicit
Sub Création_Onglets()
Dim d As Object, t(), temp(), i%, l%, c, n$
'On enregistre le tableau dans un tableau virtuel.
With Sheets("Feuil3")
l = .Cells.Find("*", , , , xlByRows, xlPrevious).Row
t = .Range(.Cells(1, 1), .Cells(l, 5)).Value
End With
'On crée un index des différentes villes.
Set d = CreateObject("scripting.dictionary")
For i = 2 To UBound(t)
d(t(i, 5)) = d(t(i, 5)) & i & ":"
Next i
'On va boucler les clés du dictionnaire pour créer les feuilles.
'Nous vérifions également si les feuilles n'existent pas déjà.
For Each c In d.Keys
n = Replace(CStr(c), """", "")
If Not OngletExiste(n) Then
Sheets.Add After:=Sheets((Sheets.Count))
ActiveSheet.Name = n
End If
With Sheets(n)
'On recherche la dernière ligne de la feuille
l = .[a65000].End(xlUp).Row
'On exporte dans un tableau temporaire les lignes correspondantes
temp = Application.Index(t, Application.Transpose(Split(d(c), ":")), Array(1, 2, 3, 4, 5))
'Si la dernière ligne du classeur correspond à la première alors on ajoute l'en-tête
If l = 1 And .[a1].Value = "" Then .Range("A1:E1").Value = Application.Index(t, 1, Array(1, 2, 3, 4, 5))
'On exporte les valeurs dans la feuille
.Cells(l + 1, 1).Resize(UBound(temp) - 1, 5).Value = temp
End With
Next c
'On supprime les lignes dans la première feuille
Sheets("Feuil3").Rows("2:" & UBound(t)).Delete
End Sub
Function OngletExiste(Nom As String) As Boolean
On Error Resume Next
OngletExiste = False
OngletExiste = Not Sheets(Nom) Is Nothing
End Function