Sortir les combinaisons pour 4 nombres

Karlito91170

XLDnaute Nouveau
Bonjour chère communauté

Je souhaite mettre en place une macro pour me donner toute les combinaisons possible de 4 nombres (dans un premier temps)
(1 ; 25 ; 55 ; 70 ; 95)
le nombre de possibilités correspond à 5! donc 120 possibilités

(1, 25, 55, 70, 95)
(1; 55, 25, 70, 95)
(etc...

Je pense que cela n'est pas très compliqué cependant mes connaissances en VBA sont limités

Merci d'avance pour votre précieux temps
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Vous pouvez peut être utiliser cette procédure :
VB:
Sub CalcArrang(TR() As Long, ByVal NumA As Long, Optional ByVal NbrÉl As Long)
Dim NbP As Long, N As Long, Z As String, P As Long, NbCou As Long
If NbrÉl = 0 Then NbrÉl = UBound(TR) Else ReDim TR(1 To NbrÉl)
NbP = 1: For N = 1 To NbrÉl: Z = Z & ChrB$(N): NbP = NbP * N: Next N
NumA = NumA Mod NbP
ReDim TR(1 To NbrÉl): NbCou = NbrÉl
For N = 1 To NbrÉl: NbP = NbP \ NbCou: P = NumA \ NbP
   TR(N) = AscB(MidB$(Z, P + 1, 1)): Z = LeftB$(Z, P) & MidB$(Z, P + 2)
   NumA = NumA - P * NbP: NbCou = NbCou - 1: Next N
End Sub
 

Karlito91170

XLDnaute Nouveau
Bonjour.
Vous pouvez peut être utiliser cette procédure :
VB:
Sub CalcArrang(TR() As Long, ByVal NumA As Long, Optional ByVal NbrÉl As Long)
Dim NbP As Long, N As Long, Z As String, P As Long, NbCou As Long
If NbrÉl = 0 Then NbrÉl = UBound(TR) Else ReDim TR(1 To NbrÉl)
NbP = 1: For N = 1 To NbrÉl: Z = Z & ChrB$(N): NbP = NbP * N: Next N
NumA = NumA Mod NbP
ReDim TR(1 To NbrÉl): NbCou = NbrÉl
For N = 1 To NbrÉl: NbP = NbP \ NbCou: P = NumA \ NbP
   TR(N) = AscB(MidB$(Z, P + 1, 1)): Z = LeftB$(Z, P) & MidB$(Z, P + 2)
   NumA = NumA - P * NbP: NbCou = NbCou - 1: Next N
End Sub
Malheureusement cela ne fonctionne pas.
 

Dranreb

XLDnaute Barbatruc
Ah si ! Ah si, elle fonctionne chez moi !
J'ai même une fonction personnalisé pour la tester dans une formule :
VB:
Function Arrang(ByVal NumA As Long, Optional ByVal NbrÉl As Long) As Long()
If NbrÉl = 0 Then NbrÉl = Application.Caller.Columns.Count
CalcArrang Arrang, NumA, NbrÉl
End Function
Dans un groupe de 4 cellules horizontales, validé par Ctrl+Maj+Entrée :
Code:
=Arrang(13)
y affiche le 13ième arrangement possible qui est 3 1 4 2
Après bien sur vous vous débrouillez comme vous voulez pour vous en servir en utilisant les numéros bruts comme indices dans un tableau contenant les vrais numéros, dans votre programmation à vous, dont je ne mêlerai pas tant que vous n'aurez pas joint un classeur.
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour,

J'interviens juste pour préciser le vocabulaire mathématique...

Il s'agit du nombre d'arrangements de 5 nombres parmi 5.

Egal bien sûr au nombre de permutations de 5 nombres.

Surtout ne pas parler de combinaisons, c'est autre chose - il n'y en a qu'une ici !!!

A+
 

Dranreb

XLDnaute Barbatruc
D'accord job75, et bonjour.
Alors je devrai un de ces jour soit renommer ma Sub CalcPermut soit la modifier notamment en y ajoutant un paramètre supplémentaire pour distinguer le nombre de numéros disponibles du nombre de ceux à sortir.
 

job75

XLDnaute Barbatruc
Re Bernard,

Je suis trop vieux pour essayer de comprendre ta macro, je me contente de ce classique :
Code:
Sub Permutations()
Dim a, ub, sep$, r As Range, m, n, o, p, q
a = Array(1, 25, 55, 70, 95) 'tableau modifiable
ub = UBound(a)
sep = ", " 'séparateur, à adapter
Set r = [A1] '1ère cellule remplie, à adapter
For m = 0 To ub
  For n = 0 To ub
    If n = m Then GoTo 1
    For o = 0 To ub
      If o = m Or o = n Then GoTo 2
      For p = 0 To ub
        If p = m Or p = n Or p = o Then GoTo 3
        For q = 0 To ub
          If q = m Or q = n Or q = o Or q = p Then GoTo 4
          r = a(m) & sep & a(n) & sep & a(o) & sep & a(p) & sep & a(q)
          Set r = r(2)
4       Next q
3     Next p
2   Next o
1 Next n
Next m
End Sub
A+
 

Dranreb

XLDnaute Barbatruc
En fait je ne comprends jamais pourquoi tant de demandeurs veulent une liste exhaustive de toutes les combinaisons ou arrangements possibles. Souvent ça donne des listes bien trop importantes pour permettre en un temps raisonnable d'en lire plus qu'une infime partie, alors à quoi ça sert ?
J'en suis fondé à supposer que c'est parce qu'ils veulent ensuite pouvoir en choisir une au hasard.
Seulement pour ça, pas besoin de la liste justement…
 

job75

XLDnaute Barbatruc
Re,
J'en suis fondé à supposer que c'est parce qu'ils veulent ensuite pouvoir en choisir une au hasard.
Seulement pour ça, pas besoin de la liste justement…
En effet :
Code:
Sub TiragePermutation()
Dim a, ub, d As Object
a = Array(1, 25, 55, 70, 95) 'tableau modifiable
ub = UBound(a) + 1
Set d = CreateObject("Scripting.Dictionary")
Randomize
While d.Count < ub: d(a(Int(ub * Rnd))) = "": Wend
a = Join(d.keys, ", ")
MsgBox a 'pour tester
End Sub
A+
 

Dranreb

XLDnaute Barbatruc
Déjà, en effet, d'une part on peut sortir une combinaison au hasard comme ça, mais on peut même écrire comme je l'ai fait une procédure qui se comporte comme si elle détenait la liste des combinaison ou des permutations et qui doit capable d'en produire une de numéro spécifié.
 

coussard

XLDnaute Nouveau
Bonjour, je cherche un code VBA pour :
Combinaison de 4 chiffres compris entre 1 et 30 + 3 chiffres compris entre 1 et 8. Filtre amplitude entre 8 et 21, éviter les suite logique de 4 chiffres, les suites de 3 chiffres ainsi les suites de 2 chiffres (ex 12-13-22-23), exclure les combinaisons toutes dans la meme dizaine. Le + serait également d'éviter les combinaisons toutes pairs/impaires. Pensez vous qu'il soit possible ?
En vous remerciant pour votre réponse,
Gerald
 

job75

XLDnaute Barbatruc
Bonjour coussard, bienvenue sur XLD,

Pourquoi squatter cette discussion qui ne traite pas des combinaisons mais des arrangements ?

Créez votre propre discussion, mais vous risquez de ne pas avoir de réponse car votre problème, bien que tout à fait réalisable, est du genre casse-bonbons.

A+
 

coussard

XLDnaute Nouveau
Bonjour coussard, bienvenue sur XLD,

Pourquoi squatter cette discussion qui ne traite pas des combinaisons mais des arrangements ?

Créez votre propre discussion, mais vous risquez de ne pas avoir de réponse car votre problème, bien que tout à fait réalisable, est du genre casse-bonbons.

A+
Excusez moi, il y a tout de meme un partie combinaison dans le problème du fait des 2 series de combinaison a generer. Ensuite effectivement c'est une partie sur les arrangements et je vous l'accorde volontiers, il s'agit d'un sujet casse-bonbon d'ou ma requête pour de l'aide!
Je vais suivre votre conseil et créer un fil spécifique, merci Job75
 

Discussions similaires

Statistiques des forums

Discussions
312 502
Messages
2 089 033
Membres
104 010
dernier inscrit
Freba