XL 2019 Moyenne de valeurs par date à partir d'un tableau

Olocsob

XLDnaute Nouveau
Bonjour à tous,
J'essaie tant bien que mal de construire un fichier permettant de créer des moyennes classées par date.
Je m'explique. Plusieurs analyses sont faites par jour et chacune de ces analyses sortent une valeur (en %). J' aimerais donc pouvoir effectuer un tri permettant de regrouper les analyses par date et donc effectuer ensuite une moyenne de ces valeurs (toujours par date) dans des colonnes à coté. Par rapport au fichier, j'aimerais que seul la colonne date soit reportée sur une colonne préalablement décidée avec la macro sachant que la colonne des valeurs se trouve dans une colonne non contiguës à celle de la date. C'est-à-dire, avoir une colonne de titres "Date" avec les jours qui s'affiche (exemple : 26/03/2022 sur G2, puis 27/03/2022 sur G3 même si plusieurs analyses sont faites par jour) et une colonne "Moyenne MRI" effectuant la moyenne de toutes les valeurs (exemple : la moyenne des différentes valeurs des analyses effectuées le 26/03/2022 en H2 et la moyenne des valeurs du 27/03/2022 en H3 et ainsi de suite).
J'ai fournis un fichier test possédant la macro en question.
Voici également le code utilisé dans celle-ci en dessous.
VB:
Sub MoyenneDate()

    Dim DL%, T, Tout, M, i%, j%, k%, NbL%
    DL = Range("A5000").End(xlUp).Row

    T = Range("A2:E2" & DL)                                                           ' On transfert lse données dans le tableau T
    M = Range("D2" & DL)
    Titres = Range("A1,D1").Value                                                     ' On récupère les titres (pour mettre dans les feuilles qui n'existent pas)
    For i = 1 To UBound(T)                                                              ' Pour toutes les lignes
        ReDim Tout(UBound(T), 11)                                                       ' On redimensionne le tableau de sortie
        NbL = 0                                                                         ' Init du pointeur du tableau de sortie
        Libellé = T(i, 1)                                                               ' On récupère le libellé
        If Libellé <> "" Then                                                           ' Si non vide
            For j = 1 To UBound(T)                                                      ' On parcourt toutes les lignes
                If T(j, 1) = Libellé Then                                               ' Si c'est le bon libellé
                    For k = 0 To 3                                                      ' On transfert la ligne dans le tableau de sortie
                        Tout(NbL, k) = T(j, k + 1)
                    Next k
                    T(j, 1) = ""                                                        ' On efface le libellé du tableau d'entrée car déjà traité
                    NbL = NbL + 1                                                       ' On incrémente l'indice du tableau de sortie
                End If
            Next j
            On Error Resume Next
            Range("F1:J1") = Titres                                                   ' On initialise la ligne des titres
            Range("F2:J2") = T
            Range("K2") = Application.Average(M)
        End If
    Next i
  

End Sub
 

Pièces jointes

  • Test.xlsm
    15.1 KB · Affichages: 4
Solution
Bonjour

Si tu parcours les forums, tu verras qu'on déconseille fortement de créer des TCD par VBA

On crée le TCD puis selon les besoins, on peut par VBA l'actualiser ou en changer la source...

Tu peux constuire le TCD, vider le tableau source : il suffira d'actualiser après remplissage

Par ailleurs un TCD se construit sur un tableau structuré et non une plage fixe

chris

XLDnaute Barbatruc
Bonjour

Pourquoi VBA et pas un simple TCD qu'il suffit d'actualiser à volonté ?

1651737164757.png


Par ailleurs, si les valeurs sont des %, mathématiquement la moyenne est généralement fausse car on ne fait pas de moyennes de pourcentages ni de moyenne de moyennes...
 

Olocsob

XLDnaute Nouveau
Bonjour chris,

Merci de votre réponse pour commencer. Effectivement j'avais totalement oublié le fait de pouvoir faire un TCD. Malheureusement, j'aimerais qu'il soit effectué par une macro pour plus de simplicité au sein de l'entreprise dans laquelle je travaille. J'ai donc créer ce tableau à la main en prenant soin d'activer l'enregistrement de macro. Cependant une fois l'enregistrement terminé, je supprime mon TCD afin de pouvoir activer la macro et vérifier son bon fonctionnement. Cela m'affiche constamment une erreur "Argument ou appel de procédure incorrect"... Est-ce normal ? Que dois-je modifier pour que cela puisse ce faire sans encombre ?
VB:
Sub CreerTableau()
'
' CreerTableau Macro
'
' Touche de raccourci du clavier: Ctrl+w
'
    Range("V23").Select
    ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
        "Carte de contrôle MRI!R23C1:R500C4", Version:=6).CreatePivotTable _
        TableDestination:="Carte de contrôle MRI!R23C22", TableName:= _
        "Tableau croisé dynamique", DefaultVersion:=6
    Sheets("Carte de contrôle MRI").Select
    Cells(23, 22).Select
    With ActiveSheet.PivotTables("Tableau croisé dynamique")
        .ColumnGrand = True
        .HasAutoFormat = True
        .DisplayErrorString = False
        .DisplayNullString = True
        .EnableDrilldown = True
        .ErrorString = ""
        .MergeLabels = False
        .NullString = ""
        .PageFieldOrder = 2
        .PageFieldWrapCount = 0
        .PreserveFormatting = True
        .RowGrand = True
        .SaveData = True
        .PrintTitles = False
        .RepeatItemsOnEachPrintedPage = True
        .TotalsAnnotation = False
        .CompactRowIndent = 1
        .InGridDropZones = False
        .DisplayFieldCaptions = True
        .DisplayMemberPropertyTooltips = False
        .DisplayContextTooltips = True
        .ShowDrillIndicators = True
        .PrintDrillIndicators = False
        .AllowMultipleFilters = False
        .SortUsingCustomLists = True
        .FieldListSortAscending = False
        .ShowValuesRow = False
        .CalculatedMembersInFilters = False
        .RowAxisLayout xlCompactRow
    End With
    With ActiveSheet.PivotTables("Tableau croisé dynamique").PivotCache
        .RefreshOnFileOpen = False
        .MissingItemsLimit = xlMissingItemsDefault
    End With
    ActiveSheet.PivotTables("Tableau croisé dynamique").RepeatAllLabels _
        xlRepeatLabels
    ActiveWorkbook.ShowPivotTableFieldList = True
    With ActiveSheet.PivotTables("Tableau croisé dynamique").PivotFields("Date")
        .Orientation = xlRowField
        .Position = 1
    End With
    ActiveSheet.PivotTables("Tableau croisé dynamique").AddDataField ActiveSheet. _
        PivotTables("Tableau croisé dynamique").PivotFields("Valeur du MRI (%)"), _
        "Somme de Valeur du MRI (%)", xlSum
    With ActiveSheet.PivotTables("Tableau croisé dynamique").PivotFields( _
        "Somme de Valeur du MRI (%)")
        .Caption = "Moyenne de Valeur du MRI (%)"
        .Function = xlAverage
    End With
    ActiveWorkbook.ShowPivotTableFieldList = False
    ActiveWorkbook.RefreshAll
    ActiveWindow.ScrollRow = 24
    ActiveWindow.ScrollColumn = 5
End Sub
Ainsi, une fois le tableau crée, les personnes de l'entreprise ayant besoin de ce tableau automatique (ils ne savent pas tous, malheureusement pour nous, utiliser excel) auraient juste à actualiser une fois leur données entrées.
 

chris

XLDnaute Barbatruc
Bonjour

Si tu parcours les forums, tu verras qu'on déconseille fortement de créer des TCD par VBA

On crée le TCD puis selon les besoins, on peut par VBA l'actualiser ou en changer la source...

Tu peux constuire le TCD, vider le tableau source : il suffira d'actualiser après remplissage

Par ailleurs un TCD se construit sur un tableau structuré et non une plage fixe
 

Discussions similaires

Statistiques des forums

Discussions
314 708
Messages
2 112 092
Membres
111 416
dernier inscrit
philipperoy83