XL 2013 Réorganisation tableau

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Lorenzo69000

XLDnaute Nouveau
Bonsoir à vous et merci pour le temps que vous consacrerez peut être à cette question.
Je possède un planning qui va me servir de base de rapport.
Je souhaite faire le plus simple possible pour des raisons de facilité à l'usage car je ne serai pas le seul à utiliser ce tableau.
Je possède un onglet contenant un planning journalier qui indique quel type de séance effectue chaque jour un adhérent.
Je souhaite pouvoir envoyer à chaque adhérent un récapitulatif MENSUEL du nombre de type de seance qu'il a fait mais surtout à quelle date.
Pour le type de séance : nb.si
En revanche pour lister les dates par typologie et par client j'avoue je sèche ..... :-(
Je souhaite éviter macro,VBA et TCD (car le TCD a entretenir me semble compliqué notamment sur les ajouts de nouveaux adhérents, le nom de client qui vient d'un tableau via RECHERCHEV etc etc ).
Voyez vous un moyen simple de pouvoir réaliser cet onglet rapport pour un mois donné par adhérent?
En espérant être clair .
je vous remercie de vos avis éclairés par avance
Cordialement,
 

Pièces jointes

Bonjour

Tu as posté en double...

...Je souhaite éviter macro,VBA et TCD (car le TCD a entretenir me semble compliqué notamment sur les ajouts de nouveaux adhérents...

Le souci est que travailler avec un tableau à double entrée avec un nombre de colonnes qui ne va cesser d’évoluer n'est pas la meilleure approche.

Une liste des séances de 3 colonnes avec date, Nom adhérent et N° de séance, permettrait une exploitation simple et efficace...
 
Bonjour

Tu as posté en double...



Le souci est que travailler avec un tableau à double entrée avec un nombre de colonnes qui ne va cesser d’évoluer n'est pas la meilleure approche.

Une liste des séances de 3 colonnes avec date, Nom adhérent et N° de séance, permettrait une exploitation simple et efficace...

Bonsoir Chris, oui j'ai posté en double .. un mauvais refresh ou bien mes gants d'hiver que j'avais tout simplement oublié d'enlever... rires. Plus sérieusement je n'ai pas vu comment annuler un des deux messages :-(
Concernant l'organisation des datas je suis tout a fait raccord avec toi.
je suis partie sur ce tableau à double entrée car cela me semblait être la meilleure façon de présenter un planning journalier ... une ligne pour une journée .... ce qui limite les erreurs de saisie et est plus simple visuellement ... Me semble t il mais je partirai finalement sur 3 colonnes si je ne trouve pas d'autres solutions plus simple. Tant pis dans ce cas pour l'idée de Planning journalier ... snif !
merci en tout cas de ta réponse.
 
Bonsoir Lorenzo69000, le forum 🙂

Vois ceci :
VB:
Option Explicit
Sub test()
Dim dico As Object, a, w(), i As Long, col As Byte
Dim e, v, n As Long, t As Long
    Set dico = CreateObject("Scripting.Dictionary")
    a = Sheets("Planning").Range("a4").CurrentRegion.Value
    For col = 2 To UBound(a, 2)
        Set dico(a(1, col)) = _
        CreateObject("Scripting.Dictionary")
        dico(a(1, col)).CompareMode = 1
        For i = 2 To UBound(a, 1)
            If Not dico(a(1, col)).exists(a(i, col)) Then
                ReDim w(1 To 2, 1 To 1)
                w(1, 1) = a(i, col)
            Else
                w = dico(a(1, col))(a(i, col))
                ReDim Preserve w(1 To UBound(w, 1), 1 To UBound(w, 2) + 1)
            End If
            w(2, UBound(w, 2)) = a(i, 1)
            dico(a(1, col))(a(i, col)) = w
        Next
    Next
    Application.ScreenUpdating = False
    With Sheets("Rapport")
        .Cells.Clear
        With .Range("a1")
            For Each e In dico
                With .Offset(n, t).Resize(1, 2)
                    .Value = Array(e, "date")
                    .Font.Bold = True
                    .Interior.ColorIndex = 43
                    .BorderAround Weight:=xlThin
                    .Borders(xlInsideVertical).Weight = xlThin
                End With
                n = 1
                For Each v In dico(e)
                    With .Offset(n, t).Resize(UBound(dico(e)(v), 2), UBound(dico(e)(v), 1))
                        .FormulaLocal = Application.Transpose(dico(e)(v))
                        .BorderAround Weight:=xlThin
                        .Borders(xlInsideVertical).Weight = xlThin
                        With .Cells(1)
                            .Interior.ColorIndex = 36
                            .BorderAround Weight:=xlThin
                        End With
                    End With
                    n = n + UBound(dico(e)(v), 2)
                Next
                n = 0: t = t + 3
            Next
        End With
        With .UsedRange.Cells
            .Font.Size = 10
            .Font.Name = "calibri"
            .HorizontalAlignment = xlCenter
            .VerticalAlignment = xlCenter
        End With
    End With
    Set dico = Nothing
    Application.ScreenUpdating = True
End Sub
klin89
 
Bonjour Lorenzo69000, eddy1975, chris, klin89,

Une solution assez simple par formules dans le fichier joint.

Dans la feuille "Rapport" les formules en B8 et C8 sont à tirer jusqu'à la ligne 38.

Ce n'est pas exactement la configuration que vous voulez mais à mon avis c'est tout aussi utile pour le client.

Par ailleurs avec le filtre automatique on peut filtrer les séances.

A+
 

Pièces jointes

Re,

Dans ce ficher (2) la configuration est celle indiquée dans le fichier du post #1.

Formule matricielle en E5 :
Code:
=SIERREUR(INDEX(Planning!$A:$A;PETITE.VALEUR(SI((ANNEE(Dates)=ANNEE($C$4))*(MOIS(Dates)=MOIS($C$4))*(DECALER(Dates;;EQUIV($C$5;Adhérents;0))=E$4);LIGNE(Dates));LIGNES(E$5:E5)));"")
A valider par Ctrl+Maj+Entrée et à tirer à droite et vers le bas jusqu'à la ligne 35.

Edit : bien sûr pour l'envoi au client les colonnes sans dates seront masquées.

A+
 

Pièces jointes

Dernière édition:
Bonjour,

Code:
Dim TblE(), TblS(), n
Sub Rapport()
  Application.ScreenUpdating = False
  Set f1 = Sheets("planning")
  Set AdrResult = Sheets("Rapport").Range("A1")
  For Adh = 1 To 2
    f1.[A1].CurrentRegion.Sort , key1:=f1.[B2].Offset(, Adh - 1), key2:=f1.[A2], Header:=xlYes
    TblE = f1.Range("A2").CurrentRegion.Value                        ' Table entrée
    ReDim TblS(1 To UBound(TblE), 1 To UBound(TblE, 2))           ' Table sortie
    CalculAdh Adh + 1
    AdrResult.Offset(1, (Adh - 1) * 3).Resize(n - 1, 2) = TblS
    AdrResult.Offset(, (Adh - 1) * 3) = TblE(1, Adh + 1)
  Next Adh
End Sub

Sub CalculAdh(col)
  i = 2: n = 1
  Do While i <= UBound(TblE)
    clé = TblE(i, col)
    TblS(n, 1) = clé
    Do While TblE(i, col) = clé
       TblS(n, 2) = TblE(i, 1)
       n = n + 1
       i = i + 1: If i > UBound(TblE) Then Exit Do
    Loop
  Loop
End Sub




Bonjour Nicole
Je vous remercie. Je vais regarder cela même si je ne suis pas très a l'aise avec le VBA 🙂. Merci beaucoup en tout cas!
 
Re,

Dans ce ficher (2) la configuration est celle indiquée dans le fichier du post #1.

Formule matricielle en E5 :
Code:
=SIERREUR(INDEX(Planning!$A:$A;PETITE.VALEUR(SI((ANNEE(Dates)=ANNEE($C$4))*(MOIS(Dates)=MOIS($C$4))*(DECALER(Dates;;EQUIV($C$5;Adhérents;0))=E$4);LIGNE(Dates));LIGNES(E$5:E5)));"")
A valider par Ctrl+Maj+Entrée et à tirer à droite et vers le bas jusqu'à la ligne 35.

Edit : bien sûr pour l'envoi au client les colonnes sans dates seront masquées.

A+

Bonjour Job75,
Ouah je n'avais pas pensé a Matrix !!! Merci beaucoup. pour la colonne masquée cela n'est pas gênant car le document sera PDFisé .. merci beaucoup encore
 
Re,

Dans ce ficher (2) la configuration est celle indiquée dans le fichier du post #1.

Formule matricielle en E5 :
Code:
=SIERREUR(INDEX(Planning!$A:$A;PETITE.VALEUR(SI((ANNEE(Dates)=ANNEE($C$4))*(MOIS(Dates)=MOIS($C$4))*(DECALER(Dates;;EQUIV($C$5;Adhérents;0))=E$4);LIGNE(Dates));LIGNES(E$5:E5)));"")
A valider par Ctrl+Maj+Entrée et à tirer à droite et vers le bas jusqu'à la ligne 35.

Edit : bien sûr pour l'envoi au client les colonnes sans dates seront masquées.

A+


Bonjour Job75
Merci 1000 fois c'est exactement ce que je souhaitais pour faire sans y arriver. Merci merci merci !!!!!! Merci du temps mais aussi du "comment" et enfin merci de m'avoir montré que c'était possible de trouver une solution 🙂
 
Re,

Je suis enfin arrivé à ne pas afficher en ligne 4 les séances [sans dates] Edit : pas utilisées.

Formule matricielle un peu compliquée en E4 à tirer sur E4:K4 :
Code:
=SIERREUR(INDEX(Seances;PETITE.VALEUR(SI(NB.SI(DECALER(Dates;;EQUIV($C$5;Adhérents;0));Seances);LIGNE(Seances));COLONNES($E4:E4)));"")
Par ailleurs il faut compléter la formule en E5 (sur E5:K35) avec =SI(E$4="";"";XXXX)

Fichier (3).

A+
 

Pièces jointes

Dernière édition:
Re,

Pour tester j'ai complété les colonnes A et B de la feuille "Planning" jusqu'au 31/12/2025 (9 années).

Le tableau comporte donc 3287 lignes de données.

La mesure de la durée du recalcul des formules (toutes volatiles) se fait par cette macro :
Code:
Sub TestRecalcul()
Dim t
t = Timer
Calculate
MsgBox "Recalcul en " & Format(Timer - t, "0.00 \s")
End Sub
Résultat chez moi sur Win 10 - Excel 2013=> 0,36 s.

C'est tout à fait acceptable, le VBA n'est donc pas nécessaire.

A+
 

Pièces jointes

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
18
Affichages
695
Réponses
12
Affichages
622
Réponses
1
Affichages
124
Retour