Calcul décile Excel

Bonjour,

Bonjour tout le monde

J'ai un tableau dans lequel j'ai des colonnes de chiffre de la ligne 1 à la ligne 548, et

à la place de ces chiffres je veux avoir D1, D2, D3.....jusqu'à D9 ce qui correspond aux 9 déciles et ce pour chaque colonne.

Par exemple le premier chiffre est à la ligne 17 colonne 8 (parceque y'a des cellules ou y'a rien cela je veux les laisser vide): c'est 54 (les chiffres vont de 1 à 100):
je veux une formule qui me trouve à quel décile ce chiffre appartient et si c'est au décile 3 par exemple je veux avoir D3 et pas 17 (D3 est le décile 3 baser sur le calcul des deciles de la colonne en question et ce colonne par colonne)

Merci beaucoup de me lire et de l'aide que vous pourrez m'apporter.

6 réponses

  • Votes
  • Date
  • Date décroissante
  1. Bon..
    Je sais pas pourquoi c'est différent mais jbalance ca comme ca.
    En tout cas merci beaucoup.
    1. Merci beaucoup pour ton aide

      sinon
      pour les cellules vides c bon ces cellules reste vide

      Mais avec cette macro ca m'affiche toujours un ou deux décile en dessous ou au dessus par rapport à excel avec la fonction centile.

      par exemple à la ligne 27 avec cette macro on a D8 D8 D8 D1 D1 D1 D1....

      et avec ma fonction centile d'excel (à la ligne 1027) D9 D9 D9 D3 D3 D3 D3

      Donc je sais pas pourquoi

      en tout cas merci bien. jvais essayer dbosser dessus pour essayer dcomprendre pourquoi
      1. Contributeur
        J'avais testé sur un petit tableau aléatoire, les déciles avaient la même valeur sur la feuille et en vba.
        De plus WorksheetFunction.Percentile fait appel à la fonction centile() des feuilles
        Sans fichier exemple avec erreur impossible de rechercher qcq chose...
        Après avoir déposé ton fichier sur cijoint.fr il faut coller le lien fourni ici.
        eric
    2. Jte remercie beaucoup pour ton aide.

      mes chiffres vont de AM20 à FB619 avec beaucoup de cellules vide qui doivent rester vide et avec cette macro j'ai des D10 un peu partout y compris la ou j'ai des cellules vides.

      Sinon en comparant à une colonne que je fait sur Excel en utilisant la fonction centile à part les D10 que j'ai à la place des cellules vides j'ai des petites différences pour le dernier décile du style j'ai D10 avec cette macro et moi sur ma colonne en utilisant excel(la fonction centile) j'ai D9

      Et sinon en vb tu connais pas comment on utilise les tableaux c beaucoup plus rapide pour des tableaux de taille importante, cette macro se fait en 1 min à peu près. mais la vitesse de la macro c secondaire t deja trop gentil de m'aider

      Merci encore pour ton aide c sympa.
      1. Contributeur
        ok, je verrai ça ce soir (si pas de pb...)
        par contre ça serait interessant que tu déposes un fichier anonymisé sur cijoint.fr et que tu colles le lien ici.
        Précises dessus là où tu trouves des différences (D9-D10). Moi j'ai utilisé If c > decile(i), il faut peut-être >= ?
        Et précise aussi si tu as des cas en plus que les cellules vides à ne pas traiter

        eric
      2. j'arrive pas à le déposer mon fichier il est ptetre trop lourd. mais jpeux tlenvoyer par mail, le mien c doudou-boutamdja009@hotmail.fr

        Merci encore t gentil
      3. Contributeur
        S'il ne passe pas sur cijoint.fr il passera encore moins par mail...
        Allège-le, le tout est qu'il y ait une plage où la différence se produit. Et s'il fait plus de 8Mo tu peux le zipper
        Précise aussi si tu n'as que des valeurs dans les plages concernées ou s'il peut y avoir des formules à conserver.
        eric

        PS : édite ton message pour éliminer l'adresse mail si tu ne veux pas être spammée encore plus
      4. Contributeur
        J'ai trouvé l'erreur sûrement à l'origine des différences (i as long au lieu de as double)
        Contrôle avec cette version, le fichier exemple n'est peut-être pas nécessaire.
        Je calcule en mémoire, ça devrait être plus rapide
        Sub decile() 
            Dim decile(9) As Double, i As Double 
            Dim datas(), lig As Long, col As Long 
            If MsgBox("Remplacer par les déciles sur " & Selection.Address & ". (" & Selection.Cells.Count & " valeurs)", vbYesNo + vbQuestion, "Confirmation") = vbNo Then Exit Sub 
            If Selection.Cells.Count = 1 Then Exit Sub 
            datas = Selection 
            For i = 1 To 9 
                decile(i) = Application.WorksheetFunction.Percentile(datas, i / 10) 
            Next i 
            For lig = 1 To Selection.Rows.Count 
                For col = 1 To Selection.Columns.Count 
                    If datas(lig, col) <> "" Then 
                            For i = 1 To 9 
                                If datas(lig, col) <= decile(i) Then Exit For 
                            Next i 
                            datas(lig, col) = "D" & i 
                    End If 
                Next col 
            Next lig 
            Selection = datas 
        End Sub

        eric
    3. Contributeur
      Bonjour,

      proposition en vba :
      sélectionner la plage et lancer la macro.
      Sub decile()
          Dim decile(9) As Double, c As Range, i As Long
          If MsgBox("Remplacer par les déciles sur " & Selection.Address & ". (" & Selection.Cells.Count & " valeurs)", vbYesNo + vbQuestion, "Confirmation") = vbNo Then Exit Sub
          For i = 1 To 9
              decile(i) = Application.WorksheetFunction.Percentile(Selection, i / 10)
          Next i
          For Each c In Selection
              For i = 9 To 1 Step -1
                  If c > decile(i) Then Exit For
              Next i
              c = "D" & i + 1
          Next c
      End Sub

      Fais qcq tests pour voir si ça correspond à ce que tu veux

      eric

      EDIT : ajout d'une petite sécurité pour éviter les erreurs de manip
      1. Merci pour ta réponse
        Les deciles jlai ai déja calculé pour chaque colonne
        Ouais effectivement c pas simple
        jpourrais faire ca avec un macro vb mais j'y arrive pas non plus jcrois que c encore plus dur:

        j'ai un code qui marche bien mais c'est juste pour une colonne car bien sur les valeurs des déciles changent d'une colonne à l'autre:

        C ca ma macro si tu connais mieux vba mais bien sur c que pour les déciles de la 1ère colonne donc bien sur j'aimerai généraliser ca pour toutes les autres colonnes.......

        Merci pour tes réponses.

        Sub Décile()

        Décile1 = 20.9
        Décile2=...........
        jusuq à Décile9

        Dim w As Worksheet
        For Each w In Worksheets
        Range("AM20:FB619").Select
        For Each Cellule In Selection
        If Cellule.Value < Décile1 Then Cellule.Value = D1
        .......................
        If Cellule.Value > Décile9 Then Cellule.Value = D10
        Next Cellule

        Next w

        End Sub
        1. bonjour,

          exposé comme ça ce n'est pas simple.

          pour infos, il faut utiliser la fonction centile(matrice;0,1) : 0,1 représente le décile.

          la matrice représente la colonne A ou b ou c ou tout autre zone.

          Donc en résumé on a une matrice (ensemble de cellule) qui donne une valeur.

          Je pense qu'il faut recréer un autre tableau mais cela reste flou.
          A+