Recherche de communs et/ou non communs

erics83

XLDnaute Impliqué
Bonjour,

Beaucoup inspiré par le code de JB :
Fonction communs à 3 listes,


Je cherche à faire des combinaisons avec 8 noms :

3 positions :
1 = commun
0 = je ne prends pas les valeurs
-1 = la lettre n'est pas dans la liste.

(pour être plus clair, j'ai mis un fichier test en PJ)

Pour calculer toutes les combinaisons possibles j'ai donc fait :
Code:
For I1 = -1 To 1
For I2 = -1 To 1
For I3 = -1 To 1
For I4 = -1 To 1
For I5 = -1 To 1
For I6 = -1 To 1
For I7 = -1 To 1
For I8 = -1 To 1

'Calculs


Next I8
Next I7
Next I6
Next I5
Next I4
Next I3
Next I2
Next I1
Je prends un exemple de combinaison :
I1=1
I2=0
I3=-1
I4=1
I5=0
I6=0
I7=-1
I8=1

veut dire : je calcule les lettres communes entre I1, I4, I7, I8, mais ces lettres ne doivent pas être dans I3 et I7 et je ne tiens pas compte de I2, I5,I6
I1=l'ensemble des lettres de Nom1
I2=l'ensemble des lettres de Nom2, etc.....

J'aimerai pour chaque date (j'en ai mis juste 2 pour l'exemple) faire cette opération....

Une petite aide ?
Merci,
 

Pièces jointes

  • Fichiertest1.xlsm
    12.2 KB · Affichages: 40

ODVJ

XLDnaute Impliqué
Bonsoir,

Je ne sais pas comment t'expliquer la base 3 mieux que ce que je t'ai déjà écrit.
Des combinaisons de -1, 0 et 1 sur 8 positions correspondent à l'écriture en base 3 de tous les nombres de 8 chiffres. Ces derniers contiennent les chiffres 0, 1 et 2. Il y en a 3^8, de 0 à 3^8-1.
Pour retomber sur les combinaisons de -1, 0 et 1, il suffit de soustraire 1 à chaque chiffre de l'écriture en base 3.
Il y a donc bijection entre l'ensemble des combinaisons sur 8 positions de -1, 0 et 1 et l'ensemble des nombres entiers de 0 à 3^8-1.
Indicer le tableau stats de 0 à 3^8-1 revient à l'indicer par les combinaisons sur 8 positions de -1, 0 et 1.
Voilà l'intérêt de passer par la base 3. Il ne faut pas croire que c'est quelque chose de pointu, c'est assez classique.

Si tu passes à 9 pronostiqueurs, tu modifies Nbpers de 8 à 9 et "ça devrait marcher"...
Le nombre de combinaisons passera à 3^9, le temps de traitement s'allongera et ton tableau de résultat en W1 sera 3 fois plus long.
Il ne faudra pas oublier d'ajuster les indices colonne U, les sommes colonne V, le max et l'indice du max.
Il faudra que toutes les journées aient 9 lignes. Tu choisis la méthode qui te convient pour atteindre ce résultat.
Il faudra enfin que les données soient triées par jour et par nom. (sinon, le résultat n'aura aucune pertinence)

Tu peux mettre en EP ou ailleurs la combinaison correspondant à chaque indice, d'autant plus que tu as la formule en P4 : P11. Il suffit de la transposer, soit au niveau de LIGNE(), soit au niveau le plus extérieur de la formule.

Cordialement
 

erics83

XLDnaute Impliqué
Super merci pour ces explications très claire ODVJ,

Je comprends mieux, surtout la base3...que je vais approfondir, car très intéressant...:)

J'ai essayé avec 9, mais cela ne fonctionne pas....j'ai pris 1 seule journée (celle que j'avais dans mon essai de code), j'ai bien modifié Nbpers à 9, rallongé la colonne U jusqu'à 19683 (=nb combinaisons avec 9 pronostiqueurs), modifié P4 : P11 en adaptant la matrice :
Code:
=MOD(ENT(P2/3^(8-LIGNE($1:$9)));3)-1
, le max cumulé tombe à 1 (normal, puisque je n'ai pris qu'une seule date) et l'indice associé est 2205 (le premier résultat...evidemment), mais lorsque je regarde la combinaison, ce n'est pas le "bon" résultat (=la bonne combinaison), et...je cherche depuis ce matin, et je ne comprends pas et/ou ne vois pas où est l'erreur.... (j'ai aussi essayé de modifier NbTeam à 9, mais le code s'est mis en erreur..donc, j'ai remis à 8)

Merci pour ton aide,
 

erics83

XLDnaute Impliqué
Bonjour,

C'est parfait, en fait, j'avais mal modifié la matrice....j'ai mis
=MOD(ENT(P2/3^(9-LIGNE($1:$9)));3)-1
et tout est rentré dans l'ordre....

Parfaitement parfait !

et quel code !! Impressionnant !!! Merci pour ce code et cette logique !!!!

Merci pour l'explication de la base3, j'ai compris, c'est juste la "retransciption" que j'ai encore un peu de mal à "saisir",
En effet, 3361 s'écrit sur 8 positions en base 3 : 1 1 1 2 1 1 1 1
, je ne comprends pas la "conversion"...c'est comme du binaire ? je cherche, mais à force, je devrais y arriver...o_O

En te remerciant pour ton aide,
 
Dernière édition:

ODVJ

XLDnaute Impliqué
Re,

"2205 est toujours là ", "Nom3 contient 15 (=le résultat) et est à -1 (Nom8 contient 15 et est à 1," ça ne veut rien dire pour moi.
Nom3, c'est le nom d'un pronostiqueur. Il ne contient rien.

Tu sais pourtant ce qu'il faut faire pour avoir des réponses rapides.
Avec un fichier, tu aurais déjà eu une réponse. (Enfin, peut-être être . .)

Cdlt
 

erics83

XLDnaute Impliqué
Re,

Nos post se sont croisés....l'erreur venait de moi....et dans la modification de la matrice....cf#34....

Ce code est génial !!!
Me reste plus qu'a étudier la retranscription de la base3, pour essayer de la ré-utiliser....

Merci pour ton aide,
 

erics83

XLDnaute Impliqué
Re,

C'est bon, j'ai trouvé comment retranscrire les bases....
une fonction personnalisée qui permet de convertir un nombre décimal en nombre en base b


utiliser la fonction
=nombrebase(nombre;base)
après avoir placer le code dans un module


Function nombrebase(n, b)
chiffres = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
dg = ""
While n <> 0
dg = Mid(chiffres, (n Mod b) + 1, 1) & dg
n = Int(n / b)
Wend
nombrebase = dg
End Function
h2SO4

Donc, maintenant je sais un peu mieux m'y retrouver dans les bases et leur utilisation,

merci ODVJ pour ton aide et tes conseils et explications qui m'ont beaucoup apporté :)

Merci,

merci pour ton aide,
 

erics83

XLDnaute Impliqué
Re,

ton code est simplement génial, je le "triture" un peu dans tous les sens pour voir et comprendre.....

Juste une toute dernière petite question : admettons qu'il y ait des ex aequo, donc 2 résultats, j'ai donc modifié la zone Résultats en prenant K : L et j'ai essayé de modifier ton code au niveau
Code:
If dict_plus_1.Count > 0 Then
                If (dict_plus_1.exists(Résultats(NbPers * k + 1, 1)) And dict_plus_1.exists(Résultats(NbPers * k + 1, 2))) Then
                    If (dict_plus_1(Résultats(NbPers * k + 1, 1)) = Nb_plus_1 and dict_plus_1(Résultats(NbPers * k + 1, 2)) = Nb_plus_1) Then
                        stats(r, k) = 1
                    End If
                End If
            End If
puisque c'est là que le résultat est comparé et incrémenté (du moins, ce qu'il me semble avoir compris...), mais cela ne fonctionne pas, et je ne comprends pas où est mon erreur ....:confused:

Merci pour ton aide,
 

ODVJ

XLDnaute Impliqué
Re,

S'il y a des exæquo, c'est dans la feuille de calcul que tu les gèreras.
La macro mets des 1 dans un tableau; Elle ne sait pas s'il y aura des exæquo.
Donc, ......... n'y touche pas.
Pour trouver les exæquo, utilise PETITE.VALEUR() sur les lignes où se trouve le max (colonne V)

cordialement
 

erics83

XLDnaute Impliqué
Re, et merci,

Je ne comprends pas....effectivement la macro met 1 dans un tableau, mais à partir du Résultat1, la macro ne calcule pas par rapport au Résultat2 et donc ne peut pas mettre un 1 si le résultat est 3 (dans mon exemple...) ?

Merci pour ton aide,

(je mets le fichier avec 9 noms en PJ)
 

Pièces jointes

  • Fichier étude combinaisons 9 noms essai execo.xlsm
    2.4 MB · Affichages: 28
Dernière édition:

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
314 645
Messages
2 111 536
Membres
111 183
dernier inscrit
angelique76120