Fonction Mode Égaliter

Résolu
Bonjour tout le monde

Je suis nouveau sur le forum, mais après avoir longuement chercher un peux partout sur le net je ne trouve pas une réponse à mon problème.
Voilà j'ai deux cellule: "G33" ou sa doit m'afficher le plus cité de la colonne "C10:C39" jusque là, la fonction mode marche très bien je n'est pas de souci, mais par contre dans la cellule "G34" sa doit m'afficher le deuxième plus cité et la je voie pas comment faire et aussi en cas d'égalité j'aimerais avoir les plus cités en "G33" et les deuxième plus cité en "G34" si on peux pas afficher plusieurs résultat dans une seule cellule à la limite en cas d'égalité sa peux être du nombre le plus petit au plus grand exemple le 2 le 7 le 9 son a égalité peuvent s'afficher en "G33" le 2 en "H33" le 7 et en "I33" le 9 et pareil pour le deuxième plus cité sa me gène pas mais j'ai du mal avec la fonction à employer peut être passer par du VBA, en tout cas merci d'avance pour vos réponse en espérant avoir été clair dans ma demande

14 réponses

Résumé de la discussion

Problème posé : afficher dans G33 le plus cité et dans G34 le deuxième plus cité à partir de C10:C39, en gérant les égalités et la possibilité d'étendre les résultats sur plusieurs cellules. Des solutions évoquées privilégient l'utilisation de GRANDE.VALEUR et INDEX/EQUIV pour extraire le premier et le second plus cités, et une fonction personnalisée pour traiter les égalités. Des réponses évoquent l'inconvénient de MODE qui ne gère pas les égalités et proposent des solutions telles que des formules matricielles, des extraits INDEX/MATCH, ou une macro VBA pour afficher plusieurs résultats. En pratique, l'approche dépend de la taille des plages et des résultats souhaités, et les échanges soulignent l'importance de tester sur divers exemples et d'adapter les références C10:C39 et G33/G34.

Bobot (l’IA à votre service)
  1. Contributeur
    Bonjour Duncoup, et bienvenue parmi les membres inscrits.

    Je n'ai pas la réponse à ta question, parce que je n'ai pas compris ce que tu as écrit :
    - Essaie de faire des phrases courtes, avec des virgules et des points-virgules.
    - Tu aurais pu écrire ta formule ; ça nous aurait guidé.
    - Pour illustrer tes propos, rien ne vaut de joindre son fichier ; pour cela tu vas dans https://www.cjoint.com/ pour créer le lien, que tu reviens coller ici.
    0
    1. Contributeur
      Ce n'est pas la fonction MODE qui convient, puisqu'elle ne donne effectivement que "le plus cité".
      Tu ferais mieux d'employer la fontion GRANDE.VALEUR
      0
  2. Contributeur
    Bonjour,

    pas trouvé mieux que :
    =MODE(SI($C$10:$C$39=$G$33;-LIGNE($C$10:$C$39);$C$10:$C$39))
    formule matricielle à valider avec shift+ctrl+entrée
    Et à condition que tu n'aies pas de nombres négatifs.
    Par contre pour ta demande 'en cas d'égalité' il vaudrait mieux une fonction personnalisée en vba. Je n'ose pas imaginer ce que donnerait une formule en se basant sur ce façon de faire.

    eric

    En essayant continuellement, on finit par réussir.
    Donc plus ça rate, plus on a de chances que ça marche.(les Shadoks)
    En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
    0
    1. Bonjour à tous

      Tout d'abord merci Raymond et eriiic

      Je vais essayer d'être plus clair, et grâce a ton lien de joindre ce que je souhaite.

      Ci joint le fichier: https://www.cjoint.com/?0FrjE2yXEi4

      Dans l'exemple fourni pour le plus cité j'utilise la fonction "=MODE(C10:C39)" ce qui me donne le plus cité, mais en cas d'égalité il ne m'en affiche que un seul...

      La fonction "GRANDE.VALEUR" ne me donne pas les plus cités mais les plus grand chiffres de la colonne sauf condition que je ne connais pas.

      Pour le deuxième plus cité je ne vois pas d'option à la fonction "MODE" pour faire comme tu dit plus haut avec "GRANDE.VALEUR" de chercher le deuxième plus cités.

      Merci d'avance pour vos réponses.
      0
      1. Contributeur
        Proposition de fonction personnalisée.
        Attention au mode de saisie de la formule, c'est très particulier (fonction matricielle validée sur une plage).
        Si tu dois modifier la taille de la plage de la réponse il faut sélectionner l'ancienne plage et supprimer la formule matricielle pour pouvoir créer la nouvelle.

        C'était assez chaud à faire et prise de tête, bien tester sur différents exemples.
        https://www.cjoint.com/?DFrmLlTnQGn

        eric
        0
        1. Merci eriiic

          mais quand je rentre la formule matricielle sur ma plage sur mon fichier sa me met rien en résultat les cases sont vide j'ai du raté un épisode:

          Je fais "=modePlus($C$10:$C$39)" je valide "{=modePlus($C$10:$C$39)}"

          Sur "G33" pour les premiers
          et "G34" pour les deuxièmes

          Comme tu as fais dans l'exemple un c'est parfais j'en veux que 2 merci d'avance, sinon sa marche bien, juste moi qui comprend pas comment tu as fais.

          Et si on peux afficher un petit tiret au lieu de la virgule pour séparer les chiffres égaux sa serais parfais sinon c'est un détail :)

          En tout cas merci beaucoup à vous pour vaux lumières.
          0
          1. Contributeur
            Il faut mettre le code vba dans ton classeur.
            Alt+F11 pour afficher VBE. La fonction est dans le Module1
            Insérer un module standard dans ton classeur et y coller le code.
            Code modifié:
            Function modePlus(plage As Range) As Variant
                Dim c As Range, reponse() As String, nbRep As Long, i As Long
                Dim Dict As Variant, clé As String, lig As Long
                Dim tmp1 As Long, tmp2 As Long, fini As Boolean
                Dim arr() As Long
            
                Set Dict = CreateObject("Scripting.Dictionary")
                'comptage
                ReDim reponse(1 To plage.Cells.Count)
                For Each c In plage
                    If c.Value <> "" Then Dict.Item(c.Value) = Dict.Item(c.Value) + 1
                Next c
                ' dict dans tableau
                ReDim arr(0 To Dict.Count - 1, 0 To 1)
                cles = Dict.Keys
                For lig = 0 To UBound(cles)
                    arr(lig, 0) = cles(lig)
                    arr(lig, 1) = Dict(cles(lig))
                Next lig
                ' tri qté décroissante
                Do
                    fini = True
                    For i = 0 To UBound(arr) - 1
                        If arr(i, 1) < arr(i + 1, 1) Then
                            tmp1 = arr(i, 0): tmp2 = arr(i, 1)
                            arr(i, 0) = arr(i + 1, 0): arr(i, 1) = arr(i + 1, 1)
                            arr(i + 1, 0) = tmp1: arr(i + 1, 1) = tmp2
                            fini = False
                        End If
                    Next i
                Loop While Not fini
                ReDim reponse(1 To 1)
                reponse(1) = arr(0, 0)
                nbRep = 1
                For i = 1 To UBound(arr) - 1
                    If arr(i, 1) = arr(i - 1, 1) Then
                        reponse(nbRep) = reponse(nbRep) & "-" & arr(i, 0)
                        'i = i + 1
                    Else
                        nbRep = nbRep + 1
                        ReDim Preserve reponse(1 To nbRep)
                        reponse(nbRep) = arr(i, 0)
                    End If
                Next i
                If plage.Columns.Count = 1 Then
                    ' matrice verticale
                    modePlus = Application.Transpose(reponse)
                Else
                    ' matrice horizontale
                    modePlus = reponse
                End If
            End Function

            eric
            0
          2. Contributeur
            remplacer :
            clé As String
            par :
            clé As Variant

            Nouveau fichier avec valeurs ordonnées au post #9
            0
        2. re eriiic et encore merci beaucoup

          J'ai compris pourquoi sa marchais pas effectivement me manquais le VBA :)

          Je vais encore t'embêter un peux j'aimerais qui me les ranges du plus petit au plus grand en cas d'égalité exemple "1 - 2 - 7 - 12".

          Et pour finir si tu peux et veux bien me verifier le code que tu as mis plus haut car j'ai l'impression y a des erreurs merci encore vraiment beaucoup pour ton aide.

          "L'erreur c'est peut être moi" y manquais un 'stop comme tu avais mis dans ton ancien code je regarde de mon coter j'essaye de comprendre.

          Du coup sa marche mais je n'arrive pas a mettre pour le deuxième dans "G34"
          il m'affiche la même chose que "G33" comment tu fais pour avoir les deux case différente car sur le tiens sa marche avec la même formule pour les deux.

          J'ai essayer en tirant vers le bas en l'écrivant dans les deux en même temps un après l'autre rien ne change j'ai toujours les deux case identique avec le résultat du premier.

          Sinon la fonction "modePlus" est bien prise en compte.

          Je n'y connais rien en VBA mais sa a l'air vraiment utile du coup me suis commander sa pour les nuls :) en te remerciant encore simpa de ta part.
          0
          1. Contributeur
            car j'ai l'impression y a des erreurs
            Une impression ce n'est pas suffisant.
            Fournir un classeur exemple avec l'anomalie en expliquant où elle est.
            Sinon il y avait un problème de déclaration de variable qui ne m'avait pas généré d'erreur. C'est peut-être ça qui a posé un pb chez toi.

            J'ai ajouté une fonctionnalité : si tu sélectionnes 2 colonnes avant de valider la formule tu as le compteur en 2nde colonne. Voir G45:H47
            https://www.cjoint.com/?DFrrqhKLeME

            eric
            0
        3. Re tout le monde

          Merci infiniment eriiic après avoir bien travaillée et tourné mon problème dans tous les sens grâce à toi j'ai enfin trouver ou les mettre ces formules youpi :)

          un grand merci à tous :)
          0
          1. Contributeur
            J'ai vu ton fichier.
            Effectivement il reste un problème si tu demande plus de réponses qu'il en existe.
            Je verrais ça demain.
            eric
            0
        4. Contributeur
          Livraison plus tôt que prévu, c'est un peu plus propre maintenant.
          N'hésite pas à signaler si tu remarques d'autres anomalies (avec fichier stp).
          https://www.cjoint.com/?DFsaf52f6H8

          eric
          En essayant continuellement, on finit par réussir.
          Donc plus ça rate, plus on a de chances que ça marche.(les Shadoks)
          En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
          0
          1. je te remerci pour ta rapidité et ton aide précieuse je vais voir sa je te tiens au courrant
            0
            1. sa semble marcher au petit oignon :) merci beaucoup eriiic
              0
            2. je te joint un fichier pour une petit option si jamais on peux le faire sa serais le top merci d'avance en tout cas déjà un énorme merci pour ce que tu as fais bonne nuit à toi.

              fichier ci-joint: https://www.cjoint.com/?0FsaB1o3ixT
              0
            3. Contributeur
              Bonjour,

              Ce n'est plus une option, c'est tout à fait autre chose (ou presque).
              Code dans le module Feuil1.
              Je me sers de G33:G34 pour récupérer résultat et couleurs.
              La mise à jour se fait automatiquement en cas de changement sur C10:C29 dans la mesure où se sont des saisies et non le résultat de formules. Sinon il faut surveiller les cellules de saisie à l'origine des changements.
              https://www.cjoint.com/c/DFskUhY4ciX

              eric
              0
          2. Bonjour tout le monde et merci eriiic

            Je viens de regarder il y a des erreurs je te joint le fichier:

            ci-joint: https://www.cjoint.com/?0FslFW9ApnM

            Et de mon coter j'ai été obligé de rajouter une colonne donc sa part de H10:H29 maintenant et le résultat est aussi en H33:34.

            Sa doit aussi me mettre en couleur les 3 colonnes par ligne égale au résultat comme tu as fais mais la colonne des chiffres aussi doit ce mettre en couleur sa serais parfais.

            Sinon un grand merci encore sa marche très bien mis appart un petit bug de rien du tout, et moi qui change la colonne.

            J'ai pas trouver le code couleur non plus dans ton code, pour la changer si besoin un jours.

            A vrai dire je sais même pas comment il la met j'ai encore du mal avec le VBA j'essaye de comprendre je regarde sur le net mais pas simple.

            Merci en tout cas.
            0
            1. Contributeur
              sa marche très bien mis appart un petit bug de rien du tout
              Quel bug ? Il faut que je devine ?

              En vba il faut éviter de changer la structure de la feuille ou sinon modifier les références des cellules dans le code.
              Je t'ai nommé des plages sur la feuille, le code utilise maintenant ces noms. En cas de changement modifier la définition de ces noms :
              plage1 : C10:C39
              plage2 : H33:34
              plage3 : H10:H29

              J'ai pas trouver le code couleur non plus dans ton code, pour la changer si besoin un jours.
              Je te l'ai écris : Je me sers de G33:G34 pour récupérer résultat et couleurs

              Fichier adapté : https://www.cjoint.com/?DFsmtZWZ138

              eric
              0
            2. merci eriiic je regarde sinon pour l'erreur je l'avais mise sur le fichier sa affichais pas toutes les égalités :)
              0
            3. Contributeur
              Si tu changes toutes les colonnes sans adapter le code forcément ça marche moins bien, ce n'est pas un bug.
              Y'a-t'il toujours un pb ?
              eric
              0
            4. Si je change les nombres que tu as mis il me garde les couleurs dans la colonne des nombre de 1 à 20 "(H10:H29)"

              merci encore eriiic
              0
            5. Contributeur
              Non constaté, si tu peux confirmer....
              Lorsque tu testes un fichier avec macro ne le fait pas après l'avoir ouvert à partir du net.
              Enregistre-le dans un autre répertoire que temp et ouvre-le pour que les macros réagissent correctement.
              Une petite correction quand même : mise en noir de la 1ère colonne, oubliée lors du passage de 2 à 3 colonnes à colorer.
              https://www.cjoint.com/?DFsoYnZk6cy

              eric
              0
          3. je te renvoie un fichier du souci de couleur qui reste

            ci-joint: https://www.cjoint.com/?0FsnPZBcdSO

            Et je t'ai mis dedans une fonction qui me serais utile que je voie pas comment on fais je trouve bien le 10 avec "GRANDE.VALEUR" mais je voudrais il m'affiche le 6 de la colonne juste avant.

            j'Ai essayer avec la fonction "decaler" mais sa marche pas.

            Merci encore de ton aide.
            0
            1. Contributeur
              Je n'avais pas vu ce post.
              Pas sûr d'avoir bien compris. En J10 :
              =SI(I10=MAX($I$10:$I$29);6;"")
              à recopier vers le bas.
              eric
              0
            2. en fait c'est par rapport au fichier que j'ai joint:

              le résultat le plus grand est : est 10 dans la plage "I10:I29"

              mais moi je veux savoir la valeur en face ce résultat sur la plage "H10:H29"

              dans cet exemple sa tombe sur le 6

              "en gros sa devrais me donner un truc du genre"

              =GRANDE.VALEUR(I10:I29;1) j'obtiens 10 de la colonne "I10:I29"et je veux pour résultat le 6 de la colonne "H10:H29" qui ce situ sur la même ligne moins une colonne.

              je te remet le fichier: https://www.cjoint.com/?0FsnPZBcdSO
              0
            3. Contributeur
              =INDEX(plage3;EQUIV(MAX($I$10:$I$29);$I$10:$I$29;0))

              eric
              0
            4. parfais merci infiniment eriiic
              0
          4. re eriiic

            J'ai un dernier petit souci avec les couleurs automatique quand je protège ma feuille il m'ouvre la fenêtre débogage a chaque fois et ne colorie plus rien voilà sinon tout marche super bien en te remerciant encore.
            0
            1. Contributeur
              Au début :
              ActiveSheet.Unprotect "mdp"
              à la fin :
              ActiveSheet.Protect "mdp"

              Si tu veux tous les paramètres regarde l'aide qui est très bien faite, et pense à utiliser l'enregistreur de macro quand tu cherches une fonction.

              eric
              0
            2. j'ai fini par réussir youpi encore un grand merci :)

              quelle galère quand on connais pas :)))

              vraiment un grand grand merci :p
              0