Microsoft 365 Récupération de lignes de plusieurs feuille sur une seule en fonction d'une valeur de cellule

jireu

XLDnaute Nouveau
Bonjour à tous,

Je suis depuis quelque temps ce forum qui m'a permis de débloquer pas mal de situation dans la réalisation de mes fichiers Excel.
Aujourd'hui, je suis confronté à un problème que je n'arrive pas à résoudre et dont je ne trouve pas la solution sur le forum.

J'ai un fichier Excel composé de plusieurs Feuilles
Feuille Globale / Feuille modèle / feuille d'un projet / feuille d'un autre projet / feuille d'encore un autre projet / etc

Ma feuille globale contient une partie me permettant de créer une nouvelle feuille projet à l'aide d'un bouton. Quand on clique dessus, elle crée une feuille basé sur la feuille "feuille modèle" et la nomme avec la valeur de la cellule à remplir à coté du bouton.
Elle contient un tableau sur lequel je vais revenir dans un instant.

Ma feuille modèle est un gabarit vierge qui est utilisé pour créer mes feuilles de projet

Mes feuilles de projet contiennent un tableau dans lequel se trouve une liste de tache avec leurs dates de compilation leurs dates d'échéance et leurs états.
Ces Etats peuvent être "terminé , à faire ou urgent".

Sur ma feuille globale, j'ai donc un tableau qui est un récap des taches de tous mes projet. Il affiche seulement les tâches avec un état "à faire" ou "urgent" et s'actualise en fonction de la modification de cet état.
Il affiche également le nom de la feuille correspondante dans une colonne supplémentaire (Le nom de la feuille est repris en cellule A1 sur chaque projet)

C'est sur ce sujet que réside mon problème. je n'arrive pas à trouver comment "surveiller" toutes mes feuilles projets et les reporter dans ma feuille générale.
Auriez vous des idée sur le sujet?

Je vous joins mon fichier si celui-ci peu aider à la compréhension

Bonne journée
 

Pièces jointes

  • Listing Tache.xls
    87.5 KB · Affichages: 16

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Jireu, bonjour le forum,

Ton fichier modifié en pièce jointe.
J'ai rajouté une liste de validation de données ("À FAIRE; TERMINÉ; URGENT) dans tous les onglets (sauf Globale).
J'ai converti le tableau de l'onglet Globale en tableau structuré.
Chaque fois fois que tu changeras un état dans un des onglet (sauf Modèle et Globale), les anciennes valeurs de ce tableau structuré seront effacées puis actualisées avec le code ci-dessous placé dans le composant ThisWorkbook :

VB:
Option Explicit 'oblige à déclarer toutes les variables
Private TEST As Boolean 'déclare la variable TEST

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 'au changement dans tous les onglets
Dim OG As Worksheet 'déclare la variable OG (Onglet Globale)
Dim TG As ListObject 'déclare la variable TG (Tableau structuré Globale)
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TS As ListObject 'déclare la variable TS (Tableau Structuré)
Dim I As Integer 'déclare la variable I (incrément)
Dim R As Range 'déclare la variable OG (Onglet Globale)
Dim LI As Integer 'déclare la variable LI (LIgne)

Set OG = Worksheets("Globale") 'définit l'onglet OG
Set TG = OG.ListObjects(1) 'définit le tableau structuré TG
If TEST = True Then Exit Sub 'si TEST est [vrai], sort de la procédure
If Not Sh.Name = "Globale" And Not Sh.Name = "Modèle" Then 'condition 1 : si le nom de l'onglet où a lieu le changement n'est ni "Globale" ni "Modèle"
    TEST = True 'définit la variable TEST (pour éviter la boucle sur l'événement change)
    On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
    TG.DataBodyRange.ClearContents 'efface le contenu de TG (génère une erreur si TG est vide)
    TG.Resize Range(TS.HeaderRowRange(1, 1), TS.DataBodyRange(1, TS.ListColumns.Count)) 'redimaneionne TG
    On Error GoTo 0 'annule la gestion des erreurs
    For Each O In Sheets 'boucle 1 : sur tous les onglets du classeur
        If Not O.Name = "Globale" And Not O.Name = "Modèle" Then 'condition 2 : si le nom de l'onglet n'est ni "Globale" ni "Modèle"
            Set TS = O.ListObjects(1) 'définit le tableau structuré TS (celui de l'onglet de la boucle)
            For I = 1 To TS.ListRows.Count 'boucle sur toutes les lignes I du tableau structuré TS
                'condition 3 : si l'état est "à faire" ou "urgent"
                If TS.DataBodyRange(I, 4) = "À FAIRE" Or TS.DataBodyRange(I, 4) = "URGENT" Then
                    Set R = TG.ListColumns(1).Range.Find("") 'définit la recherche R (recherche du vide dans la colonne 1 du tableau structuré TG)
                    If R Is Nothing Or TG.ListRows Is Nothing Then 'condition 3 : si aucune occurrence n'est trouvée ou si TG n'a pas de ligne
                        TG.ListRows.Add 'ajoute une ligbe à TG
                        LI = TG.ListRows.Count 'définit la ligne LI
                    Else 'sinon (au moins une occurrence trouvée)
                        LI = R.Row - TG.HeaderRowRange.Row 'définit la ligne LI (ligne de la première occurrence trouvée - la ligne des en-têtes)
                    End If 'fin de la condition 3
                    TG.DataBodyRange(LI, 1).Value = O.Name 'récupère le nom de l'onglet en colonne 1 de TG
                    TG.DataBodyRange(LI, 2).Value = TS.DataBodyRange(I, 2) 'récupère la tâche en colonne 2 de TG
                    TG.DataBodyRange(LI, 3).Value = TS.DataBodyRange(I, 4) 'récupère l'état en colonne 3 de TG
                    TG.DataBodyRange(LI, 4).Value = TS.DataBodyRange(I, 3) 'récupère la date butoir en colonne 4 de TG
                End If 'fin de la condition 3
            Next I 'prochaine ligne de la boucle 2
        End If 'fin de la condition 2
    Next O 'prochain onglet de la boucle 1
End If 'fin de la condition 1
TEST = False 'redéfinit la variable TEST
End Sub

Pourquoi DATE LIMITE d'un coté et Date butoire ailleurs ?!...
 

Pièces jointes

  • Jireu_EP_v01.xls
    99.5 KB · Affichages: 10

jireu

XLDnaute Nouveau
Bonjour Robert et merci pour ce travail!

Je regarderai ce code en détails qui a l’air intéressant à comprendre .

Le titre date limite et butoir sont la même chose . J’ai juste changé d’avis sur le mot en cours de route et n’ai pas encore changé sur toutes les feuilles .

Merci encore je te tiens au courant
Bon weekend
Jireu
 

jireu

XLDnaute Nouveau
Bonjour et bon Lundi.
Je viens de regarder le code que tu proposes et première chose : merci d'avoir pris le temps de commenter toutes les lignes, c'est une aide très précieuse pour la compréhension de la logique!

Le code semble répondre parfaitement à la problématique que j'avais posé. Merci beaucoup car il dépasse de loin mes capacité en VBA.

Petite question bonus: penses tu qu'il soit possible de pouvoir agir sur la liste de validation de données (URGENT, A FAIRE, TERMINÉ) à partir du tableau de récap dans l'onglet globale.

Ceci permettrai d'indiquer directement le nouveau statut par exemple lors d'un point d'avancement.

Merci encore pour le travail accompli et bonne journée :)
Jireu
 

jireu

XLDnaute Nouveau
Bonjour,

J'étudies le code proposé par Robert et je vois la ligne suivante :
VB:
TG.Resize Range(TS.HeaderRowrange(1, 1)  ,TS.DataBodyRange(1, Ts.listColumns.count))

TG est un ListObject qui va pointer un tableau structuré.
TS est aussi un ListObject et va également pointer un tableau structuré.

J'ai vu la description de la méthode HeaderRowRange qui ne prévoit pas de paramètres. Je me demande donc ce qu'implique le fait d'avoir un passage de paramètre sur cette fonction

Bonne journée :)
Jireu
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour le fil, bonjour le forum,

En fait, comme au départ le tableau structuré TG contient les anciennes données je voulais le redimensionner avec juste une seule ligne et je me suis mélangé les pinceaux car j'ai du mal avec cette action. Heureusement ça n'a pas fait planter le code. En version 02 le fichier modifié :
 

Pièces jointes

  • Jireu_EP_v02.xls
    110.5 KB · Affichages: 15

Discussions similaires

Statistiques des forums

Discussions
312 075
Messages
2 085 077
Membres
102 771
dernier inscrit
TiavinaKewin