Bonjour Romain,
Je ne suis pas parvenu à ouvrir ton fichier.
Cependant, j'ai fait un petit code sur une liste filtrée qui pourra te donner des pistes.
Le principe est un peu différent dans la mesure où je copie les informations filtrées vers une feuille de calcul. Je le laisse tout de même en l'état car cela peut finalement t'intéresser.
Il y a également un petit code qui sert à remettre à zéro toutes les sélections, en désactivant et réactivant le filtre.
Ce que je te suggère est de prévoir tes valeurs de critères sur une ligne puis de lancer ensuitre la macro qui passera chaque critère à chaque colonne.
Option Explicit
Sub Reprisedonnees()
'
' Reprisedonnees Macro
' Macro enregistrée le 26/08/2004 par JCA
'
Dim L As Long, LM As Long, Z As Byte
' Désactiver le défilement de l'affichage et la protection de la feuille
Application.ScreenUpdating = False
ActiveSheet.Unprotect
' Effacer les valeurs présentes dans la feuille calcul
Range("Donnees").ClearContents
Sheets("Données").Select
Range("c3").Select
' Je remets à 0 le filtre automatique
Call RAZFiltre
' Je trie d'abord les données dans l'ordre chronologique
Selection.Sort Key1:=Range("c3"), Order1:=xlAscending, Header:=xlYes
' Je filtre sur la valeur du matricule puis sur le code "Activité"
Selection.AutoFilter Field:=1, Criteria1:=Range("matricule").Value
Selection.AutoFilter Field:=5, Criteria1:="=Activité"
Range("D65536").Select
' Je détermine le numéro de la dernière ligne que j'impute à la variable L
L = Selection.End(xlUp).Row
' Si L est égal à 3, c'est qu'il n'y a pas de données pour ce matricule
If L = 3 Then Call RAZFiltre: Sheets("Calcul").Select: _
Range("B3").Select: _
Z = MsgBox("Pas de données pour ce matricule", vbOKOnly, "Pas de données"): Exit Sub
' Sinon, je sélectionne les données "Du" à "Jours" de la ligne L à la _
1ère ligne de données
Range("C4:I" & L).Select
Selection.Copy
' Je retourne dans la feuille "Calcul" en A9 pour copier le résultat
Sheets("Calcul").Select
Range("A9").Select
ActiveSheet.Paste
' Je calcule à quelle ligne placer la période mairie s'il y en à une
LM = Selection.End(xlDown).Row + 2
' S'il n'y a qu'une ligne d'activité, le .End(xlDown) renvoi à la ligne 24.
' LM doit prendre alors la valeur 11 à la place de la valeur 26
If LM = 26 Then LM = 11
' Je m'occupe de la période mairie
Sheets("Données").Select
Range("F3").Select
Selection.AutoFilter Field:=5, Criteria1:="=Mairie"
L = Range("F65536").End(xlUp).Row
If L > 3 Then Range("C4:I" & L).Select: _
Selection.Copy: Sheets("Calcul").Select: Range("A" & LM).Select: ActiveSheet.Paste
' Je filtre sur les autres Codes d'activité
Sheets("Données").Select
Range("D3").Select
Selection.AutoFilter Field:=5, Criteria1:="<>Activité", Operator:=xlAnd, _
Criteria2:="<>Mairie"
Range("D65536").Select
' Je détermine le numéro de la dernière ligne que j'impute à la variable L
L = Selection.End(xlUp).Row
' Si L est égal à 3, c'est qu'il n'y a pas de données pour les autres activités
If L = 3 Then Call RAZFiltre: Sheets("Calcul").Select: Range("B3").Select: Exit Sub
' Sinon, je sélectionne les rangées "Du" et "Au" et prorata de la ligne 4 à L
Range("C4:I" & L).Select
Selection.Copy
' Je retourne dans la feuille "Calcul" en A28 pour copier le résultat
Sheets("Calcul").Select
Range("A28").Select
ActiveSheet.Paste
Call RAZFiltre
Sheets("Calcul").Select
Range("B3").Select
ActiveSheet.Protect
Application.ScreenUpdating = True
End Sub
Private Sub RAZFiltre()
' Pour désactivier les critères : désactivation du filtre et activation
Sheets("Données").Select
Range("A3").Select
Selection.AutoFilter
Selection.AutoFilter
End Sub
A toi de jouer !