Générer un tableau de k^n combinaisons, lequel est ensuite filtré (règles)

Bonjour,

J'ai édité ma demande pour faire un message plus court.

Tout est dans le tableur ci-joint.

Ce tableur est un exemple réalisé avec k = 4 et n = 3.

Voici ma demande : je souhaite automatiser deux manipulations :

• n°1 : création du tableau "étape 1"

• n°2 : création du tableau "étape 4" à partir du tableau en "étape 1" en appliquant les règles R1 et R2 figurées dans le fichier joint).

1) Comment programmer Excel (ou utiliser les formules, car je n'utilise jamais VBA par manque de connaissances) pour générer automatiquement un tableau de kn combinaisons (disons qu'on renseigne k et n) ? Pour ce faire, les combinaisons sont composées de n chiffres pouvant être égaux (pas de restriction de valeurs) et ces n chiffres peuvent prendre les valeurs 1 à k.

2) Comment programmer Excel pour qu'il réalise directement le traitement du tableau de l'étape 1 vers celui attendu en étape 4 ?

Précision importante : il peut tout fait subsister des combinaisons finales ayant moins de n chiffres.

Pour vérification, la formule mathématique permettant de dénombrer le bon nombre de combinaisons est : (k-1)n + (( (k-1)0 + (k-1)1 + ... + (k-1)n-1).

En effet, je souhaiterais générer en un temps raisonnable tous les tableaux de paramètres (k=1 à 10) à (n=1 à 10) soit 100 tableaux.

Pour donner une idée, celui que j'ai construit à la main puis trié m'a pris au moins 20 minutes.

Je vous remercie !

bonjour,

une proposition via une macro, adapter nbd,nbv et éventuellement nom de la feuille, lancer la macro via alt-F8

Sub aargh()
    Dim t(1 To 1000000, 1 To 9) 'tableau des résultats par 1000000 de lignes
    Sheets("feuil2").Select 'feuille résultat
    nbd = 8 ' nombre de chiffres
    nbv = 5 'valeur maximum
    nl = 0 'n° de ligne résultat
    nc = 0 'n°de colonne résultat
    combinaison t, nbd, nbv, nl, col 'génère combinaison
    If nl > 0 Then
        col = nc * nbd + 1
        Cells(1, col).Resize(nl, nbd) = t 'copie du tableau résultat dans la feuille active
    End If
    MsgBox "terminé"
End Sub
Sub combinaison(ByRef t, ByRef nbd, ByRef nbv, ByRef nl, ByRef col, Optional n = 1, Optional s = "")
    os = s
    For i = 1 To nbv 'on génére toutes les valeurs possibles pour la position n
        s = s & ":" & i 'on mémorise la séquence de chiffres
        If i = nbv Or n = nbd Then 'on a atteint le nombre de chiffres ou atteint la plus grande valeur
            nl = nl + 1 'on mémorise la séquence dans le tableau des résultats
            ts = Split(s, ":")
            For j = LBound(ts) To UBound(ts)
                If ts(j) <> "" Then t(nl, j) = ts(j)
            Next j
            If nl = 1000000 Then 'si 1000000 de lignes on transfère le tableau sur la feuille
                col = nc * nbd + 1
                nc = nc + 1
                Cells(1, col).Resize(1000000, nbd) = t 'copie du tableau résultat dans la feuille active
                nl = 0
            End If
        Else
            combinaison t, nbd, nbv, nl, col, n + 1, s 'combinaison pour la position suivante
        End If
        s = os
    Next i
End Sub

@h2so4 : Du grand art ! J'ai toujours rêvé de savoir programmer en VBA... !

Vraiment excellent, ça va me faire gagner énormément de temps.

Je vais tester le programme et je reviens vers toi si jamais j'ai des difficultés ou que je n'arrive pas au résultat escompté. Mais l'ayant déjà un peu testé, ça semble vraiment fonctionner.

Un grand merci !

Bonjour,

ceci m'avait échappé

En effet, je souhaiterais générer en un temps raisonnable tous les tableaux de paramètres (k=1 à 10) à (n=1 à 10) soit 100 tableaux.

il est naturellement possible d'automatiser ceci également.

Bonjour,

Je viens de faire quelques tests et tout fonctionne parfaitement !

Je vais poster un sujet plus complexe (ce que je cherche exactement à faire à partir de programme qui va déjà tellement faciliter les choses) et je propose d'en faire une suite sur un autre sujet car vous avez résolu le problème, merci !

Bonjour

Bonjour à tous

Une variante :

Bye !

Salut gmb, excellente contribution aussi !

Merci beaucoup ;)

Bonjour,

Je souhaiterais une étape supplémentaire au programme qui a été créée.

Peut-on rajouter une étape qui permet d'ordonner les résultats de telle manière à ce que tous ceux qui ont le chiffre le plus élevé apparaissent en dernier ?

Merci beaucoup !

Voici un exemple avec la règle n°3 rajoutée en PJ [cf feuille 1] sur un programme résolu par h2so4 (un grand merci à vous) !

Une deuxième méthode de résolution qui a été adoptée par gmb (un grand merci à vous aussi !) ; et j'ai aussi rajouté la règle n°3 [cf feuille 1(2)] :

Merci beaucoup !

p.s: les feuilles contenant la règle 3 sont strictement identiques quel que soit le fichier utilisé

Bonjour

Bonjour à tous

Nouvelle version.

Bye !

Bonjour gmb,

Je vous remercie !

Quelques remarques sur le programme (j'aime bien l'interface aussi).

Pour des valeurs de k et n qui fonctionnent, le tri que vous appliquez sur les valeurs semble fonctionner, merci ! Mais peut-être au détriment d'autres configurations de combinaisons.

En effet, sauf erreur, j'ai l'impression que le programme ne fonctionne correctement que pour n = 3 (pour les autres valeurs, ça ajoute des lignes supplémentaires en plus (par exemple pour n=2 et n=1). Pour les n supérieurs, ça ne prend pas en compte les colonnes C4 à C10. Enfin, par exemple, quand j'ai testé k = 5 et n = 8 ça ne m'a bizarrement affiché que des "123".

Aussi, dans le programme v1, quand je tape un nombre de combinaisons volontairement élevé (mais qui ne dépasse pas le million), des N/A apparaissent à partir de la 32000e ligne environ (j'avais testé 6^7 de mémoire). Je ne sais pas à quoi c'est dû. h2so4 semble avoir fixé une limite de 1 000 000 de combinaison dans le programme qu'il a proposé et je n'ai pas obtenu de problèmes pour des valeurs inférieures.

Mais cela n'annule aucunement l'effort accompli que vous avez fourni pour m'aider !

Bonsoir à tous,

version incluant la règle 3

Bonsoir h2so4,

Je vous remercie aussi !

J'ai juste une remarque par rapport à votre programme (je ne sais pas si elle a des répercussions sur d'autres combinaisons, il est possible. Edit : je pense avoir trouvé ce qui se passe, mais je ne saurais absolument pas le corriger :( )

Connaissant la formule de dénombrement des combinaisons (pour rappel : (k-1)n + (( (k-1)0 + (k-1)1 + ... + (k-1)n-1) )., j'ai remarqué qu'une simulation "k = 4" et "n = 3" donne 39 combinaisons au lieu de 40.

Sauf erreur, en faisant quelques tests, j'ai l'impression que pour k et n définis, il manque à chaque fois la combinaison composée de n chiffres égaux à k-1.

Quelques exemples : quand k = 4 et n = 3 , k-1 = 3 et la combinaison de 3 chiffres égaux à 3 n'existe plus (3 3 3 ne figure plus parmi les combinaisons)

Quand k = 5 et n = 3 , ça n'affiche pas la combinaison "4 4 4"

Quand k = 7 et n = 4, ça n'affiche pas "6 6 6 6"

Etc, à chaque fois il manque juste cette combinaison composée de n chiffres égaux à k-1.

A part ça, ça semble marcher parfaitement !

Bonjour

@h2so4 A tout seigneur tout honneur : Bravo ! Je m'incline !

Bye !

bonjour gmb,

Je m'incline !

ce n'est certainement pas le but recherché pour ce qui me concerne.

@gmb, votre 1ère version du programme que vous avez construit fonctionne parfaitement sur les 30 000 premières lignes. C'est vraiment pas mal, je tiens à le souligner et à vous remercier encore !

@h2so4 : ayant fait encore quelques tests, c'est exactement ça : à chaque fois c'est juste une seule combinaison qui manque (sur la version r1/r2/r3) et c'est bien celle constituée de n chiffres tous égaux à (k-1). En l'état, votre programme est exploitable, il faut juste que j'arrive à me rappeler que je dois rajouter cette ligne en plus !

bonjour,

à chaque fois c'est juste une seule combinaison qui manque (sur la version r1/r2/r3)

une nouvelle version qui corrige ce bug.

Bonjour @h2so4,

Bravo, c'est excellent. Je retrouve à chaque fois toutes les combinaisons et en plus elles sont ordonnées.

Un grand merci à vous !!

Je vous ferai un retour si j'aperçois une coquille, mais je ne pense plus qu'il y en ait, en tout cas c'est super !

Rechercher des sujets similaires à "generer tableau combinaisons lequel ensuite filtre regles"