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....
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.
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)
"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 . .)
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
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 ....
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)
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...) ?