Casse tête ordonner valeurs égales

Bonjour à tous

Mon soucis viens du fait que je recherche les activités de la moins fréquentes à la plus fréquentes jusque là ça va mais le problème viens lorsqu'il y a deux (voir plus) valeurs identiques: une seule est retenue et se répète.

Je joint mon fichier épuré afin d'être plus compréhensible

Je vais tirer cette formule du haut vers le bas (ligne)

Merci d'avoir pris le temps de me lire

Cordialement

bonjour

on transpose, on met des titres, on met sous forme de tableau et ensuite un simple TCD

Bonjour et merci beaucoup JMD

La solution est fonctionnelle mais je ne sais si je vais pouvoir l'utiliser dans mon projet: chaque lignes correspond à une personne et il y en a 200 (d'où ma recherche d'une formule)

Est ce que je vais pouvoir adapter un tcd avec ces 200 personnes ou vais je devoir en faire un par personne

Merci de la rapidité

Cordialement

re

joins un fichier tel que tu l'auras, avec plusieurs lignes

joint le fichier sur lequel je travaille

Merci

10stat.xlsx (117.93 Ko)

re

je ne comprends pas

où sont les données exactement ?

quel résultat veux-tu ?

bonjour

a partir d'une matricielle de traitement des ex equo (qui rajoute un iota pour differencier )

12etsije.xlsx (10.84 Ko)

cordialement

Bonsoir,

Un énorme coup de chapeau à tulipe_4, je n'ai rien compris (mais au plus j'essaye d'évoluer dans excel au plus je m'aperçois que je ne sais rien), c'est ce que je souhaite obtenir mais dans le sens contraire( du plus petit nombre de fois vers le plus grand)

Pour répondre à la question de jmd:

de la cellule B3 à ACI3 je colle en VAC1 la position de travail d'une personne en première partie de sa journée de travail, en VAC2 la position qu'elle occupe en deuxième pour tous les jours de l'année( les appellations sont dans ABH1:ACI1)

Mon objectif final est d'attribuer les positions de façon égale pour tous, c'est pour ça que je souhaite avoir par personne(colonne A) le pourcentage d'occupation d'un poste(calculé par nb.si en ABH3:ACI3 divisé par le nombre de jours travaillés depuis le début de l'année jusqu'à aujourd'hui en ABF1

Les positions du moins souvent occupées au plus souvent sont en ACJ3:ADK3 par la formule

=SIERREUR(INDEX($ABH$1:$ACI$1;0;EQUIV(PETITE.VALEUR($ABH3:$ACI3;COLONNE(A:A));$ABH3:$ACI3;0));"")

Ce que je n'arrive pas à trouver c'est que lorsqu'il y a égalité, la formule ne garde que la première des égalités alors que je voudrais aussi les avoir les unes à côté des autres

J'espère que mes explications ne sont pas trop obscures

Un énorme merci à vous de vous être penché sur mon problème

Cordialement

Bonjour,

Tulipe5 ayant formulé sa réponse, une autre proposition en formule serait inutile !

Après m'"être cassé la tête"... je proposerai donc une fonction personnalisée :

Function CLASSERPTTENUES(pt As Range, nv As Range)
    Dim temp(), tft(1 To 2), i%, j%
    Application.Volatile
    ReDim temp(1 To pt.Cells.Count, 1 To 2)
    For i = 1 To pt.Cells.Count
        temp(i, 1) = pt(i)
        temp(i, 2) = nv(i)
    Next i
    For i = 1 To UBound(temp, 1) - 1
        For j = i + 1 To UBound(temp, 1)
            If temp(j, 2) < temp(i, 2) Then
                tft(1) = temp(j, 1): tft(2) = temp(j, 2)
                temp(j, 1) = temp(i, 1): temp(j, 2) = temp(i, 2)
                temp(i, 1) = tft(1): temp(i, 2) = tft(2)
            End If
        Next j
    Next i
    CLASSERPTTENUES = temp
End Function

Fonction matricielle (à valider par Ctrl+Maj+Entrée)

Comment l'utiliser : on copie la fonction, on ouvre l'éditeur VBA (Alt+F11), on insère un module standard (Insertion > Module) et on y colle la fonction. On ferme l'éditeur.

On sélectionne une plage de cellules de 28 lignes sur 2 colonnes ; on tape la formule, soit =, le nom de la fonction, parenthèse ouvrante, la plage de positions de travail en 1er argument, un point-virgule, la plage de nombres de vacations en 2e argument, parenthèse fermante, soit sur le modèle :

=CLASSERPTTENUES(A1:AB1;A3:AB3)

On valide par la combinaison de touches : Ctrl+Maj+Entrée, et la liste des PT avec en regard le nombre de vacations s'affiche, triée en ordre croissant.

La fonction se recalcule en cas de modification des valeurs sources.

J'ai cru comprendre que tu voulais l'avoir en vertical (tirer du haut vers le bas), mais si tu la veux dans l'autre sens, on peut l'y mettre, et on devrait pouvoir aussi la faire fonctionner dans les 2 sens, selon sélection faite au départ. (Dans l'état actuel, elle n'affiche qu'en vertical).

Cordialement.

Bonjour,

Merci beaucoup MFerrand pour ce "coup de génie" je me "casse la tête" avec ce soucis depuis plusieurs jours et si cela ne correspond pas exactement à ce que je pensais (j'aurais souhaité avoir la première valeur non nul si cela est possible) je vais essayer de modifier le reste de mon projet

Si la version horizontale n'est pas trop abuser de vôtre temps ça me serait plus facile

Habituellement je demande des explications afin de comprendre mais si j'ai compris vous avez créé une formule en vba (dont j'ignore tout) et c'est elle que vous appelez en tapant la fonction

Je ne vous remercierais jamais assez de vôtre aide à tous et particulièrement à JMD, tulipe_4 et MFerrand de vous être penché sur mon soucis

Cordialement

Bonjour

rebelote ;mais dans l'autre sens

l'astuce consiste a rajouter 1/10000eme de la valeur du n°de la colonne (1;2;3;4;.....) a la valeur presente ainsi on garde l'entier tout en creant une infime difference entre 2 entiers egaux vu qu'ils ne sont pas dans la meme colonne : ruse de sioux

bien entendu ,etant donné qu'il y a des cell vides qui pourraient polluer le calcul de la petite valeur (0+1/100000 de colonne) ;il faut les eluder avec une condition qui n'autorise que les cell reelement renseignées

la fonction est matricielle ,à valider en faisant Ctrl maj Entrée avec 3doigts en simultané

6etsije2.xlsx (10.95 Ko)

bonjour Mferrand

cordialement

Bonjour,

merci d'avoir suivi mon sujet et surtout de m'avoir compris( pas évident) tulipe_4,

en plus les explications me permettront de finir cette journée beaucoup moins idiot

Un grand bravo à tous je ne vous remercierait jamais assez

Merci JMD, Merci MFerrand( je suis preneur de la solution en horizontale mais est-ce que la colonne B avec les chiffres est obligatoire) et Merci tulipe_4

Cordialement

Pas de souci pour la verson horizontale : il suffit de modifier la dernière ligne ainsi :

CLASSERPTTENUES = Application.Transpose(temp)

Cordialement.


Salut Tulipe...!

Etsije, en relisant : dois-je comprendre que tu veux éliminer les "vides" de la liste ?

C'est faisable, bien sûr !

Bonsoir MFerand

oui en effet je souhaite n'avoir que les valeurs supérieure à 0 (un 0 signifie que la personne n'est pas formée ou bien ne peux pour divers raison occuper un poste donc éviter de la placer)

Merci de continuer à m'aider

Cordialement

bonsoir

en effet ;pourquoi s'encombrer de valeurs non renseignées ???

cordialement

Hé ! hé! Parce que je ne les avais jamais considérés comme non renseignés, mais à zéro, parce que pas encore atteint 1 ou plus, et donc affectation à prioriser sur ces postes...

Mais je vais distinguer : "vide" et 0 (valeur numérique)....

A+

Version modifiée :

Function CLASSERPTTENUES(pt As Range, nv As Range, Optional vert As Boolean = False)
    Dim temp(), tft(1 To 2), i%, j%
    Application.Volatile
    ReDim temp(1 To 2, 1 To pt.Cells.Count)
    For i = 1 To pt.Cells.Count
        If Not IsEmpty(nv(i)) Then
            temp(1, i) = pt(i)
            temp(2, i) = nv(i)
        Else
            temp(1, i) = ""
            temp(2, i) = ""
        End If
    Next i
    For i = 1 To UBound(temp, 2) - 1
        For j = i + 1 To UBound(temp, 2)
            If temp(2, j) < temp(2, i) Then
                tft(1) = temp(1, j): tft(2) = temp(2, j)
                temp(1, j) = temp(1, i): temp(2, j) = temp(2, i)
                temp(1, i) = tft(1): temp(2, i) = tft(2)
            End If
        Next j
    Next i
    If vert Then
        CLASSERPTTENUES = Application.Transpose(temp)
    Else
        CLASSERPTTENUES = temp
    End If
End Function

J'ai rajouté un argument optionnel, non servi l'orientation est horizontale ; si tu mets VRAI en 3e argument, l'orientation sera verticale.

Si tu utilises 28 colonnes, les dernières seront donc sauf exception (apparemment) vides (elles contiennent une chaîne vide : "", sans quoi renvoi de la valeur #N/A) . Evidemment, si tu sais que tu auras des vides, tu n'es pas obligé d'en sélectionner 28 ! La formule remplira ta sélection avec les résultats qu'elle a. Et à l'inverse, si tu vois que tu n'as pas sélectionné assez après validation, tu étends simplement la sélection, tu repositionnes le curseur dans la barre de formule pour l'éditer et tu revalides.

Cordialement.

Bonjour,

C'est en lisant vos commentaires que je m’aperçois que vôtre talent et vôtre patience sont infinis: ma présentation et mes demandes sont vraiment peu explicite, je souhaite résoudre l'élément sur lequel je butte au lieu de vous présenter le projet sur son ensemble

Merci tulipe_4 et MFerrand (la version finale de "CLASSERPTTENUES" du grand art) de vôtre aide précieuse et JMD de m'avoir ouvert les yeux sur le manque d'information

Mille merci

Très cordialement

Rechercher des sujets similaires à "casse tete ordonner valeurs egales"