Obtenir une liste à partir de plusieurs onglets (feuilles)

hamphilos

XLDnaute Nouveau
Bonjour forum;

Je viens solliciter votre aide sur le problème suivant: j'ai quatre feuilles et dans chacune les lignes sont groupées. Seule la première ligne de chaque groupe contient des données. Sachant que le nombre de lignes est illimité, je désire obtenir une seule liste dynamique, dans une cinquième feuille, qui va contenir les données de la feuille 1, puis feuille 2, puis 3 et enfin 4. Par dynamique, j'entends lorsqu'une nouvelle donnée est entrée dans la feuille 1 par exemple, celle-ci s'ajoute à la liste, avant les données de la feuille 2, et ainsi de suite...

Afin de vous faciliter la chose, un fichier témoin est en PJ, avec le résultat souhaité dans l'onglet synthèse. Dans l'exemple, les cellules en plus sont masquées, mais l'utilisateur à la possibilité d'ajouter des lignes au besoin.

Merci d'avance pour votre précieuse aide.
 

Pièces jointes

  • Liste.xlsx
    12 KB · Affichages: 52
  • Liste.xlsx
    12 KB · Affichages: 54
  • Liste.xlsx
    12 KB · Affichages: 52

Staple1600

XLDnaute Barbatruc
Re : Obtenir une liste à partir de plusieurs onglets (feuilles)

Bonjour à tous

Tout pareil que 00 (que je salue au passage ;) ) sauf ...
(voir les explications dans le nom de ma macro)
Code:
Sub SynthèseAvecUneEndiveEtPourExcel2007EtSupérieur()
Dim i As Integer
Application.ScreenUpdating = False
With Sheets("Synthèse")
    .Columns(2).Clear: .[B1] = "Projets"
    For i = 1 To Sheets.Count
    If Sheets(i).Name <> "Synthèse" Then
    Sheets(i).Range("B2", Sheets(i).Range("B" & Rows.Count).End(xlUp)).SpecialCells(2, 23).Copy .Range("B" & Rows.Count).End(xlUp)(2)
    End If
    Next
    .Activate
End With
Application.ScreenUpdating = True
End Sub

PS: xlDown peut parfois poser des soucis si cellules vides dans la colonne ;)
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Obtenir une liste à partir de plusieurs onglets (feuilles)

Bonjour amphilos, DoubleZero :), Staple1600 :),

Pour le FUN (au moins le mien :p), une extraction des niveaux n1 à n2. Ça ne sert pas à grand chose mais je n'avais pas encore travaillé avec les plans.
J'ai travaillé avec un classeur auxilliaire pour ne pas modifier la présentation des niveaux affichés ou non dans les feuilles sources.
 

Pièces jointes

  • Recopie Niveau n1 à n2.xlsm
    27.6 KB · Affichages: 42

hamphilos

XLDnaute Nouveau
Re : Obtenir une liste à partir de plusieurs onglets (feuilles)

Bonjour DoubleZero, Staple1600, mapomme, le forum

Je désire tout d'abord vous remercier pour vos efforts et le temps que vous me/nous consacrez. J'ai vu et testé vos propositions qui me conviennent toutes, et je vous en remercie. Je viens, cependant, rajouter une couche de difficulté:

- en effet, mes feuilles sont protégées par mot de passe. L’exécution des macros retourne donc le message d'erreur 1004 "Vous ne pouvez pas exécuter cette commande sur une feuille protégée...";

- dans le classeur, j'ai d'autres feuilles à part les quatre à partir desquelles je désire extraire les données. Y a-t-il donc moyen d'indiquer les feuilles concernées par l'extraction?

Merci encore pour votre précieuse aide.
Salutations,
H.
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Obtenir une liste à partir de plusieurs onglets (feuilles)

Re

Tu as déjà un élément de réponse, non ? ;)
If Sheets(i).Name <> "Synthèse" Then

Tu as aussi la loupe en haut à droite de l'écran (pour trouver l'inspiration dans les archives du forum) ;)
 

hamphilos

XLDnaute Nouveau
Re : Obtenir une liste à partir de plusieurs onglets (feuilles)

Bonjour DoubleZero, Staple1600, mapomme, le forum;

Malgré votre précieuse aide et orientations, mon problème n'est toujours pas réglé. Il faut dire que j'ai omis de signaler, dès le début, que je n'ai aucune base dans la programmation en VBA...

J'ai effectué des recherches sur UserInterfaceOnly qui permet de faire rouler des macros sur des feuilles protégées. J'ai rajouté donc cet argument dans la protection de mes feuilles, qui permet également d'afficher et de masquer des lignes groupées. Dans ThisWorkbook, cela donne:

Private Sub Workbook_Open()
With Worksheets("F1")
.EnableAutoFilter = True
.EnableOutlining = True
.Protect Contents:=True, Password:="MCDS", UserInterfaceOnly:=True
.
.
. (voir macro complète en PJ).
Malheureusement, cela n'a pas donné de résultat et le message d'erreur 1004 apparait à l'exécution de la macro (Module 1).

J'ai ajouté cet argument dans la macro se trouvant dans chaque feuille, et qui permet d'insérer des commentaires dans les cellules déverrouillées d'une feuille protégée, mais en vain:

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
If Not Target.Locked Then
ActiveSheet.Unprotect Password:="MCDS", UserInterfaceOnly:=True
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ActiveSheet.Protect Password:="MCDS", UserInterfaceOnly:=True
End Sub

J'ai également rajouté la dé-protection au sein du code vba (ActiveSheet.Unprotect ("password")) en vain (voir le code complet dans le module 1 de la PJ).

Enfin, je voulais savoir s'il y a moyen qu'il n'y ait aucune mise en forme des résultats de la macro, dans le sens ou, par exemple, si j'ai un remplissage jaune dans les feuilles d'origine, dans la feuille synthèse je n'aurais aucune couleur?.

Je me demandais, en définitive, s'il y avait un autre moyen qu'une macro pour obtenir les mêmes résultats? Avec des fonctions matricielles par exemple... J'avoue que je reste fasciné par l'efficacité des macros offertes ci-dessus.

Merci de votre précieuse aide.
H.
 

Pièces jointes

  • Liste bis.xlsm
    27 KB · Affichages: 31

Staple1600

XLDnaute Barbatruc
Re : Obtenir une liste à partir de plusieurs onglets (feuilles)

Bonsoir à tous


En supprimant les codes des procédures événementielles dans les feuilles
Et avec le code ainsi modifié, pas de message d'erreur sur mon PC.
PS: Tu as le droit de renommé la macro ;)
Code:
Sub testOK()
Dim i As Integer
Application.ScreenUpdating = False
With Sheets("Synthèse")
.Unprotect "MCDS"
    .Columns(2).Clear: .[B1] = "Projets"
    For i = 1 To Sheets.Count
    If Sheets(i).Name <> "Synthèse" Then
    Sheets(i).Unprotect "MCDS"
    Sheets(i).Range("B2", Sheets(i).Range("B" & Rows.Count).End(xlUp)).SpecialCells(2, 23).Copy .Range("B" & Rows.Count).End(xlUp)(2)
    Sheets(i).Protect "MCDS", UserInterfaceOnly:=True
    End If
    Next i
    .Activate
.Protect "MCDS", UserInterfaceOnly:=True
End With
Application.ScreenUpdating = True
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 106
Messages
2 085 351
Membres
102 871
dernier inscrit
Maïmanko