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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| Sub OngletsNom()
'cette macro sépare les données ,de la feuille dont le nom est dans la variable data, en une feuille par valeur différentes
'cette macro n'a pas besoin que les données soient triées car elle utilise les filtres avancés.
Application.ScreenUpdating = False
Dim FEUILLE_DEST As Worksheet
Dim var As Object
Dim Plage As Range
Dim Cell As Range
Dim i As Long
Data = "doss_all" 'nom de la feuille qui contient les données (a adapter)
' création de l'objet SortedList
Set var = CreateObject("System.Collections.SortedList")
With ThisWorkbook.Worksheets(Data).Cells(1, 27) 'adapter le numero de colone ici et dans le reste du programme
Set Plage = .CurrentRegion ' plage des données (avec les titres)
For Each Cell In .CurrentRegion.Columns(27).Cells ' boucle pour créer la liste sans doublon
If Not var.containskey(Cell.Value) And Cell.Row > 1 Then
var.Add Cell.Value, Cell.Text
End If
Next Cell
End With
For i = 0 To var.Count - 1
' ici on gère le fait que la feuille existe ou non
On Error Resume Next
Set FEUILLE_DEST = ThisWorkbook.Worksheets("cat" & var.getbyindex(i))
On Error GoTo 0
' si la feuille n'existe pas : on la crée et la renomme avec le nom de la var
If FEUILLE_DEST Is Nothing Then
Set FEUILLE_DEST = ThisWorkbook.Worksheets.Add
FEUILLE_DEST.Name = "cat" & var.getbyindex(i)
FEUILLE_DEST.Move After:=Sheets(ActiveWorkbook.Sheets.Count)
' si la feuille existe : on efface tout
Else
If FEUILLE_DEST.AutoFilterMode And FEUILLE_DEST.FilterMode Then FEUILLE_DEST.ShowAllData
FEUILLE_DEST.Cells.Clear
End If
' utilisation du filtre avancé
With FEUILLE_DEST
.Cells(1, 1) = Plage.Cells(1, 27) ' nom du critère (l'entête de la colonne 27)
.Cells(2, 1) = var.getbyindex(i) ' valeur du critère : nom de la var (qui est le nom de la feuille)
Plage.AdvancedFilter xlFilterCopy, .Cells(1, 1).CurrentRegion, .Cells(4, 1), False ' application du filtre avancé
.Cells(1, 1).Resize(3, 1).EntireRow.Delete ' nettoyage de la zone des critères (= suppression des lignes 1 à 3)
.Cells.EntireColumn.AutoFit
Set FEUILLE_DEST = Nothing
Next i
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub |
Partager