XL 2013 Réorganisation tableau

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

  • test.xlsx
    10.6 KB · Affichages: 50

chris

XLDnaute Barbatruc
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...
 

Lorenzo69000

XLDnaute Nouveau
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.
 

klin89

XLDnaute Accro
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
 

job75

XLDnaute Barbatruc
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

  • test(1).xlsx
    21.1 KB · Affichages: 31

job75

XLDnaute Barbatruc
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

  • test(2).xlsx
    23.3 KB · Affichages: 28
Dernière édition:

Lorenzo69000

XLDnaute Nouveau
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!
 

Lorenzo69000

XLDnaute Nouveau
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
 

Lorenzo69000

XLDnaute Nouveau
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 :)
 

job75

XLDnaute Barbatruc
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

  • test(3).xlsx
    23.8 KB · Affichages: 21
Dernière édition:

job75

XLDnaute Barbatruc
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

  • test(3).xlsx
    23.7 KB · Affichages: 20
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 111
Messages
2 085 403
Membres
102 883
dernier inscrit
jameseyz