XL 2010 Macro pour enchainement de filtres avancés avec décalage ligne

Murj

XLDnaute Nouveau
Bonjour à tous,

Fraichement arrivé sur ce forum que je parcours régulièrement, je sollicite vos lumières concernant un problème rencontré lié à ma méconnaissance.

Je recherche à créer une table des matières par mois dans l'onglet "Recueil" (qui sera imprimé) à partir de deux onglets source "Arretés" et "Décisions&Délibérations".
Ces 2 onglets ont les mêmes en-têtes de colonne.

Pour réaliser cette table des matières, j'ai eu recours à 3 filtres avancés en fonction du mois qui fonctionnent par macro.
1ère macro "ExtraitArretes" qui filtre l'onglet "Arretés" :
les résultats apparaissent de C à F.
2ème macro "ExtraitDécisions" qui filtre à partir d'un critère l'onglet "Décisions&Délibérations" et peut renvoyer aucune, une ou plusieurs valeurs :
les résultats apparaissent de K à N.
3ème macro "ExtraitDélibérations" qui filtre à partir d'un critère l'onglet "Décisions&Délibérations" et peut renvoyer aucune, une ou plusieurs valeurs :
les résultats apparaissent de Q à T

Ces 3 filtres fonctionnent parfaitement par l'intermédiaire d'un userform. :
Sub Recueil()
'
' Recueil Macro
'

'
Application.Run _
"'Numerotation acte et deliberation V3 new.xlsm'!ExtraitArrêtés"
Application.Run _
"'Numerotation acte et deliberation V3 new.xlsm'!ExtraitDécisions"
Application.Run _
"'Numerotation acte et deliberation V3 new.xlsm'!ExtraitDélibérations"
End Sub


Mais mon but est de faire une table des matières, un sommaire de ces résultats sous forme de tableau qui sera imprimé.

Aussi, je cherche :
1) que les résultats de ces filtres soient les uns en-dessous des autres (colonne C à F)
2) que si le deuxieme et/ou le troisième filtre ne donne pas de résultat que ce filtre n'apparaisse pas
3) entre chacun des filtres je dispose de 3 lignes blanches pour y mettre le nom des colonnes.


Merci pour vos eventuels conseils
 
Solution
Re,
Dans ce code :
VB:
For A = 19 To 23
    Cells(LR, A - 18) = .Cells(L, A)
Next A
19 représente la colonne de la donnée à copier ( en l'occurrence colonne S )
Cette cellule doit être copiée en colonne A, soit colonne=1.
Comme A vaut 19 au copiage, elle doit donc valoir A-18 au collage ( soit 1 )
C'est juste une astuce pour éviter de gérer un autre index. On aurait pu faire :
Code:
IndexCollage=1
For A = 19 To 23
    Cells(LR,IndexCollage) = .Cells(L, A)
    IndexCollage=IndexCollage+1
Next A
:)

Murj

XLDnaute Nouveau
Bonjour et Merci,

J'ai réussi à épurer mon fichier et à l'anonymiser.

donc le voici.

Pour l'heure, je suis bloqué à l'onglet "Recueil" et mon but serait que le rendu final soit comme l'onglet "EditionRecueil"
 

Pièces jointes

  • Numerotation acte et deliberation V4 test.zip
    573.6 KB · Affichages: 10

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
En PJ un essai.
J'ai considéré que N° acte était le N° Chrono.
La macro est automatique, la feuille EditionRecueil se reconstruit quand on sélectionne cette feuille.

NB : la macro
VB:
Sub Recueil()
'
' Recueil Macro
    Application.Run _
        "'Numerotation acte et deliberation V4 test.xlsm'!ExtraitArrêtés"
    Application.Run _
        "'Numerotation acte et deliberation V4 test.xlsm'!ExtraitDécisions"
    Application.Run _
        "'Numerotation acte et deliberation V4 test.xlsm'!ExtraitDélibérations"
End Sub
peut être écrite plus simplement :
Code:
Sub Recueil()
    ExtraitArrêtés
    ExtraitDécisions
    ExtraitDélibérations
End Sub
 

Pièces jointes

  • Numerotation acte et deliberation V5 test.zip
    571.5 KB · Affichages: 5

Murj

XLDnaute Nouveau
Re,
En PJ un essai.
J'ai considéré que N° acte était le N° Chrono.
La macro est automatique, la feuille EditionRecueil se reconstruit quand on sélectionne cette feuille.

NB : la macro
VB:
Sub Recueil()
'
' Recueil Macro
    Application.Run _
        "'Numerotation acte et deliberation V4 test.xlsm'!ExtraitArrêtés"
    Application.Run _
        "'Numerotation acte et deliberation V4 test.xlsm'!ExtraitDécisions"
    Application.Run _
        "'Numerotation acte et deliberation V4 test.xlsm'!ExtraitDélibérations"
End Sub
peut être écrite plus simplement :
Code:
Sub Recueil()
    ExtraitArrêtés
    ExtraitDécisions
    ExtraitDélibérations
End Sub
Waouh !!! je reste sans voix merci.

C'est à peu de choses prêt ce que je souhaitais faire : Merci !
Je vais m'efforcer de comprendre (merci d'ailleurs pour les explications dans la macro) afin de faire les dernières modifications à savoir :
si le filtre décision ne renvoie aucune valeur alors qu'il n'apparaisse pas et idem pour délibération.
la pagination qui correspond à la colonne G et que je dois rajouter pour Décisions et Délibérations.

A moins qu'il me soit possible d'incrémenter votre macro directement dans l'onglet du filtre (afin de ne disposer plus que d'un seul onglet) ?
Mais j'ai l'impression que cette alternative serait alambiquée car nécessiterait de masquer les en-tetes de filtre, de supprimer en partie les éléments de cette feuille (de A17 à F10000), avec une plage dynamique et des insertions avec décalage
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Murj,
Voir PJ, il suffit de faire du Si première cellule vide alors sauter l'étape.
Par contre, deux petits points, acquis par expérience :

1- Si l'utilisateur prend l'habitude de recevoir un rapport en trois chapitres, le jour où il recevra que deux chapitres, sa réaction ne sera pas "Tiens il n'y a pas de ça aujourd'hui" mais il vous téléphonera pour vous demander pourquoi ce jour il n'y a que deux chapitres. ( c'est du vécu )
Car un chapitre "Décisions" vide ce n'est pas interprété comme un chapitre sans objet mais un chapitre oublié.

2- Ce serait une erreur de ne faire qu'une feuille avec Recueil et EditionRecueil. Une est l'importation des données, l'autre une présentation. Outre le fait que ça va compliquer les choses, vous n'échapperez pas à une demande d'évolution de l'outil "Eh! Murj, tu pourrais pas nous rajouter une colonne avec la vitesse du vent ou l'âge du capitaine ?"
Si vous avez deux feuilles alors c'est relativement simple et n'impacte qu'une macro et quelques index.
Si vous n'avez qu'une feuille, il y a fortes chances que l'insertion d'une colonne perturbera l'importation de données et ça va vite devenir inextricable avec des If Then Else à n'en plus finir.
Par expérience, pour un outil déployé c'est une fonction, une feuille, une macro.
N'oubliez pas que pour un outil déployé, la Maintenance est très importante. Autant la simplifier.

Mais si cette feuille n'est pas "utile" à l'utilisateur vous la masquer et passez le flag Visible en état 2-xlsheetVeryHidden, elle deviendra totalement invisible, y compris dans la liste des feuilles à afficher.
 

Pièces jointes

  • Numerotation acte et deliberation V6 test.zip
    572.9 KB · Affichages: 3

Murj

XLDnaute Nouveau
Bonjour,

Merci pour ces éclaircissements.

Cependant essayant d'apporter quelques modifications, j'avoue ne pas bien saisir la syntaxe de cette macro.

Ainsi j'ai modifier quelque peu mon fichier de base et j'ai réussi à apporter quelques modifications à votre macro (je n'ai pas encore ajouter la fonction SI).
Cependant bien que j'ai réussi à modifier la présentation de l'Edition Recueil (en supprimant les 4 premieres lignes inutiles.
Je n'arrive pas à saisir quel paramètre faut-il modifier pour que le copier coller se produis en A et non en C.

J'aime bien comprendre...

Aussi j'ai modifié sur cette macro mais alors que tout fonctionnait en C, désormais erreur 400.
Je pe,nse que mon incompréhension vient du "on copie les cellules" où j'ai essayé les 3 possibilités mais rien ne passe.

Sub Worksheet_Activate()
' Suppression du tableau exsitant
Range("A10:A1000").EntireRow.Delete
' Init N° ligne dans EditionRecueil
LR = 12
' Figeage écran
Application.ScreenUpdating = False
' Partie Arrêtés
MiseEnForme "Arrêtés", "Objet de l'arrêté", 10 ' Entete chapitre
With Sheets("Recueil")
N = 0 ' Nombre de lignes du chapitre
DL = .Range("C65500").End(xlUp).Row ' Fin tableau recueil
For L = 17 To DL ' Pour toutes les lignes
For A = 3 To 7 ' sur 4 colonnes
Cells(LR, A) = .Cells(L, C) ' On copie les cellules
Next A
LR = LR + 1: N = N + 1 ' Mise à jour des pointeurs
Next L
End With
Range("A" & LR - N - 1 & ":E" & LR - 1).Borders.Weight = xlThin ' Cellules avec bordures
 

Murj

XLDnaute Nouveau
:mad:
VB:
Cells(LR, A) = .Cells(L, C)
A et C sont les noms de colonnes et non des variables, donc :
Code:
Cells(LR, "A") = .Cells(L, "C")
ou
Cells(LR, 1) = .Cells(L, 3)


J'ai cette fois intégré la condition Si.
Par contre je n'arrive pas à trouver quelle est la ligne de code qui définit la cellule pour le coller...

aussi, peut-être pourriez-vous m'expliquer l'erreur
 

Pièces jointes

  • Copie de Numerotation acte et deliberation V5 test.zip
    590.7 KB · Affichages: 3

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Dans ce code :
VB:
For A = 19 To 23
    Cells(LR, A - 18) = .Cells(L, A)
Next A
19 représente la colonne de la donnée à copier ( en l'occurrence colonne S )
Cette cellule doit être copiée en colonne A, soit colonne=1.
Comme A vaut 19 au copiage, elle doit donc valoir A-18 au collage ( soit 1 )
C'est juste une astuce pour éviter de gérer un autre index. On aurait pu faire :
Code:
IndexCollage=1
For A = 19 To 23
    Cells(LR,IndexCollage) = .Cells(L, A)
    IndexCollage=IndexCollage+1
Next A
:)
 

Pièces jointes

  • Numerotation acte et deliberation V7 test.zip
    584.5 KB · Affichages: 3

Murj

XLDnaute Nouveau
Ah oui je n'avais pas percuté cette astuce...

encore Merci pour ce précieux coup de main.

Il me faut maintenant m'atteler au registre par date et par objet, mais ce sera l'objet d'un nouveau post car il me faut avancer dans ma configuration.

Encore un grand merci pour votre aide
 

Discussions similaires

Statistiques des forums

Discussions
315 094
Messages
2 116 150
Membres
112 670
dernier inscrit
Flow87