[RESOLU] fiche synthèse à partir de plusieurs onglets...

nightswan

XLDnaute Junior
Bonsoir,

Les exemples sont multiples sur ce thème, mais je ne parviens pas à l'adapter pour les contraintes de mon fichier.

J'ai récupéré un morceau de code qui me semble le plus proche de ce dont j'ai besoin (pas de bouton d'actualisation et visiblement, ça met à jour en temps réel) mais il y a des spécificités que je n'arrive pas à gommer.

Pour coller à ce qu'il me faudrait, le code doit :
- compiler toutes les feuilles qui pourraient se trouver après une feuille spécifique (ici, tout ce qui se trouve après l'onglet "récap").
- recopier la ligne d'intitulés (mais une seule fois) des colonnes sur la ligne A de l'onglet récap (la structure des fiches utilisateurs sera identique, mais variable : besoin de plus de 10 colonnes possible) mais à partir de la colonne B : en effet, il faudrait que soit recopié en colonne A le nom de l'onglet d'où viennent les données (pour pouvoir identifier qui a fait la saisie)
- le nombre de fiches utilisateurs ne doit pas être borné (pour un maximum de souplesse)

Si quelqu'un pouvait m'aider, ça me serait très utile.
Merci d'avance. :)

Voici le code en question ci-dessous et un fichier test pour la structure.

Option Explicit

Private Sub Worksheet_Activate()
Dim Cible As Range, N As Long
Application.ScreenUpdating = False
Me.[2:65536].Delete
Set Cible = Me.[A2]
For N = 2 To Worksheets.Count - 1
With Worksheets(N): .Range("A2:G" & .[A65536].End(xlUp).Row).Copy: End With
Cible.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Cible.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Set Cible = Cible.Offset(Selection.Rows.Count)
Next N
'Me.[A1:H1].Resize(Cible.Row - 2).Sort Key1:=Me.[G1], Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
Me.[A1].Select
End Sub
 

Pièces jointes

  • TEST récap.xlsx
    13.9 KB · Affichages: 49
Dernière édition:

JCGL

XLDnaute Barbatruc
Re : compilation d'onglets en temps réel (sans bouton)

Bonjour à tous,

Peux-tu essayer avec :

VB:
Option Explicit

Private Sub Worksheet_Activate()
    Dim Cible As Range, N As Long
    Application.ScreenUpdating = False
    [2:65536].Delete
    Set Cible = [A2]
    For N = 4 To Sheets.Count
        With Worksheets(N): .Range("A2:Z" & .[A65536].End(xlUp).Row).Copy: End With
        Cible.PasteSpecial Paste:=xlPasteFormats
        Cible.PasteSpecial Paste:=xlPasteValues
        Set Cible = Cible.Offset(Selection.Rows.Count)
    Next N
    [A1:Z1].Sort Key1:=[A1], Order1:=xlAscending, Header:=xlNo
    [A1].Select
End Sub
 

klin89

XLDnaute Accro
Re : compilation d'onglets en temps réel (sans bouton)

Bonsoir JCGL, nightswan, le forum :)

Elle est où la feuille "récap" :rolleyes:
Sinon, vois ceci :
VB:
Sub Fusion()
Dim ws As Worksheet, LastCell As Range
    Application.ScreenUpdating = False
    For Each ws In Worksheets
        If ws.Name Like "utilisateur*" Then
            Set LastCell = Sheets("synthèse").Range("A" & Rows.Count).End(xlUp)(2)
            With ws.Range("A1").CurrentRegion
                If .Rows.Count > 1 Then
                    With .Resize(.Rows.Count - 1).Offset(1)
                        LastCell.Resize(.Rows.Count, 1).Value = ws.Name
                        LastCell.Resize(.Rows.Count, .Columns.Count).Offset(, 1).Value = .Value
                    End With
                End If
            End With
        End If
    Next
    Application.ScreenUpdating = True
End Sub

Le code ajusté suite au post #4
VB:
Sub Fusion1()
Dim ws As Worksheet, LastCell As Range
    For Each ws In Worksheets
        Select Case ws.Name
            Case "Droits", "listes", "synthèse"
            Case Else
                Set LastCell = Sheets("synthèse").Range("A" & Rows.Count).End(xlUp)(2)
                With ws.Range("A1").CurrentRegion
                    If .Rows.Count > 1 Then
                        With .Resize(.Rows.Count - 1).Offset(1)
                            LastCell.Resize(.Rows.Count, 1).Value = ws.Name
                            LastCell.Resize(.Rows.Count, .Columns.Count).Offset(, 1).Value = .Value
                        End With
                    End If
                End With
        End Select
    Next
End Sub
klin89
 
Dernière édition:

nightswan

XLDnaute Junior
Re : compilation d'onglets en temps réel (sans bouton)

Bonsoir JCGL,

Merci pour ta réponse, j'ai quelques petits soucis avec ton code :

- les onglets (dans le fichier final) seront composés de la 1ère lettre du prénom et le nom complet, ici ne se reportent que les numéros utilisateurs. Il doit y avoir moyen de reporter en colonne A de la synthèse le nom de l'onglet d'où viennent les données,
- sur la feuille BOBAMA, j'ai modifié le libellé de la colonne A, mais cela ne se reporte pas sur la feuille de synthèse. Le but étant que si je change la structure d'une feuille utilisateur (enfin, le nom des libellés de colonnes), cela soit dynamique et se reporte sur la synthèse.

J'ai modifié le fichier en conséquence (j'ai mis en jaune les ajouts pour le test).

Sinon, l'actualisation se fait bien en temps réel et si j'ajoute une colonne, celle-ci se reporte bien.
Merci déjà pour cette première étape.

Klin89 : merci également pour ta réponse, mais je n'arrive pas à exploiter ton code.
Pour l'exemple de JCGL, je mets le code spécifiquement sur la feuille synthèse, mais là, ça ne fonctionne pas.
J'ai créé un module, mais ça ne marche pas non plus. Je ne sais pas comment l'intégrer dans mon fichier.
Après, à la lecture de ta proposition, mes noms d'onglets finaux poseront problème (les feuilles ne seront pas utilisateur1, 2, 3...).
 

Pièces jointes

  • TEST récap JCGL.xlsm
    25.2 KB · Affichages: 35
  • TEST récap JCGL.xlsm
    25.2 KB · Affichages: 46
  • TEST récap JCGL.xlsm
    25.2 KB · Affichages: 44

JCGL

XLDnaute Barbatruc
Re : compilation d'onglets en temps réel (sans bouton)

Bonjour à tous,

Le non des onglets importe peu puisque la seule condition est qu'ils soient en en position 4 et suivantes.
Je ne comprends que toutes les feuilles n'aient pas toutes les mêmes entêtes.
Cela me parait inconcevable avec une base de données exploitable.

A+ à tous
 

nightswan

XLDnaute Junior
Re : compilation d'onglets en temps réel (sans bouton)

Bonsoir,

Je me suis mal exprimé.
Pour la question des noms d'utilisateurs (= le nom des onglets), sur la fiche synthèse, est-il possible en colonne A de reporter le nom de l'onglet d'où proviennent les données. Et ensuite, de la colonne B à K (soit 10 colonnes actuellement), les données de toutes les feuilles comme ça se fait avec le code donné ?

Pour les entêtes de feuilles, les fiches utilisateurs auront toutes la même structures (même nombre de colonnes, mêmes intitulés de colonnes). J'ai voulu tester si une modification d'entête se reportait automatiquement dans la fiche synthèse.

Merci.
 

Si...

XLDnaute Barbatruc
Re : compilation d'onglets en temps réel (sans bouton)

salut

autres propositions avec plages nommées et évènementielle
Code:
Option Explicit
Sub Fusion()
  Dim n As Byte, R As Range
  Rows("2:65000").Delete
  For n = 1 To 5
    Set R = [B65000].End(xlUp)(2)
    R(1, 0) = "utilisateur" & n
    Range("_" & n).Copy R
  Next
End Sub
ou, avec des noms différents (à adapter)
Code:
Sub Fusion()
  Dim n As Byte, R As Range
  Rows("2:65000").Delete
  For n = 1 To 5
    Set R = [B65000].End(xlUp)(2)
    R(1, 0) = Array("nom1", "nom2", "nom3", "nom4", "nom5")(n - 1)
    Range("_" & n).Copy R
  Next
End Sub

et avec Tableaux.
 

Pièces jointes

  • fusion2.xlsm
    323.3 KB · Affichages: 38
  • fusion.xlsm
    428.8 KB · Affichages: 39
  • fusion.xlsm
    428.8 KB · Affichages: 48
  • fusion.xlsm
    428.8 KB · Affichages: 49

nightswan

XLDnaute Junior
Re : compilation d'onglets en temps réel (sans bouton)

Salut Si...

Merci pour ta proposition, la mise en page est très claire ainsi mais un peu plus compliquée à mettre en œuvre.
Le tableau sera à terme utiliser par une collègue qui n'est pas très à l'aise sur Excel et puis, nous sommes (encore) sous Excel 2003 au boulot et c'est pour un usage professionnel que cela se destine (bilans de contrôles d'un service), donc je pense que ta solution n'est pas fonctionnelle sous 2003.

En fait, la solution de JCGL me va très bien, cela reste souple (un ajout de feuille est aussitôt pris en compte, si une colonne supplémentaire est requise - la structure des fiches utilisateurs est fixe : possible de passer de 10 à 11 colonnes, mais dans ce cas, tout le monde devra renseigner 11 colonnes - elle est prise en compte également).

Il me manque juste un code pour qu'en colonne 1 de la fiche synthèse, soit précisé le nom d'onglet d'où viennent les données.
C'est indispensable pour savoir qui a fait tels contrôles.

Et si c'est possible, que les intitulés de colonne de la fiche synthèse (la ligne A) "pilotent" l'ensemble des libellés des fiches utilisateurs, peu importe leur nombre. Comme ça en cas d'ajout (ou plus rarement modification légère d’un libellé en cours d'année), tout se met à jour.
Au pire, je peux faire ça en groupe de travail, mais si ça peut se faire en automatique, ce serait appréciable.

Merci d'avance.

PS : j'ai trouvé ceci, mais c'est à adapter dans mon cas (c'est pour créer un simple sommaire des feuilles si j'ai bien suivi).
A priori, le rapatriement des noms se fait et crée un lien hypertexte. Si c'est faisable (d'avoir un lien directement qui pointera directement sur la ligne du contrôle de l'utilisateur en question, ce serait encore plus pratique).

Sub MaMacro()
Dim I As Integer
ActiveWorkbook.Worksheets(1).S​elect
ActiveSheet.Range("A2urren​tRegion.ClearContents
For I = 2 To ActiveWorkbook.Worksheets.Coun​t
ActiveSheet.Range("A).Select
ActiveSheet.Hyperlinks.Add _

Anchor:=Selection, _

Address:="", _

SubAddress:="'" & Worksheets(I).Name & "'!A1", _

TextToDisplay:=Worksheets(I).N​ame
ActiveSheet.Range("B) = Worksheets(I).Range("H3" )
Next
Cancel = True
End Sub
 

Pièces jointes

  • TEST récap JCGL.xlsm
    26.3 KB · Affichages: 39
  • TEST récap JCGL.xlsm
    26.3 KB · Affichages: 44
  • TEST récap JCGL.xlsm
    26.3 KB · Affichages: 31
Dernière édition:

JCGL

XLDnaute Barbatruc
Re : récupération noms d'onglets sur une fiche synthèse

Bonjour à tous,

Peux-tu essayer ceci :

VB:
Option Explicit

Private Sub Worksheet_Activate()
    Dim Cible As Range, N As Long
    Application.ScreenUpdating = False
    [2:65536].Delete
    Set Cible = [B2]
    For N = 4 To Sheets.Count
        With Worksheets(N): .Range("A2:Z" & .[A65536].End(xlUp).Row).Copy: End With
        Cible.PasteSpecial Paste:=xlPasteFormats
        Cible.PasteSpecial Paste:=xlPasteValues
        Cible.Offset(0, -1) = Worksheets(N).Name
        Set Cible = Cible.Offset(Selection.Rows.Count)
        Sheets("Synthèse").Range("A1:Z1").Copy Worksheets(N).Range("A1")
    Next N
    [A1:Z1].Sort Key1:=[A1], Order1:=xlAscending, Header:=xlNo
    [A1].Select
End Sub

A+ à tous
 

JCGL

XLDnaute Barbatruc
Re : récupération noms d'onglets sur une fiche synthèse

Bonjour à tous,

J'avais oublié ton souhait d'avoir des liens hypertextes :

VB:
Option Explicit

Private Sub Worksheet_Activate()
    Dim Cible As Range, N As Long
    Application.ScreenUpdating = False
    [2:65536].Delete
    Set Cible = [B2]
    For N = 4 To Sheets.Count
        With Worksheets(N): .Range("A2:Z" & .[A65536].End(xlUp).Row).Copy: End With
        Cible.PasteSpecial Paste:=xlPasteFormats
        Cible.PasteSpecial Paste:=xlPasteValues
        Cible.Offset(0, -1) = Worksheets(N).Name
        Cible.Offset(0, -1).Hyperlinks.Add Anchor:=Cible.Offset(0, -1), Address:="", SubAddress:="'" & Worksheets(N).Name & "'!A1", TextToDisplay:=Worksheets(N).Name
        Set Cible = Cible.Offset(Selection.Rows.Count)
        Sheets("Synthèse").Range("A1:Z1").Copy Worksheets(N).Range("A1")
    Next N
    [A1:Z1].Sort Key1:=[A1], Order1:=xlAscending, Header:=xlNo
    With Columns("A:Z")
        .EntireColumn.AutoFit
        .HorizontalAlignment = xlCenter
    End With
    [A1].Select
End Sub

A+ à tous
 

Si...

XLDnaute Barbatruc
Re : récupération noms d'onglets sur une fiche synthèse

Salut
Autre code
Code:
Private Sub Worksheet_Activate()
  Dim R As Range, N As Long
  Application.ScreenUpdating = False
  For N = 4 To Sheets.Count
     Set R = [B65000].End(xlUp)(2)
     R(1, 0) = Sheets(N).Name
     ActiveSheet.Hyperlinks.Add Anchor:=R(1, 0), Address:="", _
        SubAddress:="'" & R(1, 0) & "'!A1", TextToDisplay:=R(1, 0).Text
     With Worksheets(N): .Range("A2:Z" & .[A65536].End(xlUp).Row).Copy R: End With
  Next
  [A1].Select
End Sub
Et pour alléger le fichier
Code:
Private Sub Worksheet_Deactivate()
  [2:65536].Delete
End Sub

Dis-moi JCGL:D, qu’est censé faire l'instruction
[A1:Z1].Sort Key1:=[A1], Order1:=xlAscending, Header:=xlNo ?​
Et quelle est l’intérêt de celle-ci
Sheets("Synthèse").Range("A1:Z1").Copy Worksheets(N).Range("A1") ?​
 

JCGL

XLDnaute Barbatruc
Re : récupération noms d'onglets sur une fiche synthèse

Bonjour à tous,

Dis-moi JCGL:D, qu’est censé faire l'instruction
[A1:Z1].Sort Key1:=[A1], Order1:=xlAscending, Header:=xlNo ?​
Et quelle est l’intérêt de celle-ci
Sheets("Synthèse").Range("A1:Z1").Copy Worksheets(N).Range("A1") ?​

La première ligne ne sert à rien, la deuxième copie les entêtes de la feuille Synthèse sur les entêtes des feuilles individuelles comme souhaité par notre ami.

A+ à tous
 
Dernière édition:

Si...

XLDnaute Barbatruc
Re : récupération noms d'onglets sur une fiche synthèse

re

Excuse-moi JCGL mais je n’avais ajouté qu’une colonne (dans l’onglet "synthèse") et testé ta macro avec ce fichier* en obtenant un résultat bizarre.

*ci-joint et dans lequel j'ai rajouté la ligne concernée
 

Pièces jointes

  • fusion3.xlsm
    26.3 KB · Affichages: 41
  • fusion3.xlsm
    26.3 KB · Affichages: 49
  • fusion3.xlsm
    26.3 KB · Affichages: 51

nightswan

XLDnaute Junior
Re : récupération noms d'onglets sur une fiche synthèse

Merci à tous les deux (notamment à JCGL pour ce retour sur le sujet).

Le fichier de JCGL ne prend pas en compte le décalage induit par l'ajout de la colonne avec le nom d'onglet dans la synthèse, du coup, ça décale tout dans les fiches individuelles. C'est corrigé dans le fichier de Si...

Une petite précision pour la question du lien hypertexte, en fait, je voudrais voir apparaître sur chaque ligne le nom du contrôleur (il y aura des filtres automatiques sur la fiche synthèse) et que le lien hypertexte permette de mettre en surbrillance sur la feuille d'origine la ligne correspondante une fois qu'on arrive dessus, enfin, si c'est possible.

Merci.
 

Pièces jointes

  • fusion3.xlsm
    27.1 KB · Affichages: 46
  • fusion3.xlsm
    27.1 KB · Affichages: 58
  • fusion3.xlsm
    27.1 KB · Affichages: 57
Dernière édition:

nightswan

XLDnaute Junior
Re : fiche synthèse à partir de plusieurs onglets...

Bonjour,

Je reviens sur ce projet qui est presque terminé. J'ai pu rendre le fichier exclusif par utilisateur (avec ID et MDP) et ça à l'air de fonctionner.
J'ai encore quelques petites choses à régler dessus :

- Quand une personne n'a effectué aucun contrôle, sur l'onglet synthèse, je récupère l'intitulé des colonnes. Comment éviter cela ?
- Si une cellule de la colonne A (fiche individuelle) n'est pas renseignée, le report ne s'effectue pas sur l'onglet synthèse. Ce n'est pas grave en soi, mais si ça peut être corrigé sans difficulté.
- Il faudrait vraiment que le nom du contrôleur soit reporté à chaque ligne de contrôle (ici, seule la première ligne avec un lien hypertexte comporte ce nom). J'ai pensé à l'ajout d'une colonne qui serait masquée pour le gestionnaire avec récupération du nom d'onglet (=STXT(CELLULE("nomfichier");TROUVE("]";CELLULE("nomfichier"))+1;20)), mais sur la synthèse, la formule récupère le nom de l'onglet et m'affiche synthèse, donc, ça ne marche pas.
- J'ai réussi (du moins je pense) à rendre mes listes (sur l'onglet du même nom) souples en cas d'ajouts de personnes. Par contre, dans les fiches individuelles (colonne I), ma table matrice pour la formule est figée avec $E$2:$F$266. J'ai mis large exprès, mais y-a-t-il moyen de rendre également cette table variable (en fonction du nombre de personne sur les colonnes E et F).

J'espère avoir été clair dans ma problématique.
Pour l'accès au fichier : ADMIN puis admin
pour accéder aux fiches individuelles si besoin :
a1 puis 1
a2 puis 2... a5 puis 5.

Merci d'avance.
 
Dernière édition:

Discussions similaires

Réponses
5
Affichages
133

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 294
Messages
2 086 895
Membres
103 404
dernier inscrit
sultan87