Calcul à partir d'un TCD
Bonjour,
Je me tourne vers vous puisque je ne trouve pas mon bonheur sur le net
Commençons par le contexte et une présentation de mes données.
Imaginez 5 plantes. Vous mesurez la superficie de chaque feuille. Pour mesurer la superficie foliaire totale, vous devez sommer la superficie de chaque feuille d'une plante. Jusque-là, le tableau croisé dynamique d'excel m'aide très bien : je met dans la partie "valeur" la "somme de la superficie", et je me retrouve avec mes sommes pour chaque plante. Merci Excel
Mais là ou ça se complique, c'est que je voudrais que le TCD me fasse ensuite la moyenne des sommes qu'il vient de me faire. Autrement dit, je voudrais calculer la moyenne des superficies foliaires totales de mes 5 plantes ! Et donc utilisé les résultats que m'a fourni le TCD (en l’occurrence la somme de la superficie de toute les feuilles d'une plante) pour en faire une moyenne (ici, sur 5 plantes).
Pas évident d'expliquer cela clairement, même si c'est tout bête à comprendre
Est-ce que quelqu'un voit de quoi je parle ?
Je vous met en pièce jointe un exemple avec quelques explications supplémentaires !
Merci !
Flippy18.
Salut Flippy et bienvenue sur le Forum,
Je suis parti de l’idée que tu avais toujours un titre en F1 puis un premier texte en F2, puis des chiffres en F3 et suivant, etc. puis un texte « Total général » à la fin de la colonne F. J’ai simulé un tel deuxième tableau sur la Feuil2 afin d’effectuer plus de tests.
En cliquant sur le bouton « Mise à jour des moyennes », ça efface alors la colonne H et ça recalcule toutes les moyennes.
Voici ce code :
Option Explicit
Sub aa()
Dim Première_Ligne As Integer, Dernière_Ligne As Integer
Application.ScreenUpdating = False
Range("H:H").ClearContents
Range("F2").Activate
Retour:
Première_Ligne = ActiveCell.Row
Do Until IsNumeric(ActiveCell.Offset(1, 0)) = False
If ActiveCell = "Total général" Then Exit Sub
ActiveCell.Offset(1, 0).Activate
Loop
Dernière_Ligne = ActiveCell.Row
Range("H" & Première_Ligne) = "Moyenne " & Range("F" & Première_Ligne)
Range("H" & Première_Ligne + 1) = Application.Sum(Range(Cells(Première_Ligne + 1, 7), Cells(Dernière_Ligne, 7))) / (Dernière_Ligne - Première_Ligne)
ActiveCell.Offset(1, 0).Activate
GoTo Retour
End SubPeut-être que ce serait possible sans macro, par l’intermédiaire du TCD, mais ça je ne sais pas le faire
Cordialement.
Salut Yvouille !
Tout d'abord, merci pour la rapidité de ta réponse.
Il est vrai que je recherche plus à exploiter la puissance du TCD, que de me lancer dans des macros.
Ma base de donnée faisant plus de 4000 lignes et 10 colonnes, je souhaite avoir un tableau/résultat facilement exploitable statistiquement derrière, et non des résultats un petit peu éparpillés avec une macro.
MAIS : je ne me suis jamais lancé dans l'apprentissage du VBA, et je pense pouvoir faire quelque chose de sympa avec une macro.
Donc de 2 choses l'une : merci pour ton bout de code que je vais m'amuser à decrypter, et d'autre part, aurais-tu un site à me conseiller pour me lancer dedans ? Plus j'utilise excel, plus je cherche à faire des manipulations poussées et je ne vais plus pouvoir passer à côté éternellement...
Encore merci,
Flippy.
NB1 : Si quelqu'un connait la manip pour répondre au problème initial via TCD, je suis toujours preneur !
NB2 ; J'ai temporairement résolu mon problème en modifiant la structure du TCD, me permettant de calculer mes moyennes avec la fonction adéquat et en utilsant la poignée de recopie. C'est pas très sex comme solution, mais avec un peu d'organisation, ça dépanne.
Bonjour,
Une proposition à tester et à adapter, avec une fonction personnalisée qui compte le nombre d'espèces,
un champ nommé et une colonne intermédiaire.
A te relire, certainement
Coef (voir gestionnaire de noms)
=compter_uniques(DECALER(Feuil1!$A$2;;;NBVAL(Feuil1!$A:$A)-1))'ALT F11 (pour ouvrir l'éditeur VBE)
Option Explicit
Function compter_uniques(plage As Range) As Long
Dim dico
Dim cellule As Range
Dim ref
Set dico = CreateObject("scripting.dictionary")
For Each cellule In plage
ref = cellule.Value
If Not dico.exists(ref) Then
dico.Add ref, ref
End If
Next
compter_uniques = dico.Count
End Function