XL 2013 encore un truc chelou

patricktoulon

XLDnaute Barbatruc
Bonjour à tous
j'ai une simple macro qui me permet de faire la liste de toute les combinaisons de 4 nombre sur 10
alors
oui elle fonctionne
oui elle ne me fait pas de doublons
oui elle est rapide

mais il y a un petit soucis
c'est qu'elle ne devrait pas
en effet j' ai 4 boucle imbriquées
chacune démarrant a l'index + 1 de la précédente et allant jusqu'au ubound c'est a dire à 10
arrivé a un moment la boucle a,b,c,d devrait me donner par exemple x 10 10 10 ce qui serait une combinaison erronée bien sur
mais voyez vous elle ne le fait pas
alors par quel miracle vbaistique divinatoire magical évènementiel mon résultat est correct
pour info je contrôle avec une fonction combin qui me donne bien 210 combinaisons possible et mes boucle me donnent la même chose

ais-je raté un épisode ?
VB:
Sub test()
[A:E].ClearContents
Dim tbl, tblFinal(), a&, b, c&, d&
ReDim tblFinal(1 To NbCombi(10, 4), 1 To 4)
tbl = Application.Index(Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 1, 0)
For a = 1 To UBound(tbl)
For b = a + 1 To UBound(tbl)
For c = b + 1 To UBound(tbl)
For d = c + 1 To UBound(tbl)
q = q + 1
'Cells(q, 1).Resize(, 4) = Array(tbl(a), tbl(b), tbl(c), tbl(d))
tblFinal(q, 1) = tbl(a)
tblFinal(q, 2) = tbl(b)
tblFinal(q, 3) = tbl(c)
tblFinal(q, 4) = tbl(d)


Next d, c, b, a
Cells(1, 1).Resize(UBound(tblFinal), 4) = tblFinal

End Sub
Function NbCombi(Base#, N#)
'FORMULE PATRICKTOULON Developpez.com
    NbCombi = WorksheetFunction.Combin(Base, N)    ' avec worksheetfunction
End Function

y a que moi pour venir se plaindre que ça marche bien 🤣 ;) 🤣🤣🤣🤣🤣🤣🤣
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous :),

@patricktoulon :

J'avais commis une fonction assez rapide et paramétrée qui renvoie un tableau comportant les combinaisons P parmi N :
VB:
Function TableauCombiPparmiN(p As Long, n As Long)
Dim i&, Inc&, base&, ncombi&, nres&, k&

   'initialisation
   ReDim Combi&(1 To p)    'tableau de la combinaison en cours d'édition
   ReDim Max&(1 To p)      'tableau des maximums autorisés pour chaque colonne
   ncombi = Application.WorksheetFunction.Combin(n, p)   'nombre de combinaisons (P parmi N)
   ReDim res(1 To ncombi, 1 To p) 'tableau de toutes les combinaisons
   'la première combinaison est (1, 2 , 3, ... , P)
   For i = 1 To p: Combi(i) = i: Next
   'les maximums autorisés par colonnes sont (N-P+1, N-P+2, N-P+3, ... , N-2, N-1, N)
   For i = 0 To p - 1: Max(p - i) = n - i: Next
   'stockage de la première combinaison
   nres = nres + 1: For i = 1 To p: res(nres, i) = Combi(i): Next
 
   'boucle pour les autres combi
   Inc = p     'la colonne à incrémenter est la dernière
   Do
      If Combi(Inc) + 1 > Max(Inc) Then
         'si l'élément de combi en colonne Inc incrémenté de 1
         'dépasse le maximun autorisé, on décrémente Inc
         Inc = Inc - 1
         'si Inc arrive à zéro, on est à la fin de la boucle
         If Inc = 0 Then Exit Do
      Else
         'si l'élément de combi en colonne Inc incrémenté de 1
         'ne dépasse pas le maximun autorisé, on incrémente cet élément
         Combi(Inc) = Combi(Inc) + 1
         'les éléments suivants sont chacun égaux à la somme du précédent + 1
         For i = Inc + 1 To p: Combi(i) = Combi(i - 1) + 1: Next
         'on stocke la nouvelle combinaison
         nres = nres + 1: For i = 1 To p: res(nres, i) = Combi(i): Next
         Inc = p
      End If
   Loop
   TableauCombiPparmiN = res
End Function
 

patricktoulon

XLDnaute Barbatruc
Bonjour patricktoulon,

Ecrire plutôt :
VB:
For a = 1 To UBound(tbl) - 3
For b = a + 1 To UBound(tbl) - 2
For c = b + 1 To UBound(tbl) - 1
For d = c + 1 To UBound(tbl)
mais le résultat sera le même.

A+
oui j'avais écrit comme ça au départ ( car c'est logique) mais par curiosité croyant tomber sur une erreur du genre " indice...." juste pour l'expérience j'ai enlever les limites
je n'ai pas eu d'erreur et les 4 boucles filent et mon résultat est la
étonnant non ?
si la boucle a est a 10 :b=a+1 donc 11 tbl(11) n'existe pas je devrais donc avoir une erreur d'indice

mais non.........
;)
 

mapomme

XLDnaute Barbatruc
Supporter XLD
alors par quel miracle vbaistique divinatoire magical évènementiel mon résultat est correct

y a que moi pour venir se plaindre que ça marche bien 🤣 ;) 🤣🤣🤣🤣🤣🤣🤣


[mode humour]
Çà me rappelle quelque peu l'étude des pièces de Molière.

Extrait du Bourgeois gentilhomme de Molière, scène VI, acte II (adaptation libre) :D
Dans le rôle de Monsieur Jourdain le grand codeur XListe international @patricktoulon et dans celui du Maître de philosophie la modeste pomme.

Monsieur Jourdain
[…] il faut que je vous fasse une confidence.
Je suis amoureux d’une personne de grande qualité, et je souhaiterais que vous m’aidassiez à lui écrire
quelque chose dans un petit programme que je veux laisser tomber dans son classeur.

Le Maître de philosophie
Fort bien.

Monsieur Jourdain
Cela sera galant, oui.

Le Maître de philosophie
Sans doute. Sont-ce des lignes VBA que vous lui voulez écrire ?

Monsieur Jourdain
Non, non ; point de VBA.

Le Maître de philosophie
Vous ne voulez que des formules ?

Monsieur Jourdain
Non, je ne veux ni formule ni VBA.

Le Maître de philosophie
Il faut bien que ce soit l’un ou l’autre.

Monsieur Jourdain
Pourquoi ?

Le Maître de philosophie
Par la raison, monsieur, qu’il n’y a, pour s’exprimer, que les formules ou le VBA.

Monsieur Jourdain
Il n’y a que les formules ou le VBA ?

Le Maître de philosophie
Non, monsieur. Tout ce qui n’est point formule est VBA,
et tout ce qui n’est point VBA est formule.

Monsieur Jourdain
Et comme l’on parle, qu’est-ce que c’est donc que cela ?

Le Maître de philosophie
Du VBA.

Monsieur Jourdain
Quoi ! quand je dis : « Nicole, apportez-moi ma combinaison, et me donnez mon beau programme », c’est du VBA ?

Le Maître de philosophie
Oui, monsieur

Monsieur Jourdain
Par ma foi, il y a plus de quarante ans que je fais du VBA sans que j’en susse rien,
et je vous suis le plus obligé du monde de m’avoir appris cela.
[/mode humour]
 

TooFatBoy

XLDnaute Barbatruc
ok bien vu @TooFatBoy en effet je comprends mieux en effet le step est positif donc elle ne part pas
ok pigé
Merci d'avoir mis ma réponse #9 comme solution, mais en fait c'est pierre-jean en #6 qui, même si je n'avais pas compris ce qu'il voulait dire (d'où ma réponse #9), a donné la solution en premier. ;)



en effet je comprends mieux en effet le step est positif donc elle ne part pas
ok pigé
Oui, tu as tout pigé, c'est exactement ça. 👍
 

patricktoulon

XLDnaute Barbatruc
re
@TooFatBoy
ben tu vois c'est pas pour critiquer bien au contraire
j'ai vu la réponse de pierre jean mais ce qui est arrivé a mon cerveau c'est ce que je savais déjà

toi tu a mis en lumière un truc tout bête qui m'a échappé
c'est le step for i=....
11 to 10 en effet sans step négatif ça décolle pas et il n'y a pas d'erreur effectivement

donc le point te reviens ,je l'ai donc mis a qui de droit
merci a tous
@mapomme je regarde ta fonction qui m'interpelle
 

Discussions similaires

Réponses
11
Affichages
278

Statistiques des forums

Discussions
312 046
Messages
2 084 851
Membres
102 687
dernier inscrit
Biquet78